@ily-validator/solc 5.2.3 → 5.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +99 -99
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var di=Object.defineProperty;var r=(t,e)=>di(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as Jd}from"commander";var Fo="5.2.3";var Ho={name:"@ily-validator/solc",version:Fo,description:"Solana Validator CLI-Customized (Customized SOLV Client)",main:"dist/index.js",type:"module",repository:{type:"git",url:"git+https://github.com/ikaika1/solc.git"},keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],types:"dist/index.d.ts",engines:{node:">=20"},author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},bin:{solc:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",prepublishOnly:"pnpm -s build",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 le=Ho.version;var Ht="https://validators.solutions";var me="solc4.config.json";var ht="identity.json",yt="unstaked-identity.json",jo="relayer-keypair.json",fi="mainnet-validator-keypair.json",hi="mainnet-vote-account-keypair.json",yi="mainnet-authority-keypair.json",Si="testnet-validator-keypair.json",Ti="testnet-vote-account-keypair.json",gi="testnet-authority-keypair.json",C="/home/solv",O=`${C}/${ht}`,Qd=`${C}/${yt}`,K=`${C}/${fi}`,pe=`${C}/${hi}`,Xd=`${C}/${yi}`,L=`${C}/${Si}`,Yo=`${C}/${Ti}`,Zd=`${C}/${gi}`,W=`${C}/solana-validator.log`,q=C+"/start-validator.sh",y="/mnt/ledger",Q="/mnt/accounts",Jo="solana-validator",Bo="agave-validator",Go="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var de=3,zo="https://api.testnet.solana.com",Wo="https://api.mainnet-beta.solana.com",qo="https://verify.validators.solutions/solc-migrate",Qo="https://jup.validators.solutions/v1/jup",co;(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"})(co||(co={}));var Xo=Object.values(co),ue="So11111111111111111111111111111111111111112",fe="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",lo="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Zo="SOLV420",tr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as _i}from"child_process";import{spawnSync as Ei}from"node:child_process";var wi=r(t=>{Ei(`sh -c "$(curl -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),kt=wi;var er="agave-validator",Ai=r(()=>{try{return er}catch(t){return console.error(t),er}},"getSolanaCLI"),b=Ai;var he=r(async t=>{kt(t)},"updateVersion"),mo=r(async(t,e=!1)=>{let o=b(),n=`${o} --ledger ${y} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${y} exit --max-delinquent-stake ${t}`),_i(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Hr from"chalk";var St;(function(t){t.EN="en",t.JA="ja"})(St||(St={}));var or;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(or||(or={}));var rr;(function(t){t.SINGLE="single",t.DOUBLE="double"})(rr||(rr={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var nr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(nr||(nr={}));var sr;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(sr||(sr={}));var ar;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(ar||(ar={}));var ir;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(ir||(ir={}));var ye;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(ye||(ye={}));var Se;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Se||(Se={}));var mr=!1,pr=!0,M={ID:"solc",LANG:St.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},D={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},R={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger"},X={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solc.config.json",JITO_CONFIG:"jito.config.json"},P={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"},v={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"},A=r((t=D.ROOT)=>{let e=t===D.ROOT?D.ROOT:t,o=`${e}/${v.MAINNET_VALIDATOR_KEY}`,n=`${e}/${v.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${v.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${v.TESTNET_VALIDATOR_KEY}`,i=`${e}/${v.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${v.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?`${D.ROOT}/${v.TESTNET_VALIDATOR_KEY}`:`${D.ROOT}/${v.MAINNET_VALIDATOR_KEY}`,o=t?`${D.ROOT}/${v.TESTNET_VALIDATOR_VOTE_KEY}`:`${D.ROOT}/${v.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${D.ROOT}/${X.LOG}`,s=R.ACCOUNTS,a=R.LEDGER,i=`${D.ROOT}/${X.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:i}},"startupScriptPaths");var B="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",po="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",dr="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",ur=9,Z="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",fr="So11111111111111111111111111111111111111112",hr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",cr;(function(t){t[t.ELSOL=Z]="ELSOL",t[t.SOL=fr]="SOL",t[t.USDC=hr]="USDC",t[t.EPCT=yr]="EPCT"})(cr||(cr={}));var lr;(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"})(lr||(lr={}));var fu={[fr]:9,[Z]:9,[hr]:6,[yr]:6},Te="/home/solv/currentEpoch.json",uo=.5,ge="https://api.testnet.solana.com";import{spawnSync as fo}from"child_process";var Sr=r(()=>{fo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;fo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),fo("pnpm add -g @ily-validator/solc",{shell:!0,stdio:"inherit"})},"updateSolv");var tt="3.0.10",et="3.0.10",jt="3.0.10",H="3.0.10",Tr="3.0.10",Tt="3.0.10";var gr="20.19.5";var Er="0.713.30008";var at={version:H,tag:`v${H}-jito`,commissionBps:700,relayerUrl:"http://amsterdam.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://amsterdam.mainnet.block-engine.jito.wtf",shredReceiverAddr:"74.118.140.240:1002"},G={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 Ni}from"child_process";var Ee=r((t=at.tag)=>{Ni(`sh -c "$(curl -sSfL https://release.jito.wtf/${t}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Oi,writeFile as ki}from"fs/promises";import{homedir as vi}from"os";var Yt=r(async t=>{let o=`${vi()}/${X.JITO_CONFIG}`,s={...JSON.parse(await Oi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await ki(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as wr}from"child_process";import Ri from"inquirer";var Ar=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";wr(`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}`;wr(a,{shell:!0,stdio:"inherit"})},"updateCommission"),_r=r(async()=>await Ri.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import Ci from"chalk";import Ii from"inquirer";var Nr=r(async()=>{let t=await Ii.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(Ci.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Li=r(()=>Fo,"getSolvVersion"),vt=Li;import{readFile as Vi,writeFile as $i}from"fs/promises";import{existsAsync as Ki}from"@skeet-framework/utils";var ho;(function(t){t.EN="en",t.JA="ja"})(ho||(ho={}));var Yu=Object.values(ho),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var Or=Object.values(u),T;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(T||(T={}));var kr=Object.values(T),g;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(g||(g={}));var Ju=Object.values(g).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var vr=Object.values($).filter(t=>t!=="none"),ot;(function(t){t.SINGLE="single",t.DOUBLE="double"})(ot||(ot={}));var xi={NETWORK:u.TESTNET,NODE_TYPE:T.RPC,VALIDATOR_TYPE:g.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:ot.SINGLE,TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et,NODE_VERSION:gr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:Go,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Wo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:""},it=xi;import{homedir as bi}from"os";var Di=r(async()=>{let e=`${bi()}/${me}`;return await Ki(e)?JSON.parse(await Vi(e,"utf-8")):(console.log("Creating default config file at",e),await $i(e,JSON.stringify(it,null,2)),it)},"readConfig"),I=Di;import Ui from"node-fetch";var x=r(async t=>{try{let e=await I();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
3
|
-
Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solc Notifier"};return(await Ui(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
|
|
2
|
+
var di=Object.defineProperty;var r=(t,e)=>di(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as jd}from"commander";var Ho="5.2.5";var jo={name:"@ily-validator/solc",version:Ho,description:"Solana Validator CLI-Customized (Customized SOLV Client)",main:"dist/index.js",type:"module",repository:{type:"git",url:"git+https://github.com/ikaika1/solc.git"},keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],types:"dist/index.d.ts",engines:{node:">=20"},author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},bin:{solc:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",prepublishOnly:"pnpm -s build",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 le=jo.version;var Ht="https://validators.solutions";var me="solc4.config.json";var ht="identity.json",yt="unstaked-identity.json",Yo="relayer-keypair.json",fi="mainnet-validator-keypair.json",hi="mainnet-vote-account-keypair.json",yi="mainnet-authority-keypair.json",Si="testnet-validator-keypair.json",Ti="testnet-vote-account-keypair.json",gi="testnet-authority-keypair.json",I="/home/solv",k=`${I}/${ht}`,Wd=`${I}/${yt}`,K=`${I}/${fi}`,pe=`${I}/${hi}`,qd=`${I}/${yi}`,L=`${I}/${Si}`,Bo=`${I}/${Ti}`,Qd=`${I}/${gi}`,W=`${I}/solana-validator.log`,q=I+"/start-validator.sh",y="/mnt/ledger",Q="/mnt/accounts",Jo="solana-validator",Go="agave-validator",zo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var de=3,Wo="https://api.testnet.solana.com",qo="https://api.mainnet-beta.solana.com",Qo="https://verify.validators.solutions/solc-migrate",Xo="https://jup.validators.solutions/v1/jup",ue="https://amsterdam.mainnet.block-engine.jito.wtf",lo;(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"})(lo||(lo={}));var Zo=Object.values(lo),fe="So11111111111111111111111111111111111111112",he="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",mo="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 _i}from"child_process";import{spawnSync as Ei}from"node:child_process";var wi=r(t=>{Ei(`sh -c "$(curl -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),kt=wi;var or="agave-validator",Ai=r(()=>{try{return or}catch(t){return console.error(t),or}},"getSolanaCLI"),b=Ai;var ye=r(async t=>{kt(t)},"updateVersion"),po=r(async(t,e=!1)=>{let o=b(),n=`${o} --ledger ${y} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${y} exit --max-delinquent-stake ${t}`),_i(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import jr from"chalk";var St;(function(t){t.EN="en",t.JA="ja"})(St||(St={}));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 Se;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Se||(Se={}));var Te;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Te||(Te={}));var pr=!1,dr=!0,M={ID:"solc",LANG:St.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},D={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},C={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger"},X={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solc.config.json",JITO_CONFIG:"jito.config.json"},P={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"},A=r((t=D.ROOT)=>{let e=t===D.ROOT?D.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?`${D.ROOT}/${R.TESTNET_VALIDATOR_KEY}`:`${D.ROOT}/${R.MAINNET_VALIDATOR_KEY}`,o=t?`${D.ROOT}/${R.TESTNET_VALIDATOR_VOTE_KEY}`:`${D.ROOT}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${D.ROOT}/${X.LOG}`,s=C.ACCOUNTS,a=C.LEDGER,i=`${D.ROOT}/${X.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:i}},"startupScriptPaths");var J="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",uo="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",ur="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",fr=9,Z="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",hr="So11111111111111111111111111111111111111112",yr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Sr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",lr;(function(t){t[t.ELSOL=Z]="ELSOL",t[t.SOL=hr]="SOL",t[t.USDC=yr]="USDC",t[t.EPCT=Sr]="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 du={[hr]:9,[Z]:9,[yr]:6,[Sr]:6},ge="/home/solv/currentEpoch.json",fo=.5,Ee="https://api.testnet.solana.com";import{spawnSync as ho}from"child_process";var Tr=r(()=>{ho("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;ho(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),ho("pnpm add -g @ily-validator/solc",{shell:!0,stdio:"inherit"})},"updateSolv");var tt="3.0.10",et="3.0.10",jt="3.0.10",H="3.0.10",gr="3.0.10",Tt="3.0.10";var Er="20.19.5";var wr="0.713.30008";var it={version:H,tag:`v${H}-jito`,commissionBps:700,relayerUrl:"http://amsterdam.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://amsterdam.mainnet.block-engine.jito.wtf",shredReceiverAddr:"74.118.140.240:1002"},G={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 Ni}from"child_process";var we=r((t=it.tag)=>{Ni(`sh -c "$(curl -sSfL https://release.jito.wtf/${t}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Oi,writeFile as ki}from"fs/promises";import{homedir as Ri}from"os";var Yt=r(async t=>{let o=`${Ri()}/${X.JITO_CONFIG}`,s={...JSON.parse(await Oi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await ki(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Ar}from"child_process";import vi from"inquirer";var _r=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";Ar(`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}`;Ar(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Nr=r(async()=>await vi.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Bt}from"@skeet-framework/utils";import Ci from"chalk";import Ii from"inquirer";var Or=r(async()=>{let t=await Ii.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Bt("sudo ufw delete allow 8899/udp"),await Bt("sudo ufw delete allow 8899/tcp"),await Bt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Bt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Bt("sudo ufw reload"),console.log(Ci.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Li=r(()=>Ho,"getSolvVersion"),Rt=Li;import{readFile as Vi,writeFile as $i}from"fs/promises";import{existsAsync as Ki}from"@skeet-framework/utils";var yo;(function(t){t.EN="en",t.JA="ja"})(yo||(yo={}));var Hu=Object.values(yo),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var kr=Object.values(u),T;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(T||(T={}));var Rr=Object.values(T),g;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(g||(g={}));var ju=Object.values(g).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var vr=Object.values($).filter(t=>t!=="none"),ot;(function(t){t.SINGLE="single",t.DOUBLE="double"})(ot||(ot={}));var xi={NETWORK:u.TESTNET,NODE_TYPE:T.RPC,VALIDATOR_TYPE:g.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:ot.SINGLE,TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et,NODE_VERSION:Er,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:"",FRANKENDANCER_BLOCK_ENGINE_URL:ue},rt=xi;import{homedir as bi}from"os";var Di=r(async()=>{let e=`${bi()}/${me}`;if(!await Ki(e))return console.log("Creating default config file at",e),await $i(e,JSON.stringify(rt,null,2)),rt;let o=JSON.parse(await Vi(e,"utf-8"));return{...rt,...o}},"readConfig"),v=Di;import Ui from"node-fetch";var x=r(async t=>{try{let e=await v();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
3
|
+
Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solc Notifier"};return(await Ui(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 Ji}from"child_process";import{Connection as Cr}from"@solana/web3.js";var Jt=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(f=>f.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 Mi}from"child_process";var E=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=Mi(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Fi=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),nt=Fi;import{sendDiscord as Hi}from"@skeet-framework/utils";var Ir=60,ji=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=A(),a=E(e?n:o),i=await Jt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Ir){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Ir} minutes!
|
|
4
4
|
Account: ${i.pubkey}
|
|
5
5
|
Reason: ${i.reason}
|
|
6
6
|
Message: Max retries reached, exiting catchup check...
|
|
7
|
-
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Hi(l),!1}console.log("Waiting for validator to catch up..."),await
|
|
7
|
+
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Hi(l),!1}console.log("Waiting for validator to catch up..."),await nt(60*1e3),i=await Jt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Lr=ji;import{spawnSync as Yi}from"node:child_process";var Bi=r(()=>{let{stdout:t}=Yi("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),Ae=Bi;var Gi=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=A(),s=e?o:n,a=Ae(),i=e?pr:dr;i=i&&t.AUTO_RESTART;let c=E(s),l=`=== \u2728 solc updated to the latest version \u2728 ===
|
|
8
8
|
Validator Address: ${c}
|
|
9
|
-
solc Version: ${
|
|
9
|
+
solc Version: ${Rt()}
|
|
10
10
|
Solana Version: ${a}
|
|
11
11
|
Network: ${e?"Mainnet":"Testnet"}
|
|
12
12
|
isNodeRestartRequired: ${i}
|
|
@@ -14,15 +14,15 @@ isNodeRestartRequired: ${i}
|
|
|
14
14
|
Address: ${c}
|
|
15
15
|
This will take a few minutes to catch up...
|
|
16
16
|
\u203B sometimes it may take longer than expected
|
|
17
|
-
`;await x(m);try{
|
|
17
|
+
`;await x(m);try{Ji("solc update -b",{stdio:"inherit",shell:!0})}catch(f){let S=`\u274C Error in restarting the node
|
|
18
18
|
Address: ${c}
|
|
19
19
|
Error: ${f}`;return await x(S),!1}let d=`== \u{1F646} Your Node has been restarted! ==
|
|
20
20
|
Address: ${c}
|
|
21
21
|
Now Catching up... \u{1F69B}\u{1F4A8}
|
|
22
|
-
`;await x(d),await
|
|
22
|
+
`;await x(d),await nt(180*1e3);let p=await Lr(t);if(p){let f=`== \u{1F7E2} Your Node has caught up! ==
|
|
23
23
|
Address: ${c}
|
|
24
24
|
\u2728 Auto Update Completed \u2728
|
|
25
|
-
`;await x(f)}return p}return!0},"autoUpdate"),Lr=Gi;import{homedir as zi}from"os";import{readFile as Wi,writeFile as Pr}from"fs/promises";import{existsAsync as qi}from"@skeet-framework/utils";var k=r(async t=>{let o=`${zi()}/${me}`;await qi(o)||(console.log("Creating default config file at",o),await Pr(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await Wi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Pr(o,a)},"updateDefaultConfig");var Qi={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solc commands",subcmdHelp:"Display help for subcommands",server:"Open solc 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 Solc AA",installer:"Please select an option:",unstake:"UnStake"},Ae=Qi;var Xi={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:"solc \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:"solc \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:"Solc\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:"},xr=Xi;var Zi={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solc installer \u{1F525}",description:"solc is born and ready for running Solana Validator Nodes \u{1F680}"}},_e=Zi;var tc={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 solc \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"}},Vr=tc;var Ne=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Oe=[[],[") 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 $r=[") \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 ec={server:{description:"Open solc 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 Solc AA"}},ke=ec;var oc={server:{description:"Open solc 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 Solc AA"}},br=oc;var ve=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Dr=[") \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 rc=r(t=>{let e={cmds:Ae,subCmds:ke,logs:_e,installer:Ne,installerSub:Oe,clientCmds:ve};switch(t){case St.EN:e={cmds:Ae,subCmds:ke,logs:_e,installer:Ne,installerSub:Oe,clientCmds:ve};break;case St.JA:e={cmds:xr,subCmds:br,logs:Vr,installer:$r,installerSub:Kr,clientCmds:Dr};break;default:e={cmds:Ae,subCmds:ke,logs:_e,installer:Ne,installerSub:Oe,clientCmds:ve}}return e},"readLocale"),Ur=rc;import{existsSync as ic,readFileSync as cc,writeFileSync as Mr}from"fs";import{readFileSync as nc,writeFileSync as sc}from"fs";import{homedir as ac}from"os";var Rt=r(t=>{let o=`${ac()}/${X.CONFIG}`,s={...JSON.parse(nc(o,"utf8")),...t},a=JSON.stringify(s,null,2);sc(o,a)},"updateSolvConfig");import{homedir as lc}from"os";var Fr=r(()=>{let e=`${lc()}/${X.CONFIG}`;ic(e)||(Mr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(cc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Mr(e,JSON.stringify(M,null,2)),o=M}let n=Ur(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,Rt({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,Rt({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",Rt({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var jr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===T.RPC,n=t.VALIDATOR_TYPE===g.JITO,s=e?tt:et;n&&(s=H,e&&(s=jt)),o&&(s=Tt,n&&(s=Tr)),h.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 Solc Config",!1).option("--config","Update Solc Config Default Solana Version",!1).option("--auto","Auto Update",!1).action(async a=>{let i=vt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Hr.white(`Current solc 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===ye.RPC_NODE,p=l.MAINNET_TYPE===Se.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?T.RPC:T.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?ot.DOUBLE:ot.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?g.JITO:m?g.AGAVE:g.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:""};await k(f)}if(a.config){if(await k({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){let l=e?jt:H;await Yt({version:l,tag:`v${l}-jito`})}console.log(Hr.green("\u2714\uFE0F Updated Solc Config Default Solana Version\n\n You can now run `solc i` to install the latest version"));return}if(a.firewall){await Nr();return}if(a.background){let l=a.version;if(await k({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){Ee(),await Yt({version:l,tag:`v${l}-jito`}),await mo(c,!0);return}await he(l),await mo(e?5:5,!0);return}else if(a.commission){let l=await _r();Ar(l.commission,e)}else Sr()})},"updateCommands");import{spawnSync as mc}from"node:child_process";var Yr=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=mc(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(()=>{h.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=>{Yr(t)})},"logCommands");import ct from"chalk";import{spawnSync as pc}from"child_process";import{homedir as dc}from"os";var Re=r(t=>{let e=dc(),o=A(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}`;pc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ce}from"child_process";import{existsSync as Br,readdirSync as uc,rmSync as fc}from"fs";import{homedir as hc}from"os";import Gr from"path";var Ie=r(t=>{let e=[],o=0;t.NODE_TYPE===T.RPC&&(e=[v.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[v.TESTNET_VALIDATOR_KEY,v.TESTNET_VALITATOR_AUTHORITY_KEY,v.TESTNET_VALIDATOR_VOTE_KEY,v.MAINNET_VALIDATOR_KEY,v.MAINNET_VALITATOR_AUTHORITY_KEY,v.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[v.MAINNET_VALIDATOR_KEY,v.MAINNET_VALITATOR_AUTHORITY_KEY,v.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;Ce(n,{shell:!0,stdio:"ignore"});let s=uc("./").filter(l=>l.endsWith("SV.json")),a=hc(),i=Gr.join(a,"unstaked-identity.json");Br(i)&&Ce(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=Gr.join(a,e[c]);if(c++,Br(m)){console.log(`${m} is already exist!`),fc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Ce(d,{shell:!0,stdio:"inherit"})}Ce("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 Wr}from"child_process";var yc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
|
|
25
|
+
`;await x(f)}return p}return!0},"autoUpdate"),Pr=Gi;import{homedir as zi}from"os";import{readFile as Wi,writeFile as xr}from"fs/promises";import{existsAsync as qi}from"@skeet-framework/utils";var _=r(async t=>{let o=`${zi()}/${me}`;await qi(o)||(console.log("Creating default config file at",o),await xr(o,JSON.stringify(rt,null,2)));let s={...JSON.parse(await Wi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await xr(o,a)},"updateDefaultConfig");var Qi={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solc commands",subcmdHelp:"Display help for subcommands",server:"Open solc 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 Solc AA",installer:"Please select an option:",unstake:"UnStake"},_e=Qi;var Xi={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:"solc \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:"solc \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:"Solc\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=Xi;var Zi={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solc installer \u{1F525}",description:"solc is born and ready for running Solana Validator Nodes \u{1F680}"}},Ne=Zi;var tc={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 solc \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=tc;var Oe=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],ke=[[],[") 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 Kr=[") \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"],br=[[],[") \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 ec={server:{description:"Open solc 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 Solc AA"}},Re=ec;var oc={server:{description:"Open solc 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 Solc AA"}},Dr=oc;var ve=[") 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 rc=r(t=>{let e={cmds:_e,subCmds:Re,logs:Ne,installer:Oe,installerSub:ke,clientCmds:ve};switch(t){case St.EN:e={cmds:_e,subCmds:Re,logs:Ne,installer:Oe,installerSub:ke,clientCmds:ve};break;case St.JA:e={cmds:Vr,subCmds:Dr,logs:$r,installer:Kr,installerSub:br,clientCmds:Ur};break;default:e={cmds:_e,subCmds:Re,logs:Ne,installer:Oe,installerSub:ke,clientCmds:ve}}return e},"readLocale"),Mr=rc;import{existsSync as ic,readFileSync as cc,writeFileSync as Fr}from"fs";import{readFileSync as nc,writeFileSync as sc}from"fs";import{homedir as ac}from"os";var vt=r(t=>{let o=`${ac()}/${X.CONFIG}`,s={...JSON.parse(nc(o,"utf8")),...t},a=JSON.stringify(s,null,2);sc(o,a)},"updateSolvConfig");import{homedir as lc}from"os";var Hr=r(()=>{let e=`${lc()}/${X.CONFIG}`;ic(e)||(Fr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(cc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Fr(e,JSON.stringify(M,null,2)),o=M}let n=Mr(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,vt({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,vt({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",vt({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var Yr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===T.RPC,n=t.VALIDATOR_TYPE===g.JITO,s=e?tt:et;n&&(s=H,e&&(s=jt)),o&&(s=Tt,n&&(s=gr)),h.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 Solc Config",!1).option("--config","Update Solc Config Default Solana Version",!1).option("--auto","Auto Update",!1).action(async a=>{let i=Rt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(jr.white(`Current solc version: ${i}`)),a.auto){await Pr(t);return}if(a.migrateConfig){let l=Hr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Se.RPC_NODE,p=l.MAINNET_TYPE===Te.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?T.RPC:T.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?ot.DOUBLE:ot.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?g.JITO:m?g.AGAVE:g.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:""};await _(f)}if(a.config){if(await _({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){let l=e?jt:H;await Yt({version:l,tag:`v${l}-jito`})}console.log(jr.green("\u2714\uFE0F Updated Solc Config Default Solana Version\n\n You can now run `solc i` to install the latest version"));return}if(a.firewall){await Or();return}if(a.background){let l=a.version;if(await _({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){we(),await Yt({version:l,tag:`v${l}-jito`}),await po(c,!0);return}await ye(l),await po(e?5:5,!0);return}else if(a.commission){let l=await Nr();_r(l.commission,e)}else Tr()})},"updateCommands");import{spawnSync as mc}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=mc(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(()=>{h.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 pc}from"child_process";import{homedir as dc}from"os";var Ce=r(t=>{let e=dc(),o=A(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}`;pc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ie}from"child_process";import{existsSync as Gr,readdirSync as uc,rmSync as fc}from"fs";import{homedir as hc}from"os";import zr from"path";var Le=r(t=>{let e=[],o=0;t.NODE_TYPE===T.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}`;Ie(n,{shell:!0,stdio:"ignore"});let s=uc("./").filter(l=>l.endsWith("SV.json")),a=hc(),i=zr.join(a,"unstaked-identity.json");Gr(i)&&Ie(`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!`),fc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Ie(d,{shell:!0,stdio:"inherit"})}Ie("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 yc=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
|
|
|
@@ -37,15 +37,15 @@ Environment=RUST_LOG=info
|
|
|
37
37
|
Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
|
|
38
38
|
|
|
39
39
|
[Install]
|
|
40
|
-
WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),
|
|
40
|
+
WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),Wr=yc;import Sc from"inquirer";import Tc from"chalk";var gc=r(async()=>{let t=await Sc.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);qr(`sudo apt-get install unzip wget -y
|
|
41
41
|
wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
|
|
42
42
|
unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
|
|
43
43
|
chmod +x jupiter-swap-api
|
|
44
|
-
rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=
|
|
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(Tc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
|
|
45
45
|
|
|
46
|
-
$ solc jupiter --help`))},"jupiterAPISetup"),
|
|
46
|
+
$ solc jupiter --help`))},"jupiterAPISetup"),Qr=gc;import{existsAsync as Ec}from"@skeet-framework/utils";import{readFile as wc,writeFile as Xr}from"fs/promises";import{homedir as Ac}from"os";import _c from"path";var gt=r(async()=>{let t=Ac(),e=_c.join(t,X.JITO_CONFIG);await Ec(e)||(await Xr(e,JSON.stringify(it,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await wc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await Xr(e,JSON.stringify(it,null,2)),o=it}return o},"readOrCreateJitoConfig");import{spawnSync as Nc}from"child_process";var Gt=r(()=>{Nc("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Et from"chalk";import Pe from"inquirer";import Oc from"inquirer";var Zr=r(async()=>{let e=Object.keys(G),o=await Oc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=G[n];return{version:it.version,tag:it.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");import kc from"inquirer";var Rc=r(async()=>{let t=Object.keys(G);return(await kc.prompt([{name:"region",type:"list",message:"Select Jito region for Firedancer",choices:t,default:"Amsterdam"}])).region},"askJitoRegion"),tn=Rc;var vc=r(async(t,e)=>(await v()).FRANKENDANCER_BLOCK_ENGINE_URL===t?!1:(await _({FRANKENDANCER_BLOCK_ENGINE_URL:t}),!0),"updateFiredancerBundleUrl"),en=vc;var Cc=r(async()=>{try{let t=g.NONE,e=$.AGAVE,o=rt.COMMISSION,n=!1,s=await Pe.prompt([{name:"network",type:"list",message:"Choose Network",choices:kr,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Rr,default:T.RPC}]);if(s.nodeType===T.VALIDATOR){let c=s.network===u.MAINNET?[g.JITO,g.SOLANA,g.FRANKENDANCER]:[g.AGAVE,g.JITO,g.FRANKENDANCER];t=await Pe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:g.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===T.RPC&&(e=await Pe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:vr,default:$.AGAVE}).then(c=>c.rpcType)),s.nodeType===T.VALIDATOR){let c=await Pe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${rt.COMMISSION}%)'`,default:rt.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===g.JITO){await gt();let l=await Zr();await Yt(l)}else if(t===g.FRANKENDANCER&&s.network===u.MAINNET){let l=await tn(),{BLOCK_ENGINE_URL:m}=G[l],d=await en(m);console.log(d?Et.green(`Updated Firedancer mainnet template URL to ${m} (region: ${l})`):Et.yellow("No change applied to Firedancer mainnet template (URL already set?)"))}}let{network:a,nodeType:i}=s;return console.log(Et.white("Network:",a)),console.log(Et.white("Node Type:",i)),console.log(Et.white("Validator Type:",t)),console.log(Et.white("RPC Type:",e)),i===T.VALIDATOR&&console.log(Et.white("Commission:",o)),await _({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),on=Cc;import{spawnSync as Ic}from"child_process";var zt=r((t=H)=>{let e=`v${t}-jito`;Ic(`sh -c "$(curl -sSfL https://release.jito.wtf/${e}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var rn=r(()=>`#!/bin/bash
|
|
47
47
|
exec agave-validator \\
|
|
48
|
-
--identity ${
|
|
48
|
+
--identity ${k} \\
|
|
49
49
|
--log ${W} \\
|
|
50
50
|
--accounts ${Q} \\
|
|
51
51
|
--ledger ${y} \\
|
|
@@ -81,9 +81,9 @@ exec agave-validator \\
|
|
|
81
81
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
82
82
|
--use-snapshot-archives-at-startup when-newest \\
|
|
83
83
|
--limit-ledger-size 400000000 \\
|
|
84
|
-
`,"startJitoRPCScript");import{existsAsync as
|
|
84
|
+
`,"startJitoRPCScript");import{existsAsync as xc}from"@skeet-framework/utils";import{writeFile as Vc}from"fs/promises";import{spawnSync as Lc}from"node:child_process";var Pc=r(()=>{let t=`sudo chmod +x ${q}`;Lc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Wt=Pc;var nn=r(()=>`#!/bin/bash
|
|
85
85
|
exec agave-validator \\
|
|
86
|
-
--identity ${
|
|
86
|
+
--identity ${k} \\
|
|
87
87
|
--log ${W} \\
|
|
88
88
|
--accounts ${Q} \\
|
|
89
89
|
--ledger ${y} \\
|
|
@@ -116,9 +116,9 @@ exec agave-validator \\
|
|
|
116
116
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
117
117
|
--use-snapshot-archives-at-startup when-newest \\
|
|
118
118
|
--limit-ledger-size 400000000 \\
|
|
119
|
-
`,"startRPCNodeScript");var
|
|
119
|
+
`,"startRPCNodeScript");var $c=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),kt(t.TESTNET_SOLANA_VERSION),o=nn();break;case $.JITO:console.log("JITO RPC Node Setup"),zt(jt),o=rn();break;default:console.log("Unknown RPC Node Setup");break}if(await xc(q)){console.log("Startup script already exists. Skipping...");return}await Vc(q,o,"utf-8"),Wt()},"setupRpcNode"),sn=$c;import{spawnSync as Kc}from"node:child_process";var bc=r(t=>{Kc(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),go=bc;var Eo=r((t=1e3,e,o,n,s="agave-validator")=>`#!/bin/bash
|
|
120
120
|
exec ${s} \\
|
|
121
|
-
--identity ${
|
|
121
|
+
--identity ${k} \\
|
|
122
122
|
--vote-account ${pe} \\
|
|
123
123
|
--authorized-voter ${K} \\
|
|
124
124
|
--log ${W} \\
|
|
@@ -151,7 +151,7 @@ exec ${s} \\
|
|
|
151
151
|
--block-production-method central-scheduler \\
|
|
152
152
|
`,"startJitoValidatorScript");var an=r((t="agave-validator")=>`#!/bin/bash
|
|
153
153
|
exec ${t} \\
|
|
154
|
-
--identity ${
|
|
154
|
+
--identity ${k} \\
|
|
155
155
|
--vote-account ${pe} \\
|
|
156
156
|
--authorized-voter ${K} \\
|
|
157
157
|
--log ${W} \\
|
|
@@ -175,10 +175,10 @@ exec ${t} \\
|
|
|
175
175
|
--use-snapshot-archives-at-startup when-newest \\
|
|
176
176
|
--limit-ledger-size \\
|
|
177
177
|
--block-production-method central-scheduler \\
|
|
178
|
-
`,"startMainnetValidatorScript");var
|
|
178
|
+
`,"startMainnetValidatorScript");var wo=r(()=>`#!/bin/bash
|
|
179
179
|
exec agave-validator \\
|
|
180
|
-
--identity ${
|
|
181
|
-
--vote-account ${
|
|
180
|
+
--identity ${k} \\
|
|
181
|
+
--vote-account ${Bo} \\
|
|
182
182
|
--authorized-voter ${L} \\
|
|
183
183
|
--log ${W} \\
|
|
184
184
|
--accounts ${Q} \\
|
|
@@ -198,13 +198,13 @@ exec agave-validator \\
|
|
|
198
198
|
--use-snapshot-archives-at-startup when-newest \\
|
|
199
199
|
--limit-ledger-size \\
|
|
200
200
|
--block-production-method central-scheduler \\
|
|
201
|
-
`,"startTestnetAgaveValidatorScript");import{existsAsync as cn}from"@skeet-framework/utils";import{writeFile as ln}from"fs/promises";var
|
|
202
|
-
`).slice(1),o=[],n=e.map(p=>p.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c="";for(let p of e){let[f,S,w]=p.trim().split(/\s+/);if(!f||!S)continue;let
|
|
203
|
-
${e} ${
|
|
204
|
-
`,c=[e!==""?a:s],m=
|
|
205
|
-
`)}" | sudo tee -a /etc/fstab`;
|
|
201
|
+
`,"startTestnetAgaveValidatorScript");import{existsAsync as cn}from"@skeet-framework/utils";import{writeFile as ln}from"fs/promises";var Dc=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Uc(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await Mc(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Uc=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case g.SOLANA:go(o),n=an();break;case g.JITO:console.log("JITO Validator Setup for Mainnet");let s=await gt();zt(o||H),n=Eo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await cn(q)){console.log("Startup script already exists. Skipping...");return}await ln(q,n,"utf-8"),Wt()},"setupMainnetValidator"),Mc=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case g.SOLANA:go(t.TESTNET_SOLANA_VERSION),o=wo();case g.AGAVE:console.log("Agave Validator Setup for Testnet"),kt(t.TESTNET_SOLANA_VERSION),o=wo();break;case g.JITO:console.log("JITO Validator Setup for Testnet");let n=await gt();zt(t.TESTNET_SOLANA_VERSION),o=Eo(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Testnet");break}if(await cn(q)){console.log("Startup script already exists. Skipping...");return}await ln(q,o,"utf-8"),Wt()},"setupTestnetValidator"),mn=Dc;import Kn from"chalk";import{execSync as pn}from"node:child_process";function dn(t){try{pn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{pn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(dn,"createDirectoryIfNotExists");var un=r(()=>{try{let t=[C.ACCOUNTS,C.LEDGER];for(let e of t)dn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as Fc}from"child_process";function Hc(){let e=Fc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
|
|
202
|
+
`).slice(1),o=[],n=e.map(p=>p.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c="";for(let p of e){let[f,S,w]=p.trim().split(/\s+/);if(!f||!S)continue;let N=parseInt(S,10);if(isNaN(N))continue;let O=w!==void 0&&w!=="";w==="/"&&(c=f.replace(/[0-9]*$/,""));let z=n.some(V=>V!==f&&V.startsWith(f));N>=400*1024*1024*1024&&o.push({name:f,size:N,mountpoint:w||"",isMounted:O,hasPartition:z})}let l=n.filter(p=>p.startsWith(c)),d=o.filter(p=>!l.includes(p.name)).sort((p,f)=>f.size-p.size);if(d.length>0){let p=d[0];if(p.size>=850*1024*1024*1024&&!p.isMounted&&(s=!0),p.size>=1250*1024*1024*1024&&p.isMounted&&(i=!0),d.length>1){let f=d[1];f.size>=400*1024*1024*1024&&!f.isMounted&&(a=!0)}}return{disks:d,has850GB:s,has400GB:a,hasUsed1250GB:i}}r(Hc,"getPreferredDisks");var qt=Hc;import{spawnSync as fn}from"child_process";var Qt=r(t=>{if(fn(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return fn(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as Ao}from"child_process";var xe=r((t,e="",o=!1)=>{let n=o?C.LEDGER:C.ROOT,s=`${t} ${n} ext4 auto 0 0`,a=`${t} ${C.LEDGER} ext4 auto 0 0
|
|
203
|
+
${e} ${C.ACCOUNTS} ext4 auto 0 0
|
|
204
|
+
`,c=[e!==""?a:s],m=Ao("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,d=[];for(let p of c)m.includes(p)||d.push(p);if(d.length){let p=`echo "${d.join(`
|
|
205
|
+
`)}" | sudo tee -a /etc/fstab`;Ao(p,{shell:!0,encoding:"utf8"}),Ao("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
|
|
206
206
|
${d.join(`
|
|
207
|
-
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as
|
|
207
|
+
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as jc}from"child_process";var hn=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=jc(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Yc=r(async()=>{let t=qt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await _({MNT_DISK_TYPE:ot.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=Qt(o),a=Qt(n),i=s?o:"",c=a?n:"",l=!1;i===""&&c&&(i=c,c="",l=!0),xe(i,c,l)}else if(console.log("Setting up SINGLE DISK..."),await _({MNT_DISK_TYPE:ot.SINGLE}),e.includes("/mnt")){hn(e);let o="/dev/"+t.disks[0].name;Qt(o),xe(o)}else{let o="/dev/"+t.disks[0].name;Qt(o),xe(o)}},"mountDirs"),yn=Yc;import{spawnSync as Bc}from"child_process";var Sn=r(()=>{let t=[`sudo mkdir -p ${C.ROOT}`,`sudo chown -R solc:solc ${C.ROOT}`,`sudo chmod -R 755 ${C.ROOT}`,`sudo mkdir -p ${C.ACCOUNTS}`,`sudo chown -R solc:solc ${C.ACCOUNTS}`,`sudo chmod -R 755 ${C.ACCOUNTS}`,`sudo mkdir -p ${C.LEDGER}`,`sudo chown -R solc:solc ${C.LEDGER}`,`sudo chmod -R 755 ${C.LEDGER}`];for(let e of t)Bc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as Ve}from"child_process";import{existsSync as Jc}from"fs";function Tn(){if(!Jc(P.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
|
|
208
208
|
# Increase UDP buffer sizes
|
|
209
209
|
net.core.rmem_default = 134217728
|
|
210
210
|
net.core.rmem_max = 134217728
|
|
@@ -219,7 +219,7 @@ fs.nr_open = 1000000
|
|
|
219
219
|
`,e=`
|
|
220
220
|
# Increase process file descriptor count limit
|
|
221
221
|
* - nofile 1000000
|
|
222
|
-
`;
|
|
222
|
+
`;Ve(`echo "${t}" | sudo tee ${P.SOL_SYSTEM_CONFIG21} > /dev/null`),Ve(`sudo sysctl -p ${P.SOL_SYSTEM_CONFIG21}`),Ve(`echo "DefaultLimitNOFILE=1000000" | sudo tee -a ${P.SOL_SYSTEM_CONF}`),Ve(`echo "${e}" | sudo tee ${P.SOL_NOFILES_CONF} > /dev/null`)}}r(Tn,"setupSystemd");var gn=r((t=M.USERNAME)=>{let{log:e}=pt();return`${e} {
|
|
223
223
|
su ${t} ${t}
|
|
224
224
|
daily
|
|
225
225
|
rotate 1
|
|
@@ -230,7 +230,7 @@ fs.nr_open = 1000000
|
|
|
230
230
|
systemctl kill -s USR1 solv.service
|
|
231
231
|
endscript
|
|
232
232
|
}
|
|
233
|
-
`},"logRotates");import{existsSync as
|
|
233
|
+
`},"logRotates");import{existsSync as Gc}from"fs";import{execSync as zc}from"child_process";function En(){if(console.log("Creating logrotate configuration for solana"),Gc(P.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let t=gn();zc(`echo "${t}" | sudo tee ${P.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(En,"setupLogrotate");var Wc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",qc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",Qc=`/home/${M.USERNAME}/.local/share/solana/install/active_release/bin`,wn=r((t=!0)=>{let{scriptPath:e}=pt(t),o=t?qc:Wc,n=Qc;return`[Unit]
|
|
234
234
|
Description=Solana Validator
|
|
235
235
|
After=network.target
|
|
236
236
|
StartLimitIntervalSec=0
|
|
@@ -250,7 +250,7 @@ ExecStart=${e}
|
|
|
250
250
|
|
|
251
251
|
|
|
252
252
|
[Install]
|
|
253
|
-
WantedBy=multi-user.target`},"solvService");import{execSync as
|
|
253
|
+
WantedBy=multi-user.target`},"solvService");import{execSync as Xc}from"child_process";function An(t=!0){console.log("Creating solvService configuration for solana");let e=wn(t);Xc(`echo "${e}" | sudo tee ${P.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(An,"setupSolvService");var _n=r((t=!0)=>{En(),An(t),Tn()},"makeServices");import{spawnSync as _o}from"node:child_process";var Nn=r(t=>{try{Le(t);let e=t.NETWORK;return e===u.TESTNET?(_o(`solana config set --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"}),_o(`solana airdrop 1 --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"})):_o(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==T.RPC&&Ce(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as On}from"node:child_process";var $e=r((t=!1)=>{try{if(t){let o=["aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger ","https://snapshots.avorio.network/testnet/snapshot.tar.bz2","https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2"].join(" ");On(o,{shell:!0,stdio:"inherit"});return}let e=["sudo apt-get update && sudo apt-get install -y aria2","&&","aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger","https://snapshots.avorio.network/mainnet-beta/snapshot.tar.bz2","https://snapshots.avorio.network/mainnet-beta/incremental-snapshot.tar.bz2"].join(" ");On(e,{shell:!0,stdio:"inherit"})}catch(e){throw new Error(`getSnapshot Error: ${e}`)}},"getSnapshot");import{spawnSync as Zc}from"node:child_process";var Ke=r(t=>{let o=`sudo systemctl start ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;Zc(o,{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as tl}from"node:child_process";var el=r(()=>{try{tl('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),kn=el;import No from"fs";import{promisify as vn}from"util";import{execSync as Rn}from"child_process";var ol=vn(No.readFile),rl=vn(No.access),be="/etc/sysctl.conf",nl=`# set default and maximum socket buffer sizes to 128MB
|
|
254
254
|
net.core.rmem_default=134217728
|
|
255
255
|
net.core.wmem_default=134217728
|
|
256
256
|
net.core.rmem_max=134217728
|
|
@@ -261,23 +261,23 @@ net.ipv4.tcp_rmem=10240 87380 134217728
|
|
|
261
261
|
net.ipv4.tcp_wmem=10240 87380 134217728
|
|
262
262
|
|
|
263
263
|
# Enable TCP westwood for kernels greater than or equal to 2.6.13
|
|
264
|
-
net.ipv4.tcp_congestion_control=westwood`;async function
|
|
265
|
-
${
|
|
266
|
-
`,
|
|
264
|
+
net.ipv4.tcp_congestion_control=westwood`;async function sl(){try{await rl(be,No.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${be} does not exist`)}try{let t=await ol(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+=`
|
|
265
|
+
${nl}
|
|
266
|
+
`,Rn(`echo "${e}" | sudo tee ${be} > /dev/null`),Rn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(sl,"updateSysctlConfig");var Cn=sl;import{spawnSync as al}from"child_process";var In=r(()=>{al("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as il}from"node:child_process";var Ln=r(()=>{il("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Pn}from"child_process";var xn=r((t=!1,e=!1)=>{t?ll():cl(e)},"createSymLink"),cl=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"),ll=r(()=>{Pn("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import De from"chalk";var ml=r(()=>{let t=`${De.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${De.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
|
|
267
267
|
|
|
268
268
|
We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
|
|
269
269
|
It's our way of supporting the community and empowering you with fast, reliable connections.
|
|
270
270
|
|
|
271
271
|
To get your free API key, simply join us through the link below:
|
|
272
272
|
|
|
273
|
-
Validators DAO: ${
|
|
273
|
+
Validators DAO: ${De.white("`https://discord.gg/X4BgkBHavp`")}
|
|
274
274
|
|
|
275
275
|
Unlock fast connections and elevate your experience with your very own API key \u{1F680}
|
|
276
|
-
`;console.log(
|
|
276
|
+
`;console.log(De.cyan(e))},"rpcLog"),wt=ml;import{spawnSync as st}from"child_process";var pl=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
|
|
277
277
|
sudo chmod -R 700 /mnt
|
|
278
278
|
sudo fdctl configure init all --config /home/solv/firedancer/config.toml
|
|
279
279
|
sudo chown -R solv:solv /mnt
|
|
280
|
-
sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Vn=
|
|
280
|
+
sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Vn=pl;var dl=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
|
|
281
281
|
Description=Firedancer Solana
|
|
282
282
|
After=network.target
|
|
283
283
|
StartLimitIntervalSec=0
|
|
@@ -293,7 +293,7 @@ ExecStart=/home/solv/start-firedancer.sh
|
|
|
293
293
|
|
|
294
294
|
[Install]
|
|
295
295
|
WantedBy=multi-user.target
|
|
296
|
-
`}),"firedancerService"),$n=
|
|
296
|
+
`}),"firedancerService"),$n=dl;var ul=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "solv"
|
|
297
297
|
user = "solv"
|
|
298
298
|
scratch_directory = "/home/{user}"
|
|
299
299
|
dynamic_port_range = "8900-9000"
|
|
@@ -365,7 +365,7 @@ dynamic_port_range = "8900-9000"
|
|
|
365
365
|
tip_distribution_authority = "GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib"
|
|
366
366
|
commission_bps = 1000
|
|
367
367
|
|
|
368
|
-
`}),"configToml"),
|
|
368
|
+
`}),"configToml"),Ue=ul;var fl=r((t={})=>{let e="/home/solv/firedancer/config.toml",n=`name = "solv"
|
|
369
369
|
user = "solv"
|
|
370
370
|
scratch_directory = "/home/solv"
|
|
371
371
|
dynamic_port_range = "8100-8120"
|
|
@@ -456,20 +456,20 @@ dynamic_port_range = "8100-8120"
|
|
|
456
456
|
|
|
457
457
|
[tiles.bundle]
|
|
458
458
|
enabled = true
|
|
459
|
-
url = "
|
|
459
|
+
url = "${t.blockEngineUrl||ue}"
|
|
460
460
|
tip_distribution_program_addr = "4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7"
|
|
461
461
|
tip_payment_program_addr = "T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt"
|
|
462
462
|
tip_distribution_authority = "GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib"
|
|
463
463
|
commission_bps = 1000
|
|
464
464
|
|
|
465
465
|
[net]
|
|
466
|
-
provider = "xdp"
|
|
466
|
+
provider = "xdp"`;return{filePath:e,body:n}},"configTomlMainnet"),Me=fl;var hl=r(async()=>{st("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),st(`git checkout v${wr}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("./deps.sh",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let{filePath:t,body:e}=Vn();st(`sudo tee ${t} > /dev/null << 'EOF'
|
|
467
467
|
${e}
|
|
468
|
-
EOF`,{shell:!0,stdio:"inherit"}),
|
|
468
|
+
EOF`,{shell:!0,stdio:"inherit"}),st(`sudo chmod +x ${t}`,{shell:!0,stdio:"inherit"});let o=$n();st(`sudo tee ${o.filePath} > /dev/null << 'EOF'
|
|
469
469
|
${o.body}
|
|
470
|
-
EOF`,{shell:!0,stdio:"inherit"}),
|
|
470
|
+
EOF`,{shell:!0,stdio:"inherit"}),st("sudo systemctl daemon-reload",{shell:!0});let n=await v(),s=n.NETWORK===u.MAINNET?Me({blockEngineUrl:n.FRANKENDANCER_BLOCK_ENGINE_URL}):Ue();st(`sudo tee ${s.filePath} > /dev/null << 'EOF'
|
|
471
471
|
${s.body}
|
|
472
|
-
EOF`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),
|
|
472
|
+
EOF`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),Fe=hl;var bn=r(async(t=!1,e=!1)=>{try{t||(console.log(Kn.white("\u{1F7E2} Initializing Setup")),await v(),await on());let o=await v(),n=o.NETWORK===u.TESTNET;switch(un(),e||yn(),_n(n),In(),kn(),await Cn(),Nn(o),xn(o.IS_DUMMY,n),o.NODE_TYPE){case T.RPC:await sn(o);break;case T.VALIDATOR:await mn(o),o.VALIDATOR_TYPE===g.FRANKENDANCER&&await Fe();break;default:throw new Error("Unknown Node Type")}Sn(),Gt(),o.VALIDATOR_TYPE!==g.FRANKENDANCER&&(Ln(),$e(n)),Ke(o),console.log(Kn.white("\u{1F7E2} Setup Completed")),wt()}catch(o){throw new Error(`Setup Error: ${o.message}`)}},"setupV2");var Dn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
|
|
473
473
|
[Unit]
|
|
474
474
|
Description=Solana transaction relayer
|
|
475
475
|
Requires=network-online.target
|
|
@@ -518,22 +518,22 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
|
|
|
518
518
|
ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer --keypair-path=/home/solv/relayer-keypair.json --signing-key-pem-path=/home/solv/private.pem --verifying-key-pem-path=/home/solv/public.pem --forward-all
|
|
519
519
|
|
|
520
520
|
[Install]
|
|
521
|
-
WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as
|
|
521
|
+
WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as He,spawnSync as dt}from"child_process";var Mn=r(async(t,e=!0)=>{dt("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),dt("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),dt("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),dt("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),dt("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),dt("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?Dn(t):Un(t);He(`echo "${n}" | sudo tee ${o} > /dev/null`),dt("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),dt("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),He("sudo ufw allow 11228",{stdio:"inherit"}),He("sudo ufw allow 11229",{stdio:"inherit"}),He("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as Oo}from"node:child_process";var yl=r(t=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:t},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),Fn=yl;import{spawnSync as Sl}from"node:child_process";import{readFile as Tl,writeFile as gl}from"fs/promises";var El=r(async()=>{let t="/home/solv/start-validator.sh",o=(await Tl(t,"utf-8")).split(`
|
|
522
522
|
`);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
|
|
523
|
-
`);await
|
|
524
|
-
|
|
525
|
-
$ solc relayer --help`)),Gt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await
|
|
526
|
-
`).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)=>At(a.Avail)-At(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&At(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&At(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&At(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/")&&At(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import
|
|
527
|
-
`)),console.log(
|
|
528
|
-
`)),console.error(
|
|
529
|
-
`).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"),
|
|
530
|
-
Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)
|
|
523
|
+
`);await gl(t,n),Sl(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Hn=El;import wl from"inquirer";import{writeFile as Al}from"node:fs/promises";var jn=r(async()=>{let e=(await wl.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";Oo(o,{shell:!0,stdio:"inherit"}),Oo(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),Oo(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Fn(e),c=JSON.stringify(i,null,2);await Al(a,c,{encoding:"utf8"}),await Hn()},"yellowstoneGeyser");var Yn=r(t=>{h.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).action(async e=>{try{if(e.vote)console.log(ct.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ce(t),process.exit(0);else if(e.key)console.log(ct.white("\u{1F511} Setting up Validator Keypairs ...")),Le(t),process.exit(0);else if(e.relayer){console.log(ct.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await gt()).blockEngineUrl;await Mn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
|
|
524
|
+
|
|
525
|
+
$ solc relayer --help`)),Gt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Qr(),Gt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await jn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await Fe();return}await bn(e.skipInitConfig,e.skipMount)}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 _l}from"child_process";var ko=r(()=>{let o=_l("df -h").toString().split(`
|
|
526
|
+
`).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)=>At(a.Avail)-At(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&At(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&At(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&At(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/")&&At(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import Bn from"chalk";import Nl from"cli-table3";var Ro=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>Bn.blue(n)),o=new Nl({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()=>{h.command("df").description("Disk Free Command").action(()=>{let t=ko();Ro(t)})},"dfCommands"),At=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=>{h.command("start").description("Start Solana Validator").action(()=>{Ke(t),process.exit(0)})},"startCommand");import{spawnSync as Ol}from"node:child_process";var zn=r((t,e={})=>{let o=t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer.service":"solv.service",s=`sudo systemctl stop ${e.service??o}`;e.debug&&console.log(`[solc] stop -> ${s}`),Ol(s,{shell:!0,stdio:"inherit"})},"stopSolana");var Wn=r(t=>{h.command("stop").description("Stop Solana Validator").option("-s, --service <service>","systemd service name to stop").option("--debug","Print executed command").action(e=>{zn(t,e),process.exit(0)})},"stopCommand");import{spawnSync as Xt}from"node:child_process";import qn from"chalk";var Qn=r(t=>{let e=b();h.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...")),Xt("solc stop",{stdio:"inherit",shell:!0}),Xt("solc rm:snapshot",{stdio:"inherit",shell:!0}),Xt("solc get snapshot",{stdio:"inherit",shell:!0}),Xt("solc start",{stdio:"inherit",shell:!0}),console.log(qn.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${y} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;Xt(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Xn=r(t=>{let o=t.NETWORK===u.TESTNET?tt:et;t.NODE_TYPE===T.RPC&&(o=Tt),h.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===g.JITO){let l=`v${n.version||H}-jito`;we(l);return}t.NODE_TYPE===T.RPC&&(o=Tt);let i=n.version||o;await ye(i)})},"installCommands");import{spawnSync as kl}from"child_process";var Zn=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{kl("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=qt();console.log(t)})},"mountCommands");import{spawnSync as Cl}from"node:child_process";import ts from"chalk";import{spawnSync as Rl}from"child_process";var vl=r(async()=>{try{let t=Rl("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("solc epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),je=vl;var es=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solc Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await je()&&(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 && solc epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;Cl(n,{shell:!0,stdio:"inherit"}),console.log(ts.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var Zt={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 Ll,mkdirSync as Pl}from"fs";import xl from"inquirer";import{homedir as Vl}from"os";import{spawnSync as Il}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 Il(s,{shell:!0,stdio:"inherit"}).status===0}r(os,"executeSCP");var vo=r(async(t="")=>{let e=t;t===""&&(e=(await xl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(A()),n=Vl(),s=n.includes("/home/solv")?"/home/solv":n+Zt.SOLV_KEYPAIR_DOWNLOAD_PATH;Ll(s)||Pl(s,{recursive:!0});let a=!0,i=n+"/"+Yo;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 $l}from"child_process";import{existsSync as Kl}from"fs";import bl from"inquirer";import Dl from"os";var rs=r(async(t="")=>{let e=Dl.userInfo().homedir,o=t;t===""&&(o=(await bl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${Zt.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=Zt.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(A(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(!Kl(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;$l(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Ul}from"child_process";import Ml from"inquirer";var ns=r(async()=>{let t=await Ml.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${D.ROOT}/.ssh && echo "${t.pubkey}" >> ${D.AUTHORIZED_KEYS}`;Ul(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Ye from"chalk";import{readFileSync as Fl}from"fs";import Hl from"os";var ss=r(()=>{try{let e=`${Hl.userInfo().homedir}/.ssh/id_rsa.pub`,o=Fl(e,"utf8");console.log(Ye.white(`Your SSH Public Key is:
|
|
527
|
+
`)),console.log(Ye.white(o))}catch(t){console.error(Ye.white(`Error reading SSH Public Key
|
|
528
|
+
`)),console.error(Ye.white(t))}},"cat");import{spawnSync as jl}from"child_process";var as=r(()=>{jl("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Yl}from"child_process";import{readFileSync as Bl}from"fs";import{Readable as Jl}from"stream";var is=r(async t=>new Promise((e,o)=>{try{let n=Yl("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
|
|
529
|
+
`).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"),Gl=r(t=>{try{return JSON.parse(Bl(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),cs=r(async(t,e)=>{let o=[],n=Jl.from(t);return n.on("data",async s=>{Gl(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import Be from"chalk";import{Presets as Ql,SingleBar as Xl}from"cli-progress";import ls from"chalk";import{spawnSync as zl}from"node:child_process";import Wl from"node-fetch";var ql=r(async()=>{let t=await Wl(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.
|
|
530
|
+
Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)zl(o,{shell:!0,stdio:"ignore"});return console.log(ls.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),ms=ql;var ps=r(()=>{let t=h.command("scp").description("Scp Commands").argument("<cmd>");t.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await vo(e.ip);return}await vo()}),t.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await ms();return}await rs(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await ns()}),t.command("cat").description("Show SSH Public Key").action(()=>{ss()}),t.command("init").description("Init SSH Key Pair").action(()=>{as()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Xl({},Ql.shades_classic);e.start(1e4,0);let o=await is(e),n=await cs(o,e);e.stop(),console.log(Be.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(Be.green(`
|
|
531
531
|
${n.join(`
|
|
532
|
-
`)}`)),console.log(
|
|
532
|
+
`)}`)),console.log(Be.white(`
|
|
533
533
|
Only showing the first 10 results
|
|
534
534
|
|
|
535
|
-
`)),console.log(
|
|
536
|
-
`).filter(a=>a.includes(".json")),e=
|
|
535
|
+
`)),console.log(Be.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Zl}from"child_process";var ds=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{tm(t)})},"statusCommands"),tm=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;Zl(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as em}from"node:child_process";var us=r(async(t,e)=>{try{let o=await v(),n=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===T.RPC?o.RPC_URL:n?u.TESTNET:o.RPC_URL,c=[`solana delegate-stake ${t} ${e} --stake-authority ${n?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${a}`];return em(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import hs from"inquirer";import{spawnSync as om}from"node:child_process";var fs=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=om(`solana create-stake-account ${t} ${e}`,{shell:!0,stdio:"pipe"}),a=s.stdout.toString()+s.stderr.toString();if(a.includes("Signature:"))return console.log("Stake account created successfully:",a),!0;if(a.includes("Error:"))console.log("Error encountered:",a),n++,console.log(`Retrying... (${n}/${o})`);else{console.log("Unknown output:",a);break}n===o&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as rm,existsAsync as nm}from"@skeet-framework/utils";import{execSync as sm,spawnSync as Ge}from"node:child_process";import am from"node:os";var ys=r(async t=>{let e=t.NETWORK===u.TESTNET;if(!(await hs.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;Ge(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await hs.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await cm(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return vt({STAKE_ACCOUNT:l}),fs(i,Number(s.solAmount))},"stakeAccountQuestion"),im=am.userInfo().homedir,Je=im+"/stake-account",cm=r(async()=>{await nm(Je)||Ge(`mkdir -p ${Je}`,{shell:!0});let t=Ge(`ls ${Je}`,{shell:!0}).stdout.toString().split(`
|
|
536
|
+
`).filter(a=>a.includes(".json")),e=rm(t.length+1),o=`${Je}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return Ge(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:sm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as lm}from"node:child_process";var Ss=r(async t=>{try{let o=(await v()).NETWORK===u.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return lm(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as mm}from"node:child_process";var Ts=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return mm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import Pt from"chalk";import{Connection as pm,PublicKey as dm}from"@solana/web3.js";import{stakePoolInfo as um}from"@solana/spl-stake-pool";var ze=r(async(t,e=J)=>{try{let o=new pm(t),n=new dm(e);return await um(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as fm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as hm}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as ym}from"@metaplex-foundation/umi";var gs=r(async(t,e)=>{try{let o=ym(e);console.log(`mintPubkey: ${o}`);let n=hm(t),s=await fm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import te from"chalk";import Es from"inquirer";var ws=r(async t=>{let e=await Es.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:J}]);try{let o=await ze(t,e.stakePoolAddress);if(!o)return console.log(te.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
|
|
537
537
|
Please check the correct address and try again.
|
|
538
538
|
`)),console.log(te.white(`For stake pool information
|
|
539
539
|
\u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await gs(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
|
|
@@ -542,18 +542,18 @@ Token Mint: ${a.mint}`;return(await Es.prompt([{type:"confirm",name:"confirm",me
|
|
|
542
542
|
Is this the correct Stake Pool?`}])).confirm?a:(console.log(te.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(te.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
|
|
543
543
|
Please check the correct address and try again.
|
|
544
544
|
`)),console.log(te.white(`For stake pool information
|
|
545
|
-
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as
|
|
545
|
+
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Cm}from"fs/promises";import re from"inquirer";import{existsAsync as Im}from"@skeet-framework/utils";import{Connection as ks,Keypair as Nm,PublicKey as oe}from"@solana/web3.js";import{Connection as Sm,PublicKey as Tm,Keypair as gm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Em}from"@solana/spl-token";var ee=r(async(t,e,o,n,s=!1)=>{try{let a=gm.fromSecretKey(new Uint8Array(e)),i=new Tm(o),c=new Sm(t);return(await Em(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 Om}from"cli-spinner";import _t from"chalk";import{PublicKey as _s,Keypair as Ns,Transaction as As,ComputeBudgetProgram as wm,LAMPORTS_PER_SOL as Am}from"@solana/web3.js";import*as Os from"@solana/spl-stake-pool";var Ct=r(async(t,e,o,n=new _s(J),s,a,i)=>{try{let c=Ns.fromSecretKey(new Uint8Array(e)),l=o*Am,{instructions:m,signers:d}=await _m(t,e,l,n,s,a,i),p=new As().add(...m);p.feePayer=c.publicKey;let f=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=f.value.blockhash,p.sign(...d,c);let S=new As().add(...m).add(wm.setComputeUnitPrice({microLamports:1e3}));S.feePayer=c.publicKey,S.recentBlockhash=f.value.blockhash,S.sign(...d,c);let w=await t.sendRawTransaction(S.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...f.value,signature:w},"finalized"),{status:"success",signature:w}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),_m=r(async(t,e,o,n=new _s(J),s,a,i)=>{let l=Ns.fromSecretKey(new Uint8Array(e)).publicKey;return await Os.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Rs}from"@skeet-framework/utils";var We=r(async(t,e,o,n)=>{console.log(_t.white("Solana RPC URL:",t));let s=new ks(t);o===0&&(o=await qe());let a=new Om("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(_t.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new oe(e),c=Nm.fromSecretKey(new Uint8Array(n)),l=Z;a.setSpinnerTitle(_t.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await ee(t,n,l,c.publicKey);await Rs(1e3),a.setSpinnerTitle(_t.green("\u{1F504} Converting SOL to elSOL"));let d=await Ct(s,n,o,i,new oe(m),new oe(uo),c.publicKey),p=0;for(;d.status!=="success";){if(p++,p>10)return a.stop(!0),console.log(_t.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(_t.yellow(`\u23F3 ${p} Times Retrying...`)),await Rs(3e3),s=new ks(t),d=await Ct(s,n,o,i,new oe(m),new oe(uo),c.publicKey)}return a.stop(!0),console.log(_t.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
|
|
546
546
|
|
|
547
|
-
Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as
|
|
548
|
-
`)),await
|
|
547
|
+
Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as km,Keypair as Rm,PublicKey as It}from"@solana/web3.js";import{Spinner as vm}from"cli-spinner";import Lt from"chalk";import{sleep as vs}from"@skeet-framework/utils";var Cs=r(async(t,e,o,n,s)=>{let a=new km(t);o===0&&(o=await qe());let i=new vm("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Lt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new It(e),l=await ze(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Lt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=Rm.fromSecretKey(new Uint8Array(n)),p=await ee(t,n,m,d.publicKey),f=await ee(t,n,m,new It(ur),!0);await vs(1e3),i.setSpinnerTitle(Lt.green(`\u{1F504} Converting SOL to ${s}`));let S=await Ct(a,n,o,c,new It(p),new It(f),d.publicKey),w=0;for(;S.status!=="success";){if(w++,w>10)return i.stop(!0),console.log(Lt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Lt.yellow(`\u23F3 ${w} Times Retrying...
|
|
548
|
+
`)),await vs(1e3),S=await Ct(a,n,o,c,new It(p),new It(f),d.publicKey)}return i.stop(!0),console.log(Lt.white(`\u{1F4B0} You've got ${s} \u2728
|
|
549
549
|
|
|
550
|
-
Signature:`,S.signature)),!0},"depositeLST");import{execSync as
|
|
551
|
-
`)),console.log(Pt.white(i));return}let c=JSON.parse(await
|
|
550
|
+
Signature:`,S.signature)),!0},"depositeLST");import{execSync as Qe}from"node:child_process";import{homedir as Lm}from"os";var Is=r(t=>{h.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=J,s=t.NETWORK===u.TESTNET,a=Lm(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(Qe(`solana config set --keypair ${i}`),!await Im(i)){console.log(Pt.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
|
|
551
|
+
`)),console.log(Pt.white(i));return}let c=JSON.parse(await Cm(i,"utf-8"));if(e.elsol){await We(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await ws(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Cs(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await ys(t))return;let m=await v(),{validatorVoteAccount:d,stakeAccounts:p}=await xm(m);for await(let f of p)try{await us(f,d)}catch{console.log(Pt.yellow(`Network might be busy, please try again later
|
|
552
552
|
You can use a custom RPC endpoint to avoid this issue
|
|
553
|
-
`))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await
|
|
553
|
+
`))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await $m();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Pm();for await(let n of o)try{await Ss(n)}catch{console.log(Pt.yellow(`Network might be busy, please try again later
|
|
554
554
|
You can use a custom RPC endpoint to avoid this issue
|
|
555
|
-
`))}}else{let o=await
|
|
556
|
-
\u{1F4B0} Account Balance:`,e+" SOL")),console.log(Pt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await re.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),
|
|
555
|
+
`))}}else{let o=await Km();await Ts(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),qe=r(async()=>{let t=Qe("solana address").toString().trim(),e=Qe("solana balance").toString().replace("SOL","").trim();console.log(Pt.white(`\u{1F4D7} Selected Wallet: ${t}
|
|
556
|
+
\u{1F4B0} Account Balance:`,e+" SOL")),console.log(Pt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await re.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Pm=r(async()=>{let t=await v();return await re.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),xm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Vm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await re.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"),Vm=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"),$m=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await re.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Km=r(async()=>{let t=(await v()).STAKE_ACCOUNTS;return await re.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 bm}from"child_process";var Ls=r(()=>{try{return bm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as Dm}from"child_process";var Ps=r(()=>{try{return Dm("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 Um}from"cli-spinner";var xt;(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 Um(lt.white(e)+` %s
|
|
557
557
|
`);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(`
|
|
558
558
|
${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
|
|
559
559
|
`),console.log(`Solc Version: v${le}
|
|
@@ -577,11 +577,11 @@ $ solc mt -p <fileSystem>
|
|
|
577
577
|
$ solc umt -p <fileSystem>
|
|
578
578
|
`,s=`mount reload
|
|
579
579
|
$ solc mtr
|
|
580
|
-
`;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(xt||(xt={}));import Vt from"chalk";import{spawnSync as
|
|
580
|
+
`;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(xt||(xt={}));import Vt from"chalk";import{spawnSync as Mm}from"node:child_process";var Xe=r(()=>{Mm("solana config get",{shell:!0,stdio:"inherit"});let e=pt();console.log(Vt.white("start-validator.sh: ")+e.scriptPath),console.log(Vt.white("service unit: ")+P.SOL_SERVICE),console.log(Vt.white("logrotate: ")+P.SOL_LOGROTATE),console.log(Vt.white("sysctl.d: ")+P.SOL_SYSTEM_CONFIG21),console.log(Vt.white("limits.d: ")+P.SOL_NOFILES_CONF),console.log(Vt.white("system.conf: ")+P.SOL_SYSTEM_CONF)},"showConfig");import{spawnSync as Fm}from"node:child_process";import Hm from"chalk";var xs=r(t=>{let{minDownloadSpeed:e,maxLatency:o,snapshotPath:n}=t;try{console.log(Hm.white("\u{1F50E} Running solana-snapshot-finder..."));let s=["rm -rf solana-snapshot-finder","git clone https://github.com/ikaika1/solana-snapshot-finder.git","sudo apt-get update","sudo apt-get install -y python3-venv git","cd solana-snapshot-finder","python3 -m venv venv",'bash -lc "source ./venv/bin/activate && pip3 install -r requirements.txt"',`bash -lc "source ./venv/bin/activate && python3 snapshot-finder.py --min_download_speed ${e} --max_latency ${o} --snapshot_path ${n}"`].join(" && ");Fm(s,{shell:!0,stdio:"inherit"})}catch(s){throw new Error(`runSnapshotFinder Error: ${s}`)}},"runSnapshotFinder");import{spawnSync as Vs}from"node:child_process";import jm from"chalk";var $s=r(t=>{let e=t.NETWORK===u.TESTNET,o=e?tt:et;t.NODE_TYPE===T.RPC&&(o=Tt);let n=h.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");n.command("epoch").description("Show Validator's Epoch").action(()=>{let s=Ls();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=Vs(s,{shell:!0,stdio:"pipe"});console.log(jm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=Ps();console.log({slot:s})}),n.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","45").option("-l, --ledgerPath <ledgerPath>","Ledger Path","/mnt/ledger").option("-s, --snapshotPath <snapshotPath>","Snapshot Path","/mnt/ledger/snapshot").option("-v, --version <version>","Specific Version Node",o).description("Download the latest snapshot").action(s=>{let a=s.minDownloadSpeed,i=s.ledgerPath,c=s.snapshotPath,l=s.version;$e(e,a,i,c,l)}),n.command("snapshot-finder").description("Clone and run solana-snapshot-finder to fetch a snapshot").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed (MB/s)","100").option("-x, --maxLatency <maxLatency>","Maximum latency (ms)","1000").option("-p, --snapshotPath <snapshotPath>","Snapshot download path","/mnt/ledger").action(s=>{xs({minDownloadSpeed:s.minDownloadSpeed,maxLatency:s.maxLatency,snapshotPath:s.snapshotPath})}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${b()} --ledger /mnt/ledger/ contact-info`;Vs(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solc Config").alias("c").action(async()=>{Xe()}),n.command("aa").description("Show Solc AA").option("-c, --client","Show Solc Client Mode AA",!1).action(s=>{xt.solvAA(),s.client?xt.installClientMessage():xt.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Ym}from"node:child_process";var Ks=r(()=>{Ym("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as Bm}from"node:child_process";var bs=r(()=>{Bm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Jm}from"node:child_process";var Ds=r(()=>{Jm("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Gm}from"node:child_process";var Us=r(()=>{Gm("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as zm}from"node:child_process";var Ms=r((t=!1)=>{zm(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Co from"chalk";import{spawnSync as qm}from"child_process";import{spawnSync as Wm}from"node:child_process";var Fs=r(()=>{Wm("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Hs=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Ks()}),t.command("start").description("Start Relayer").action(()=>{bs()}),t.command("stop").description("Stop Relayer").action(()=>{Ds()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Ms(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{Us()}),t.command("enable").description("Enable Relayer").action(()=>{Fs()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Co.red("Please provide a URL"));return}let o=`${b()} --ledger ${y} set-relayer-config --relayer-url ${e.url}`;console.log(Co.white("Setting Relayer URL ...")),qm(o,{shell:!0,stdio:"inherit"}),console.log(Co.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{writeFile as Qm,mkdir as Xm}from"fs/promises";import{existsSync as js}from"fs";import Zm from"path";import Io from"chalk";var tp=r((t,e)=>{let o=t;if(e.identity&&(o=o.replace(/identity_path\s*=\s*\"[^\"]*\"/,`identity_path = "${e.identity}"`)),e.vote&&(o=o.replace(/vote_account_path\s*=\s*\"[^\"]*\"/,`vote_account_path = "${e.vote}"`)),e.auth&&e.auth.length>0){let n=e.auth.map(s=>`"${s}"`).join(`,
|
|
581
581
|
`);o=o.replace(/authorized_voter_paths\s*=\s*\[[\s\S]*?\]/,`authorized_voter_paths = [
|
|
582
582
|
${n}
|
|
583
|
-
]`)}return e.blockEngineUrl&&(o=o.replace(/url\s*=\s*\"[^\"]*\"/,`url = "${e.blockEngineUrl}"`)),o},"renderWithOverrides"),Ys=r(()=>{h.command("firedancer").description("Firedancer utilities").command("config").description("Generate Firedancer config.toml").option("-n, --network <network>","Network: mainnet-beta|testnet").option("-i, --identity <path>","Identity keypair path").option("-v, --vote <path>","Vote account keypair path").option("-a, --auth <paths...>","Authorized voter keypair paths").option("-o, --out <path>","Output path","/home/solv/firedancer/config.toml").option("-f, --force","Overwrite if exists",!1).option("--dry-run","Print to stdout instead of writing",!1).option("--jito-region <region>",`Jito region (${Object.keys(G).join("|")})`).action(async e=>{let o=await
|
|
584
|
-
`)),console.log(
|
|
583
|
+
]`)}return e.blockEngineUrl&&(o=o.replace(/url\s*=\s*\"[^\"]*\"/,`url = "${e.blockEngineUrl}"`)),o},"renderWithOverrides"),Ys=r(()=>{h.command("firedancer").description("Firedancer utilities").command("config").description("Generate Firedancer config.toml").option("-n, --network <network>","Network: mainnet-beta|testnet").option("-i, --identity <path>","Identity keypair path").option("-v, --vote <path>","Vote account keypair path").option("-a, --auth <paths...>","Authorized voter keypair paths").option("-o, --out <path>","Output path","/home/solv/firedancer/config.toml").option("-f, --force","Overwrite if exists",!1).option("--dry-run","Print to stdout instead of writing",!1).option("--jito-region <region>",`Jito region (${Object.keys(G).join("|")})`).action(async e=>{let o=await v(),n=e.network||o.NETWORK,s=o.FRANKENDANCER_BLOCK_ENGINE_URL,a=n===u.MAINNET?Me({blockEngineUrl:s}):Ue(),i;if(e.jitoRegion){let d=e.jitoRegion,p=G[d];if(!p){console.log(Io.red(`Invalid --jito-region '${e.jitoRegion}'. Choose one of: ${Object.keys(G).join(", ")}`));return}i=p.BLOCK_ENGINE_URL}let c=tp(a.body,{identity:e.identity,vote:e.vote,auth:e.auth,blockEngineUrl:i});if(e.dryRun){console.log(c);return}let l=e.out||a.filePath,m=Zm.dirname(l);if(js(m)||await Xm(m,{recursive:!0}),js(l)&&!e.force){console.log(Io.red(`File exists: ${l}. Use --force to overwrite or --dry-run to preview`));return}await Qm(l,c),console.log(Io.green(`Wrote Firedancer config: ${l}`))})},"firedancerCommands");import Bs from"chalk";import{spawnSync as ep}from"child_process";var Js=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;ep(e,{shell:!0,stdio:"inherit"})}catch{console.log(Bs.yellow(`You might need to install the Solana SPL CLI:
|
|
584
|
+
`)),console.log(Bs.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as rp}from"os";import{spawnSync as op}from"child_process";var ut=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=op(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import np from"chalk";import{spawnSync as sp}from"node:child_process";var Gs=r(t=>{h.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let n=`${rp()}/mainnet-authority-keypair.json`;await Js(n),process.exit(0)}await ap(t),process.exit(0)})},"balanceCommands"),ap=r(async t=>{let e=ip(t),o=`Validator Key: ${e.validatorKey}
|
|
585
585
|
Address: ${e.validatorKeyAddress}
|
|
586
586
|
Balance: ${e.validatorKeyBalance}
|
|
587
587
|
Vote Key: ${e.voteKey}
|
|
@@ -593,17 +593,17 @@ Balance: ${e.authorityKeyBalance}
|
|
|
593
593
|
Active Identity:`;t.NODE_TYPE===T.RPC&&(o=`Validator Key: ${e.validatorKey}
|
|
594
594
|
Address: ${e.validatorKeyAddress}
|
|
595
595
|
Balance: ${e.validatorKeyBalance}
|
|
596
|
-
Active Identity:`),console.log(
|
|
596
|
+
Active Identity:`),console.log(np.white(o)),sp(`solana-keygen pubkey ${k}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),ip=r(t=>{let e=A(),o=t.NETWORK===u.TESTNET;return t.NODE_TYPE===T.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ut(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:E(e.testnetValidatorKey),validatorKeyBalance:ut(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:E(e.testnetValidatorVoteKey),voteKeyBalance:ut(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:E(e.testnetValidatorAuthorityKey),authorityKeyBalance:ut(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ut(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:E(e.mainnetValidatorVoteKey),voteKeyBalance:ut(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:E(e.mainnetValidatorAuthorityKey),authorityKeyBalance:ut(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as cp}from"child_process";var zs=r(()=>{cp("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Ws}from"node:child_process";var qs=r(()=>{Ws("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),Ws("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as lp}from"node:child_process";var Qs=r(t=>{let o=`${b()} --ledger ${y} monitor`;lp(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as mp}from"node:child_process";var Xs=r(()=>{mp("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import Ze from"inquirer";import{execSync as to,spawnSync as Lo}from"child_process";import ne from"chalk";import{homedir as pp}from"os";var Zs=1e3,Po;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(Po||(Po={}));var eo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(eo||(eo={}));var dp=Object.values(Po),ta=r(t=>{h.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(ne.blue(`\u2728 Coming Soon
|
|
597
597
|
This Feature is Currently Under Development
|
|
598
|
-
Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await
|
|
599
|
-
Please Check the Wallet Address`)),process.exit(0)}let i=
|
|
598
|
+
Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await up(),a="0";try{let p=Lo(`solana balance ${s} --url ${t.RPC_URL}`,{shell:!0});if(p.status!==0)throw new Error("Invalid Wallet Address");a=p.stdout.toString(),console.log("toBalance:",a)}catch{console.log(ne.red(`\u274C To Wallet is Invalid
|
|
599
|
+
Please Check the Wallet Address`)),process.exit(0)}let i=to(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(ne.white(`\u{1F3E6} From Wallet: ${n}
|
|
600
600
|
\u{1F4B0} Balance: ${i}`)),console.log(ne.white(`\u{1F3E6} To Wallet: ${s}
|
|
601
|
-
\u{1F4B0} Balance: ${a}`));let{amount:c}=await
|
|
601
|
+
\u{1F4B0} Balance: ${a}`));let{amount:c}=await Ze.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),l=`solana transfer ${s} ${c} --allow-unfunded-recipient --keypair ${o} --url ${t.RPC_URL}`,m=Lo(l,{shell:!0,stdio:"inherit"}),d=de;for(;m.status!==0&&d>0;)console.log(ne.red(`\u274C Transaction Failed
|
|
602
602
|
Retrying Transaction in ${Zs}ms
|
|
603
|
-
Retries Left: ${d}`)),await
|
|
604
|
-
`)),console.log(
|
|
603
|
+
Retries Left: ${d}`)),await nt(Zs),m=Lo(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),se=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),up=r(async()=>{let t=pp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=to(`solana address -k ${n}`).toString().trim(),a=await Ze.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:dp}]),i=a.from==="Validator Account"?Object.values(eo).filter(p=>p!=="Validator Account"):Object.values(eo).filter(p=>p!=="Authority Account");if((await Ze.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await Ze.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:se}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=to(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=to(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import ea from"chalk";import fp from"inquirer";import{execSync as xo,spawnSync as hp}from"node:child_process";var oa=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?Ee: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=xo(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(ea.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(ea.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let S=await fp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(S.sol)}let d=xo(`solana address --keypair ${i}`).toString().trim(),p=xo(`solana address --keypair ${a}`).toString().trim(),f=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;hp(f,{shell:!0,stdio:"inherit"})},"withdraw");var ra=r(t=>{h.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await oa(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as vp,spawnSync as Cp}from"node:child_process";import{BN as sa}from"bn.js";import{LAMPORTS_PER_SOL as Vo}from"@solana/web3.js";import{Connection as gp,LAMPORTS_PER_SOL as Ep}from"@solana/web3.js";import{Keypair as yp}from"@solana/web3.js";import{readFile as Sp}from"fs/promises";var Tp=r(async t=>{let e=JSON.parse(await Sp(t,"utf8"));return yp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),na=Tp;import{homedir as wp}from"os";var j;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(j||(j={}));var Ap={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},_p=r(async(t,e="auth",o=!1)=>{let n=new gp(t),s=wp(),a=A(s),c=`${o?"testnet":"mainnet"}${Ap[e]}`,l=a[c],m=await na(l),d=await n.getBalance(m.publicKey),f=Number(d)/Ep;if(isNaN(f))throw new Error("Failed to get balance");return f},"getBalance"),at=_p;var Np=new sa(3*Vo),aa=r(async t=>{let e=await at(t,j.VALIDATOR),n=new sa(Number(Number(e)*Vo)).sub(Np),s=Number(n)/Vo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import ae from"chalk";import{Keypair as Op,Connection as kp,PublicKey as Rp,SystemProgram as ia,ComputeBudgetProgram as oo,VersionedTransaction as ca,TransactionMessage as la}from"@solana/web3.js";var ma=r(async(t,e,o,n)=>{let s=0;try{let a=new kp(t,"finalized"),i=Op.fromSecretKey(new Uint8Array(Array.from(e))),c=new Rp(o),l=n;for(;;)try{let m=[ia.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),oo.setComputeUnitLimit({units:2e5}),oo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new ca(new la({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),f=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let S=[ia.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),oo.setComputeUnitLimit({units:f.value.unitsConsumed?Math.trunc(f.value.unitsConsumed*1.2):2e5}),oo.setComputeUnitPrice({microLamports:1e3})],w=new ca(new la({instructions:S,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());w.sign([i]);let N=await a.sendRawTransaction(w.serialize());return await a.confirmTransaction({...d.value,signature:N},"finalized"),console.log("finalized signature:",N),N}catch(m){if(s++,s>de)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await nt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Ip}from"fs/promises";import{LAMPORTS_PER_SOL as Lp}from"@solana/web3.js";var $o=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=A();await at(t,j.VOTE)<1?(console.log(ae.white("Vote Account Balance is less than 1 SOL")),console.log(ae.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Cp("solc withdraw --all",{shell:!0,stdio:"inherit"});let s=await aa(t);console.log(ae.white(`Transferable Balance: ${s} SOL`));let a=s*Lp;if(s<1)console.log(ae.white("Validator Account Balance is less than 1 SOL")),console.log(ae.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=vp(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await Ip(o,"utf-8"));await ma(t,c,i,a)}return!0},"collectSOL");import{readFile as Hp}from"fs/promises";import jp from"inquirer";import Ko from"chalk";import{execSync as Pp}from"child_process";import{homedir as xp}from"os";var Vp=r(async t=>{try{let e=xp(),{mainnetValidatorAuthorityKey:o}=A(e),n=`spl-token balance ${Z} --owner ${o} --url ${t}`,s=Pp(n).toString().trim();return Number(s)}catch(e){return console.log(Ko.red(`Error: ${e}`)),console.log(Ko.yellow(`You might need to install the Solana SPL CLI:
|
|
604
|
+
`)),console.log(Ko.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),pa=Vp;import so from"chalk";import{Connection as $p,PublicKey as da,Keypair as Kp,ComputeBudgetProgram as ro,VersionedTransaction as ua,TransactionMessage as fa}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as ha,createTransferInstruction as ya,TOKEN_PROGRAM_ID as Sa}from"@solana/spl-token";var Ta=r(async(t,e,o,n,s,a)=>{try{let i=new $p(t,"finalized"),c=Kp.fromSecretKey(new Uint8Array(e)),l=new da(o),m=new da(s),d=Math.trunc(n*Math.pow(10,a)),p=await ha(i,c,m,c.publicKey),f=await ha(i,c,m,l,!0);for(;;)try{let S=[ya(p.address,f.address,c.publicKey,d,[],Sa),ro.setComputeUnitLimit({units:2e5}),ro.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],w=await i.getLatestBlockhashAndContext({commitment:"finalized"}),N=new ua(new fa({instructions:S,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message()),O=await i.simulateTransaction(N,{replaceRecentBlockhash:!0,sigVerify:!1});N.sign([c]);let z=[ya(p.address,f.address,c.publicKey,d,[],Sa),ro.setComputeUnitLimit({units:O.value.unitsConsumed?Math.trunc(O.value.unitsConsumed*1.2):2e5}),ro.setComputeUnitPrice({microLamports:1e3})],V=new ua(new fa({instructions:z,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message());V.sign([c]);let Ot=await i.sendRawTransaction(V.serialize());return await i.confirmTransaction({...w.value,signature:Ot},"finalized"),console.log("finalized signature:",Ot),Ot}catch(S){console.error("Transfer failed, retrying...",S)}}catch(i){throw console.error(i),i}},"transferSPLToken");import no from"inquirer";import{spawnSync as ga}from"child_process";import bo from"chalk";import{promises as Ea}from"fs";var bp=r(async(t="epochTimer")=>{try{let e=ga("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(bo.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
|
|
605
605
|
`).filter(a=>!a.includes(t)).join(`
|
|
606
|
-
`),s="/tmp/temp_crontab";await Ea.writeFile(s,n,"utf-8"),ga("crontab",[s]),await Ea.unlink(s),console.log(
|
|
606
|
+
`),s="/tmp/temp_crontab";await Ea.writeFile(s,n,"utf-8"),ga("crontab",[s]),await Ea.unlink(s),console.log(bo.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(bo.red("Error removing cron job:",e))}},"removeCronJob"),wa=bp;import Aa from"chalk";var Dp=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await no.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solc Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await je()&&await wa(),await _({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
|
|
607
607
|
${Aa.green("No more Login to the server to update \u{1F331}")}
|
|
608
608
|
|
|
609
609
|
If you enable this, solc will update automatically when the solc/solana version is updated.
|
|
@@ -612,53 +612,53 @@ AUTO UPDATE: If you enable this, solc will update automatically when the solc ve
|
|
|
612
612
|
|
|
613
613
|
AUTO RESTART: If you enable this, solc will restart automatically when the solana version is updated.
|
|
614
614
|
\u203B Please turn off if you are using no-downtime migration.
|
|
615
|
-
`;console.log(Aa.white(n));let s=await
|
|
615
|
+
`;console.log(Aa.white(n));let s=await no.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 no.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await no.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:se}]);i=l.harvestAddress,a=l.rpcUrl}return await _({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"),_a=Dp;import{spawnSync as Yp}from"node:child_process";import{Connection as Fp}from"@solana/web3.js";import{Connection as Up}from"@solana/web3.js";var Mp=r(async(t,e=10,o=.4)=>{try{let s=await new Up(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"),Na=Mp;var Do=r(async t=>{try{let o=await new Fp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await Na(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 Bp=.03,Oa=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await Jp(t),{mainnetValidatorAuthorityKey:o}=A();console.log("Harvesting SOL..."),await $o(t.RPC_URL);let n=await at(t.RPC_URL,j.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await nt(1e3),await $o(t.RPC_URL),n=await at(t.RPC_URL,j.VOTE),s++;let a=JSON.parse(await Hp(o,"utf-8")),i=await at(t.RPC_URL,j.AUTH);if(i<1)console.log(so.white("Authority Account Balance is less than 1 SOL")),console.log(so.white("Skip converting SOL to elSOL"));else{let l=i-Bp;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await We(t.RPC_URL,J,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await pa(t.RPC_URL);if(c<1){let l=await Do(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 x(m),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await Ta(t.RPC_URL,a,e,c,Z,fr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Do(t.RPC_URL)).epoch} \u{1F4B0}
|
|
616
616
|
Validator Address: ${E(o)}
|
|
617
617
|
Total Reward: ${c} elSOL
|
|
618
|
-
Harvest Address: ${e}`;await x(m)}console.log(
|
|
618
|
+
Harvest Address: ${e}`;await x(m)}console.log(so.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await _a(t)&&(Yp("solc cron epoch",{stdio:"inherit",shell:!0}),console.log(so.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),Jp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await jp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:se}]);return await _({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as fd}from"@skeet-framework/utils";import{writeFile as Gp}from"fs/promises";var zp=r(async t=>{await Gp(ge,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),ft=zp;var Wp=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=n?E(a):E(s),c=`===\u23F3 ${t.epoch} \u23F3===
|
|
619
619
|
Validator: ${i}
|
|
620
620
|
Network: ${o.NETWORK}
|
|
621
621
|
CurrentEpoch: ${t.epoch}
|
|
622
622
|
Next epoch is coming in less than ${e}!
|
|
623
623
|
Epoch Completed: ${t.epochCompletedPercent}%
|
|
624
|
-
Until Next Epoch: ${t.epochRemainingTime}`;await x(c)},"alertMessage"),$t=
|
|
624
|
+
Until Next Epoch: ${t.epochRemainingTime}`;await x(c)},"alertMessage"),$t=Wp;var qp=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ft({...e,isLessThan1Day:!0}),await $t(o,"1 Day",n))},"isLessThan1Day"),ka=qp;var Qp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ft({...e,isLessThan8Hours:!0}),await $t(o,"8 Hours",n))},"lessThan8Hour"),Ra=Qp;import{spawnSync as Zp}from"child_process";import td from"chalk";var Xp=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"),va=Xp;var ed=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await ft({...e,isLessThan1Hour:!0}),await $t(o,"1 Hour",n),s&&a){let i=await va(1,100);console.log(td.white(`\u23F3 Waiting for ${i} seconds before running solc harvest...`)),Zp("solc",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),Ca=ed;var od=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=o?E(a):E(s);await ft(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
|
|
625
625
|
Validator: ${i}
|
|
626
626
|
Network: ${e.NETWORK}
|
|
627
627
|
CurrentEpoch: ${t.epoch}
|
|
628
628
|
Epoch has been updated!
|
|
629
|
-
Until Next Epoch: Approximately 2 days`;return await x(c),"Epoch has been updated!"},"newEpoch"),Ia=
|
|
629
|
+
Until Next Epoch: Approximately 2 days`;return await x(c),"Epoch has been updated!"},"newEpoch"),Ia=od;import{existsAsync as rd}from"@skeet-framework/utils";import{readFile as nd,writeFile as sd}from"fs/promises";import ad from"chalk";import{homedir as id}from"os";var cd=r(async()=>{let e=id().includes("/home/solv")?ge:"./currentEpoch.json";if(await rd(e))return JSON.parse(await nd(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await sd(e,JSON.stringify(o,null,2),"utf-8"),console.log(ad.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),La=cd;import ld from"chalk";var md=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=Wo),await at(e,j.VALIDATOR,o)<fo){let{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=o?E(a):E(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${fo} SOL
|
|
630
630
|
Please top up your Validator Account
|
|
631
|
-
Address: ${i}`;return await x(c),!1}return console.log(
|
|
632
|
-
`),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.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 f=p[1]?parseInt(p[1]):0,S=p[2]?parseInt(p[2]):0,w=p[3]?parseInt(p[3]):0,
|
|
631
|
+
Address: ${i}`;return await x(c),!1}return console.log(ld.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Pa=md;async function pd(t="@ily-validator/solc"){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(pd,"getNpmLatestVersion");var xa=pd;async function dd(){let t=Rt(),e=await xa();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(dd,"isVersionSame");var Va=dd;import{spawnSync as hd}from"child_process";import{spawnSync as ud}from"node:child_process";var $a=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=ud(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
|
|
632
|
+
`),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.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 f=p[1]?parseInt(p[1]):0,S=p[2]?parseInt(p[2]):0,w=p[3]?parseInt(p[3]):0,N=p[4]?parseInt(p[4]):0,O=f*24*60+S*60+w+Math.floor(N/60);return{epoch:c,day:f,hour:S,min:w,sec:N,totalMinutes:O,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var yd=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?Ee:t.RPC_URL,n=fd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await La(),a=$a(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=A(),m=await Jt(o,E(e?c:i));if(m.isActive||await x(`\u26A0\uFE0F Validator is not active!
|
|
633
633
|
VoteAccount: ${m.pubkey}
|
|
634
634
|
Reason: ${m.reason}
|
|
635
635
|
Network: ${t.NETWORK}
|
|
636
|
-
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Pa(t),!await Va()&&t.AUTO_UPDATE)return console.log("Found new version of solc! Updating..."),
|
|
636
|
+
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Pa(t),!await Va()&&t.AUTO_UPDATE)return console.log("Found new version of solc! Updating..."),hd("solc update && solc update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Ia(a,t),"Epoch has been updated!";let p=a.totalMinutes,f=[Ca,Ra,ka];for(let S of f)if(await S(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),Ka=yd;var ba=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await Ka(t),process.exit(0)})},"epochTimerCommands");import Qa from"inquirer";import{join as Fa}from"path";import{spawnSync as bt}from"node:child_process";import Y from"chalk";import{spawnSync as Sd}from"node:child_process";var Td=r((t,e,o="solv",n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=Sd(`ssh -i ${s} -o StrictHostKeyChecking=no ${o}@${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.
|
|
637
637
|
$ ssh ${o}@${t}
|
|
638
638
|
|
|
639
|
-
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"),Da=
|
|
639
|
+
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"),Da=Td;import Ua from"chalk";var gd=r((t,e)=>{console.log(Ua.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=E(t).trim(),n=Da(e,`solana-keygen pubkey ${t}`).stdout.toString().trim();return o!==n?(console.log(Ua.yellow(`\u26A0\uFE0F Destination Identity Key is different.
|
|
640
640
|
Please check your Validator
|
|
641
641
|
$ ssh solv@${e}
|
|
642
642
|
|
|
643
643
|
Local Identity Key: ${o}
|
|
644
|
-
Destination Identity Key: ${n}`)),!1):!0},"checkValidatorKey"),Kt=
|
|
644
|
+
Destination Identity Key: ${n}`)),!1):!0},"checkValidatorKey"),Kt=gd;var ao=Fa(I,yt),Ma=Fa(I,ht),Ha=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:K;s&&(a=L);let i=b();if(!Kt(a,t))return;console.log(Y.white("\u{1F7E2} Waiting for restart window..."));let l=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(bt(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
645
645
|
$ ssh solv@${t}
|
|
646
646
|
|
|
647
|
-
Failed Cmd: ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(Y.white("\u{1F7E2} Setting identity on the new validator..."));let d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} set-identity ${
|
|
647
|
+
Failed Cmd: ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(Y.white("\u{1F7E2} Setting identity on the new validator..."));let d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} set-identity ${ao}'`;if(bt(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
648
648
|
$ ssh solv@${t}
|
|
649
649
|
|
|
650
|
-
Failed Cmd: ${i} -l ${y} set-identity ${
|
|
650
|
+
Failed Cmd: ${i} -l ${y} set-identity ${ao}`));return}if(console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),bt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${ao} ${Ma}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
651
651
|
$ ssh solv@${t}
|
|
652
652
|
|
|
653
|
-
Failed Cmd: ln -sf ${
|
|
653
|
+
Failed Cmd: ln -sf ${ao} ${Ma}`));return}if(console.log(Y.white("\u{1F7E2} Uploading the tower file to the new validator...")),bt(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
|
|
654
654
|
$ ssh solv@${t}
|
|
655
655
|
|
|
656
656
|
Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),bt(`${i} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
657
657
|
|
|
658
658
|
Failed Cmd: ${i} -l ${y} set-identity ${a}
|
|
659
|
-
ln -sf ${a} ${
|
|
659
|
+
ln -sf ${a} ${k}`));return}if(bt(`ln -sf ${a} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
660
660
|
|
|
661
|
-
Failed Cmd: ln -sf ${a} ${
|
|
661
|
+
Failed Cmd: ln -sf ${a} ${k}`));return}console.log(Y.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as Ba}from"path";import F from"chalk";import{spawnSync as Dt}from"node:child_process";var ja=Ba(I,yt),Ed=Ba(I,ht),Ya="~/.ssh/id_rsa",Ja=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:K;s&&(a=L);let i=b();if(!Kt(a,t))return;let l=`${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,m=`${i} -l ${y} set-identity ${ja}`,d=`ln -sf ${ja} ${Ed}`,p=`scp ${y}/tower-1_9-${e}.bin solv@${t}:${y}`,f=`${i} -l ${y} set-identity --require-tower ${a}`,S=`ln -sf ${a} ${k}`;if(console.log(F.white("\u{1F7E2} Waiting for restart window...")),Dt(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
662
662
|
|
|
663
663
|
Failed Cmd: ${l}`));return}if(console.log(F.white("\u{1F7E2} Setting identity on the new validator...")),Dt(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
|
|
664
664
|
|
|
@@ -671,32 +671,32 @@ $ ssh solv@${t}
|
|
|
671
671
|
|
|
672
672
|
Failed Cmd: ${f}`)),console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let Ft=`ssh -i ${Ya} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${S}'`;if(Dt(Ft,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
|
|
673
673
|
|
|
674
|
-
Failed Cmd: ${S}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await
|
|
674
|
+
Failed Cmd: ${S}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as wd}from"node:child_process";function Ga(t){let e=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return wd(e,{shell:!0,stdio:"inherit"}).status===0}r(Ga,"checkSSHConnection");import ie from"chalk";import{join as Wa}from"path";import{spawnSync as Ut}from"node:child_process";import B from"chalk";var io=Wa(I,yt),za=Wa(I,ht),qa=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:K;if(s&&(a=L),!Kt(a,t))return;let c=Jo,l=Go;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 ${y} 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
|
|
675
675
|
$ ssh solv@${t}
|
|
676
676
|
|
|
677
|
-
Failed Cmd: ${c} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(
|
|
677
|
+
Failed Cmd: ${c} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(B.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 ${y} set-identity ${io}'`;if(Ut(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
678
678
|
$ ssh solv@${t}
|
|
679
679
|
|
|
680
|
-
Failed Cmd: ${c} -l ${y} set-identity ${
|
|
680
|
+
Failed Cmd: ${c} -l ${y} set-identity ${io}`));return}if(console.log(B.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ut(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${io} ${za}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
681
681
|
$ ssh solv@${t}
|
|
682
682
|
|
|
683
|
-
Failed Cmd: ln -sf ${
|
|
683
|
+
Failed Cmd: ln -sf ${io} ${za}`));return}if(console.log(B.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ut(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
|
|
684
684
|
$ ssh solv@${t}
|
|
685
685
|
|
|
686
|
-
Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(
|
|
686
|
+
Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(B.white("\u{1F7E2} Setting identity on the new validator...")),Ut(`${l} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
687
687
|
|
|
688
688
|
Failed Cmd: ${l} -l ${y} set-identity ${a}
|
|
689
|
-
ln -sf ${a} ${
|
|
689
|
+
ln -sf ${a} ${k}`));return}if(Ut(`ln -sf ${a} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
690
690
|
|
|
691
|
-
Failed Cmd: ln -sf ${a} ${
|
|
692
|
-
You can choose only Incoming or Outgoing`));return}if(!Ga(l)){console.log("SSH Connection Failed");return}if(c==="Incoming"){if(o.v2MigrateIncoming){(await Qa.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(ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await qa(l,i,e);return}await Ha(l,i,e)}else await
|
|
691
|
+
Failed Cmd: ln -sf ${a} ${k}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var Ad=["Incoming","Outgoing"],Xa=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).description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===T.RPC,a=n?L:K;s&&(a=L);let i=E(a),c=o.switchType,l=o.ip;if(c===""||l===""){let d=await Qa.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"}}]);c=d.switchType,l=d.ip}if(!Ad.includes(c)){console.log(ie.yellow(`\u26A0\uFE0F Invalid Switch Type
|
|
692
|
+
You can choose only Incoming or Outgoing`));return}if(!Ga(l)){console.log("SSH Connection Failed");return}if(c==="Incoming"){if(o.v2MigrateIncoming){(await Qa.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(ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await qa(l,i,e);return}await Ha(l,i,e)}else await Ja(l,i,e);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ie.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as _d}from"node:child_process";var Nd=r((t="296877183",e=y)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${e} --hard-fork ${t} --deactivate-feature-gate 7uZBkJXJ1HkuP6R3MJfZs7mLwymBcDbKdqbF51ZWLier tvcF6b1TRz353zKuhBjinZkKzjmihXmBAHJdjNYw1sQ decoMktMcnmiq6t3u7g5BfgcQu91nKZr6RvMYf9z1Jb -- ${t} ${e}`,n=_d(o,{shell:!0,stdio:"pipe",cwd:e});if(n.status!==0)throw new Error(`createSnapshot: ${n.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),Za=Nd;import Mt from"inquirer";import xd from"dotenv";import Nt from"chalk";var co={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:mo,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:fe,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:he,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:mo,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 Rd}from"fs/promises";import{Connection as vd,Keypair as Cd,VersionedTransaction as Id}from"@solana/web3.js";import U from"chalk";import Ld from"inquirer";import Pd from"dotenv";var Od=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"),ti=Od;var kd=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"),ei=kd;Pd.config();var oi=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new vd(t,"confirmed"),m=await ti(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
|
|
693
693
|
`)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(Ht+`
|
|
694
694
|
`)),process.exit(0));let ce=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
|
|
695
695
|
|
|
696
696
|
You can upgrade your API key to increase your rate limits.
|
|
697
697
|
Get Your API key \u{1F447}
|
|
698
698
|
Validators Solutions: ${Ht}
|
|
699
|
-
`;console.error(U.white(ce)),process.exit(0)}let d=
|
|
699
|
+
`;console.error(U.white(ce)),process.exit(0)}let d=Uo[s],p=Uo[a],f=`\u{1F504} Swap Quote \u{1F504}
|
|
700
700
|
|
|
701
701
|
- \u{1F3E6} Input Token: ${d.symbol} (${s})
|
|
702
702
|
- \u{1F4B0} Input Amount: ${i/Math.pow(10,d.decimal)} ${d.symbol}
|
|
@@ -707,16 +707,16 @@ Validators Solutions: ${Ht}
|
|
|
707
707
|
\u203B This quote is based on the current market rate and may change before the swap is completed.
|
|
708
708
|
`;console.log(U.white(f)),console.log(U.gray(`You can also swap using the following command:
|
|
709
709
|
$ solc swap --input ${s} --output ${a} --amount ${i} --skip-confirm
|
|
710
|
-
`));let S=!1;c?S=(await
|
|
710
|
+
`));let S=!1;c?S=(await Ld.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(U.cyan("Skipping confirmation...")),S=!0),S||(console.log(U.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let w=JSON.parse(await Rd(n,"utf8")),N=Cd.fromSecretKey(new Uint8Array(Array.from(w))),O=await ei(e,o,m,N.publicKey.toString());if(typeof O=="string"){O.includes("Unauthorized")&&(console.error(U.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
|
|
711
711
|
`)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(Ht+`
|
|
712
712
|
`)),process.exit(0));let ce=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
|
|
713
713
|
|
|
714
714
|
You can upgrade your API key to increase your rate limits.
|
|
715
715
|
Get Your API key \u{1F447}
|
|
716
716
|
Validators Solutions: ${Ht}
|
|
717
|
-
`;console.error(U.white(ce)),process.exit(0)}let z=Buffer.from(
|
|
718
|
-
Transaction ID: ${Ft}`),await l.confirmTransaction({blockhash:
|
|
719
|
-
`)),wt()},"askForConfig");import{spawnSync as
|
|
717
|
+
`;console.error(U.white(ce)),process.exit(0)}let z=Buffer.from(O.swapTransaction,"base64"),V=Id.deserialize(z);V.sign([N]);let Ot=V.serialize(),Ft=await l.sendRawTransaction(Ot,{skipPreflight:!0,maxRetries:2}),Mo=V.message.recentBlockhash;return console.log(`Swapping...
|
|
718
|
+
Transaction ID: ${Ft}`),await l.confirmTransaction({blockhash:Mo,lastValidBlockHeight:O.lastValidBlockHeight,signature:Ft},"confirmed"),Ft},"swap");xd.config();var ri=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 Vd(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(Nt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Nt.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),Vd=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(Nt.white("Solana RPC URL:",t)),console.log(Nt.white("KeyfilePath:",e)),(!e||e===""||c)&&await $d();let l=Xo,m=[...Zo,"Other"],d=n,p="",f=s,S=a;if(d===""){let O=await Mt.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:fe}]);O.name==="Other"?d=(await Mt.prompt([{type:"input",name:"address",message:"Enter input mint address",default:he}])).address:(p=O.name,d=co[p].tokenMint)}if(f===""){m=m.filter(V=>V!==p);let O=await Mt.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(O.name==="Other")f=(await Mt.prompt([{type:"input",name:"address",message:"Enter output mint address",default:Z}])).address;else{let V=O.name;f=co[V].tokenMint}let z=O.name;f=co[z].tokenMint}if(S===0){let O=await Mt.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);S=Number(O.amount)}let N=await oi(t,l,!o||o===""?tr:o,e,d,f,S,i);N||process.exit(0),console.log(Nt.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(Nt.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${N}`))},"swapCmd");var $d=r(async()=>{let t=await Mt.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 _(t),console.log(Nt.green(`\u2714\uFE0E Config Updated Successfully!
|
|
719
|
+
`)),wt()},"askForConfig");import{spawnSync as Kd}from"node:child_process";var ni=r(()=>{Kd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as bd}from"node:child_process";var si=r(()=>{bd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Dd}from"node:child_process";var ai=r(()=>{Dd("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as Ud}from"node:child_process";var ii=r(()=>{Ud("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as Md}from"node:child_process";var ci=r((t=!1)=>{Md(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Fd}from"node:child_process";var li=r(()=>{Fd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var mi=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{ni()}),t.command("start").description("Start Jupiter").action(()=>{si()}),t.command("stop").description("Stop Jupiter").action(()=>{ai()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{ci(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{ii()}),t.command("enable").description("Enable Jupiter").action(()=>{li()})},"jupiterCommands");import Yd from"chalk";import{spawnSync as Hd}from"node:child_process";var pi=r(()=>{h.command("pubkey").alias("p").description("Print pubkey from a keypair file (wrapper of solana-keygen)").option("-f, --file <path>","Keypair file path","identity.json").addHelpText("after",`
|
|
720
720
|
Examples:
|
|
721
721
|
$ solc pubkey
|
|
722
722
|
$ solc pubkey -f ~/.config/solana/id.json
|
|
@@ -724,5 +724,5 @@ Examples:
|
|
|
724
724
|
|
|
725
725
|
Notes:
|
|
726
726
|
- This runs: solana-keygen pubkey <file>
|
|
727
|
-
- Defaults to "identity.json" in the current directory`).action(t=>{let o=`solana-keygen pubkey ${t.file||"identity.json"}`,n=
|
|
727
|
+
- Defaults to "identity.json" in the current directory`).action(t=>{let o=`solana-keygen pubkey ${t.file||"identity.json"}`,n=Hd(o,{shell:!0,stdio:"inherit"});process.exit(n.status??0)})},"pubkeyCommand");var h=new jd;h.name("solc").description("\u{1FA84} solc - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(le,"-V","Display version");async function Bd(){try{let t=await v();Gn(t),Qn(t),Wn(t),ds(t),Yr(t),Jr(),Xn(t),Is(t),$s(t),ps(),es(),Yn(t),Gs(t),Zn(),Hs(),ta(t),ra(t),Oa(t),Jn(),ri(h,t),ba(t),Xa(h,t),mi(),Ys(),pi(),h.command("rm:log").description("Remove Logs").action(()=>{zs()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{qs()}),h.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot").option("-l, --ledger <ledger>","Ledger").action(e=>{console.log(Yd.white("\u{1F4DD} Creating Snapshot...")),Za(e.slot,e.ledger)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Qs(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{Xs()}),h.command("config").description("Show Solc Config").action(()=>{Xe()}),h.command("vv").description("Show Solc Version").action(()=>{let e=Ae();console.log("version:",e)}),await h.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(Bd,"main");Bd();export{h as program};
|
|
728
728
|
//# sourceMappingURL=index.js.map
|