wative 1.2.12 → 1.2.15

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/lib/index.esm.js CHANGED
@@ -1 +1 @@
1
- import*as e from"fs";import t,{readFileSync as a}from"fs";import*as r from"path";import n from"path";import*as s from"figlet";import o from"inquirer";import i from"web3";import c,{Connection as l,PublicKey as u,Transaction as d,SystemProgram as p,ComputeBudgetProgram as h}from"@solana/web3.js";import{getMint as g,getTokenMetadata as m,getAssociatedTokenAddressSync as f,createAssociatedTokenAccountInstruction as y,createTransferInstruction as w}from"@solana/spl-token";import{Metaplex as v}from"@metaplex-foundation/js";import{BigNumber as b}from"bignumber.js";import*as k from"ini";import*as S from"crypto";import{timingSafeEqual as x}from"crypto";import{execSync as _,spawn as $}from"child_process";import{utils as P,Server as A,Client as I}from"ssh2";import*as C from"log4js";import{ethers as N}from"ethers";import O from"tweetnacl";import j from"bs58";import T from"bip39";import E from"@coral-xyz/anchor";import F from"crypto-js";import L from"ethereumjs-wallet";import B from"micro-ed25519-hdkey";import*as R from"net";import{Command as M}from"commander";const q={},z=[{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall.Call[]",name:"calls",type:"tuple[]"}],name:"aggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes[]",name:"returnData",type:"bytes[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"getEthBalance",outputs:[{internalType:"uint256",name:"balance",type:"uint256"}],stateMutability:"view",type:"function"}],D=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],K=async e=>{let t=new i(e);return await ma(t.eth.getChainId,[])},U=async(e,t)=>{const a=new i(t);return await ma(a.eth.getBalance,[e])},H=async(e,t)=>{const a=new l(t);return await ma(a.getBalance.bind(a),[new u(e)])},J=async(e,t)=>{const a=new l(t),r=new u(e);let n=await ma(a.getAccountInfo.bind(a),[r]);if(!n.status)return{status:!1,output:"Failed to get mint account info"};const s=n.output;if(!s)return{status:!1,output:"Mint account not found"};return{status:!0,output:s.owner.toBase58()}},G=async(e,t)=>{const a=new(new i(t).eth.Contract)([{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],e);let r=await ma(a.methods.symbol().call.bind(a),[]),n=await ma(a.methods.name().call.bind(a),[]),s=await ma(a.methods.decimals().call.bind(a),[]);return r.status&&n.status&&s.status?{status:!0,output:{symbol:r.output,name:n.output,decimals:s.output}}:{status:!1,output:"Failed to get token info"}},W=async(e,t)=>{let a=await J(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const r=a.output,n=new l(t),s=v.make(n),o=new u(e);let i=await ma(g,[n,o,"finalized",new u(r)]),c={status:!0,output:{symbol:"",name:"",decimals:""}};if(!i.status)return{status:!1,output:"Failed to get token decimals"};c.output.decimals=i.output.decimals;try{const e=s.nfts().pdas().metadata({mint:o});if(await n.getAccountInfo(e)){const e=await s.nfts().findByMint({mintAddress:o});c.output.name=e.name,c.output.symbol=e.symbol}else try{const e=await m(n,o);e&&(e.name&&(c.output.name=e.name),e.symbol&&(c.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return c},V=async(e,t,a)=>{const r=new(new i(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let n=await ma(r.methods.balanceOf(e).call.bind(r),[]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get token balance"}},Z=async(e,t,a)=>{let r=await J(t,a);if(!r.status)return{status:!1,output:"Failed to get token program id"};const n=r.output,s=new l(a),o=f(new u(t),new u(e),!1,new u(n));let i=await ma(s.getTokenAccountBalance.bind(s),[o]);return i.status?{status:!0,output:i.output.value.amount}:i.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},X=async(e,t)=>{const a=new i(t);let r=await ma(a.eth.getCode.bind(a),[e]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get code"}},Q=async(e,t,a)=>new i(a).eth.abi.encodeFunctionCall({constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},[e,t]),Y=async e=>{const t=new l(e);let a=await ma(t.getRecentPrioritizationFees.bind(t),[]);if(!a.status)return{status:!1,output:"Failed to get recent prioritization fees"};const r=a.output.map(e=>e.prioritizationFee).sort();return{status:!0,output:r.length>0?Math.ceil(r.reduce((e,t)=>e+t)/r.length):1e3}},ee=async e=>{const t=new l(e);let a=await ma(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}},te=async(e,t)=>{const a=new l(t);let r=await ma(a.getAccountInfo.bind(a),[new u(e.toString())]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get account info"}},ae=async(e,t,a,r)=>{let n=[];try{let s=[];const o=new i(a),c=new o.eth.Contract(z,r);for(const a of e)if("0"===t){const e=c.methods.getEthBalance(a).encodeABI();s.push({target:r,callData:e})}else{const e=new o.eth.Contract(D,t).methods.balanceOf(a).encodeABI();s.push({target:t,callData:e})}const{returnData:l}=await c.methods.aggregate(s).call();for(let e=0;e<l.length;e++){const t=o.eth.abi.decodeParameter("uint256",l[e]);n.push(t)}}catch(e){console.log("Multicall aggregate failed")}return n},re=async(e,t,a,r,n,s)=>{let o;if(e=e.filter(e=>e&&e.length>30),a in q?o=q[a][t]||{}:(q[a]={},o={}),s&&s.length>0&&n){let a=await ae(e,t,r,s);if(e.length===a.length)for(let t=0;t<e.length;t++)o[e[t]]=a[t]}else for(const a of e)if(a&&!(a in o)){let e;e="0"===t?n?await U(a,r):await H(a,r):n?await V(a,t,r):await Z(a,t,r),e.status&&(o[a]=e.output),await va(200)}return q[a][t]=o,q},ne=(e,t,a,r)=>{let n={};if(!(e in q))return n;a.unshift({address:"0",name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,display_decimals:4});let s=t.length;for(let r=0;r<s;r++){let s=t[r];if(s)for(let t=0;t<a.length;t++){let r=a[t],o="0";if(q[e][r.address]){if(s in q[e][r.address]){o=new b(q[e][r.address][s]).dividedBy(10**r.decimals).toFixed(r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:4,b.ROUND_FLOOR)}n[s]||(n[s]={}),n[s][r.symbol]=o}}}return n},se=(e,t,a)=>{for(let r=0;r<t.length;r++){let n=t[r];for(let t=0;t<a.length;t++){let r=a[t];try{delete q[e][r][n]}catch(e){}}}},oe=(e,t)=>{let a=0;if(e in q&&"0"in q[e])for(let r=0;r<t.length;r++)t[r]in q[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},ie=["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"],ce=[{name:"Ethereum Mainnet",chainId:1,rpcUrl:"https://eth.llamarpc.com",nativeCurrency:{name:"ETH",symbol:"ETH",decimals:18},multicallAddress:"0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441"},{name:"Solana Mainnet",chainId:901,rpcUrl:"https://api.mainnet-beta.solana.com",nativeCurrency:{name:"SOL",symbol:"SOL",decimals:9}}],le=["901","902","903"],ue=e=>le.includes(e)?9:18,de=e=>le.includes(e)?"solana":"evm",pe=e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e),he=e=>e.startsWith("0x")&&42===e.length,{BN:ge}=require("bn.js"),{stripHexPrefix:me}=require("ethereumjs-util"),{BigNumber:fe}=require("bignumber.js");function ye(e){return new ge(me(e.toString("hex")),16)}const we=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function ve(e){return we(e.toString(16))}class be{constructor(e){this.query=new i(i.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,r=ve(function(e,t,a){const r=new ge(t),n=new ge(a);return e.mul(r).div(n)}(ye(t.gasLimit),19,20));try{r=await this.estimateTxGas(e)}catch(e){a={reason:e.message,errorKey:e.errorKey,debug:{blockNumber:t.number,blockGasLimit:t.gasLimit}}}return{blockGasLimit:t.gasLimit,estimatedGasHex:r,simulationFails:a}}async estimateTxGas(e){let t=await this.query.estimateGas(e);return t=new fe(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const r=ye(e),n=ye(t).muln(.9),s=r.muln(a);return r.gt(n)?ve(r):s.lt(n)?ve(s):ve(n)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:r,simulationFails:n}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(we(r),a,t),simulationFails:n}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const ke=require("chalk");require("wative-core");const Se=async e=>{let t=[new o.Separator("————Tx Detail—————-"),`from: ${e.from}`,`to: ${e.to}`,`nonce: ${e.nonce}`,`gasPrice: ${e.gasPrice}`,`data: ${e.data}`,`value: ${e.value}`,`gas: ${e.gas}`,new o.Separator("——————————————-"),"Send it now","Back"],a=await Vt(t),r=t.indexOf(a);return 1===r&&(e.from=await Lt("from",Wt)),2===r&&(e.to=await Lt("to",Wt)),3===r&&(e.nonce=await Lt("nonce")),4===r&&(e.gasPrice=await Lt("gasPrice")),5===r&&(e.data=await ha("data")),6===r&&(e.value=await Lt("value")),7===r&&(e.gas=await Lt("gas")),9===r?e:10===r?null:await Se(e)},xe=async(e,t,a,r,n)=>{const s=await Lt("to",Wt);let o=(new d).add(p.transfer({fromPubkey:new u(r),toPubkey:new u(s),lamports:1e6}));o.add(h.setComputeUnitLimit({units:2e5})),o.add(h.setComputeUnitPrice({microLamports:1e3})),o.feePayer=new u(r);let i=await ee(t);if(!i.status)return void console.log(ke.red(i.output));o.recentBlockhash=i.output.blockhash;const c=await n.account.simulateTransaction(r,t,o);if(!c.status)return void console.log(ke.red(c.output));if(!c.output||!c.output.value||0===c.output.value.unitsConsumed||c.output.value.err)return console.log(ke.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(c.output,null,4)),void console.log("==============================================");let l=new b(c.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,b.ROUND_CEIL),g=new b(l);const m=await Y(t);if(!m.status)return void console.log(ke.red(m.output));const f=new b(m.output.toString()),y=g.multipliedBy(f).dividedBy(1e6).toFixed(0,b.ROUND_CEIL),w=await H(r,t);if(!w.status)return void console.log(ke.red(w.output));const v=new b(w.output).minus(5e3).minus(y);let k=new b(v).dividedBy(1e9).toFixed(4,b.ROUND_FLOOR);if(new b(k)<new b(0))return void console.log(ke.red("Not enough balance"));let S=await _e(k,v.toString(),a,9),x=new d;x.add(h.setComputeUnitLimit({units:Number(g)})),x.add(h.setComputeUnitPrice({microLamports:Number(f)})),x.add(p.transfer({fromPubkey:new u(r),toPubkey:new u(s),lamports:Number(S)})),x.feePayer=new u(r),x.recentBlockhash=i.output.blockhash;const _=await n.account.signTransaction(r,x,t);if(!_.status)return void console.log(ke.red(_.output));let $=await n.account.sendSignedTransaction(r,_.output,t);$.status?(se(e,[r,s],["0"]),console.log(ke.green(`Transaction hash: ${$.output}`))):console.log(ke.red($.output))},_e=async(e,t,a,r)=>{let n=["> Input value",`> Total Balance (${e} ${a})`],s=await Vt(n),o=n.indexOf(s),i="0";if(0===o){let e=await Lt("value",Dt);i=new b(e).multipliedBy(10**r).toFixed(0,b.ROUND_FLOOR)}else 1===o&&(i=t);return new b(i).isLessThanOrEqualTo(new b(t))?i:(console.log(ke.red("Not enough balance")),_e(e,t,a,r))},$e=async(e,t,a)=>{let r=["> Input amount",`> Total Balance (${new b(e).dividedBy(10**a).toFixed(4,b.ROUND_FLOOR)} ${t})`],n=await Vt(r),s=r.indexOf(n),o="0";if(0===s){let e=await Lt("amount",Dt);o=new b(e).multipliedBy(10**a).toFixed(0,b.ROUND_FLOOR)}else 1===s&&(o=e);return new b(o).isLessThanOrEqualTo(new b(e))?o:(console.log(ke.red("Not enough balance")),$e(e,t,a))},Pe=async(e,t,a,r)=>{let n=vt(e,t,a),s=ut(e,n),i=fa(a);if(s!==i&&("evm"===i&&(n="Ethereum Mainnet"),"solana"===i&&(n="Solana Mainnet"),s=ut(e,n)),"evm"===s){if(await pa(`Network (${n}), want a change?`,!1)){const t=bt(e);n=await Vt(t,"Select a network")}}let c=await wt(a,e,n);if(!c.status)return void console.log(ke.red(c.output));const l=dt(e,n);console.log(ke.green(` ${l.nativeCurrency.symbol} Balance: ${c.output}`));const p=["> Send Raw Tx","> Send Token",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(p)){case"> Send Raw Tx":"evm"===i&&await(async(e,t,a,r,n)=>{const s=await Lt("to",Wt),o=new be(t),i=await o.getGasPrice(),c=new b(i.toString()).dividedBy(1e9).toFixed(4,b.ROUND_FLOOR);let l=await Lt(`Gas price (${c}), agree or enter`,Kt)||c;l=new b(l).multipliedBy(1e9).toFixed(0);let u,d,p,h=await X(s,t);if(!h.status)return void console.log(ke.red(h.output));if(u="42161"===e||"421614"===e?"1700000":"21000","0x"===h.output){d="0x";let e=await U(r,t);if(!e.status)return void console.log(ke.red(e.output));let n=new b(e.output),s=new b(l),o=n.minus(s.multipliedBy(Number(u))).toFixed(0,b.ROUND_FLOOR),i=new b(o).dividedBy(1e18).toFixed(4,b.ROUND_FLOOR);if(new b(i)<new b(0))return void console.log(ke.red("Not enough balance"));p=await _e(i,o,a,18)}else d=await ha("data",ga),p=await Lt("value",Dt);const g=await o.getTransactionCount(r),m=await Lt(`Nonce (${g}), agree or enter`);let f={from:r,to:s,nonce:m||g.toString(),gasPrice:l,data:d,value:p};if("0x"===d)f.gas=u;else{let e=f.gasPrice;delete f.gasPrice;try{f.gas=(await o.estimateTxGas(f)).toString()}catch(e){return void console.log(ke.red("Error: "+e))}f.gasPrice=e}if(f=await Se(f),!f)return;const y=await n.account.signTransaction(r,f,t);y.status?(console.log(ke.green(`Transaction hash: ${y.output.transactionHash}`)),n.account.sendSignedTransaction(r,y.output.rawTransaction,t),se(e,[r,s],["0"])):console.log(ke.red(y.output))})(l.chainId.toString(),l.rpcUrl,l.nativeCurrency.symbol,a,r),"solana"===i&&await xe(l.chainId.toString(),l.rpcUrl,l.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===i&&await(async(e,t,a,r,n)=>{let s,o,i;switch(await Vt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Lt("token ticker");let n=await _t(e,a,i);if(0===n.length)return void console.log(ke.red("Token not found"));let c=[];for(let e=0;e<n.length;e++){const a=await V(r,n[e].address,t);if(!a.status)return void console.log(ke.red(a.output));let s=new b(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,b.ROUND_FLOOR);if(1===n.length){c.push(`> 1. ${i} Balance: ${s}`);break}c.push(`> ${e+1}. ${i} Balance: ${s}(${n[e].address})`),c.push(n[e].address)}let l=await Vt(c);const u=n[c.indexOf(l)];s=u.address,o=Number(u.decimals);break;case"> Input token contract address":s=await Lt("token contract address",Wt);let d=await G(s,t);if(!d.status)return void console.log(ke.red(d.output));o=Number(d.output.decimals),i=d.output.name}const c=await Lt("Receipt",Wt),l=await V(r,s,t);if(!l.status)return void console.log(ke.red(l.output));const u=new be(t),d=await u.getGasPrice(),p=new b(d.toString()).dividedBy(1e9).toFixed(4,b.ROUND_FLOOR);let h=await Lt(`Gas price (${p}), agree or enter`,Kt)||p;h=new b(h).multipliedBy(1e9).toFixed(0);let g=await $e(l.output,i,o);const m=await Q(c,g,t),f=await u.getTransactionCount(r),y=await Lt(`Nonce (${f}), agree or enter`);let w={from:r,to:s,nonce:y||f.toString(),gasPrice:h,data:m,value:"0"};if("0x"===m)w.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=w.gasPrice;delete w.gasPrice;try{w.gas=(await u.estimateTxGas(w)).toString()}catch(e){return void console.log(ke.red("Failed to estimate gas, "+e.message))}w.gasPrice=e}if(w=await Se(w),!w)return;const v=await n.account.signTransaction(r,w,t);v.status?(console.log(ke.green(`Transaction hash: ${v.output.transactionHash}`)),n.account.sendSignedTransaction(r,v.output.rawTransaction,t),se(a,[r,c],["0",s])):console.log(ke.red(v.output))})(e,l.rpcUrl,l.chainId.toString(),a,r),"solana"===i&&await(async(e,t,a,r,n)=>{let s,o,i;switch(await Vt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Lt("token ticker");let n=await _t(e,a,i);if(0===n.length)return void console.log(ke.red("Token not found"));let c=[];for(let e=0;e<n.length;e++){const a=await Z(r,n[e].address,t);if(!a.status)return void console.log(ke.red(a.output));let s=new b(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,b.ROUND_FLOOR);if(1===n.length){c.push(`> 1. ${i} Balance: ${s}`);break}c.push(`> ${e+1}. ${i} Balance: ${s}(${n[e].address})`),c.push(n[e].address)}let l=await Vt(c);const u=n[c.indexOf(l)];s=u.address,o=Number(u.decimals);break;case"> Input token contract address":s=await Lt("token contract address",Wt);let d=await W(s,t);if(!d.status)return void console.log(ke.red(d.output));o=Number(d.output.decimals),i=d.output.name}const c=await Lt("Receipt",Wt),l=await Z(r,s,t);if(!l.status)return void console.log(ke.red(l.output));let p=await $e(l.output,i,o),g=await J(s,t);if(!g.status)return void console.log(ke.red(g.output));const m=new u(g.output);let v=f(new u(s),new u(r),!0,m);const k=await te(v.toString(),t);if(!k.status)return void console.log(ke.red(k.output));if(!k.output||k.output.owner.toString()===u.default)return void console.log(ke.red("From token account not found"));let S=f(new u(s),new u(c),!1,m);const x=await te(S.toString(),t);if(!x.status)return void console.log(ke.red(x.output));let _=new d,$=new d;x.output&&x.output.owner.toString()!==u.default||(_.add(y(new u(r),new u(S),new u(c),new u(s),m)),$.add(y(new u(r),new u(S),new u(c),new u(s),m))),_.add(w(v,S,new u(r),Number(p),[],m)),_.add(h.setComputeUnitLimit({units:2e5})),_.add(h.setComputeUnitPrice({microLamports:1e3})),_.feePayer=new u(r);const P=await n.account.simulateTransaction(r,t,_);if(!P.status)return void console.log(ke.red(P.output));if(!P.output||!P.output.value||0===P.output.value.unitsConsumed||P.output.value.err)return console.log(ke.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(P.output,null,4)),void console.log("==============================================");let A=new b(P.output.value.unitsConsumed.toString());A=new b(Math.ceil(1.2*Number(A)));const I=await Y(t);if(!I.status)return void console.log(ke.red(I.output));const C=new b(I.output.toString());$.add(w(v,S,new u(r),Number(p),[],m)),$.add(h.setComputeUnitLimit({units:Number(A)})),$.add(h.setComputeUnitPrice({microLamports:Number(C)})),_.feePayer=new u(r);const N=await n.account.signTransaction(r,$,t);if(!N.status)return void console.log(ke.red(N.output));let O=await n.account.sendSignedTransaction(r,N.output,t);O.status?(se(a,[r,c],["0",s]),console.log(ke.green(`Transaction hash: ${O.output}`))):console.log(ke.red(O.output))})(e,l.rpcUrl,l.chainId.toString(),a,r);break;case"> Back":return}},Ae=async(e,t,a,r)=>{const n=["> SendTx","> SignMessage",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(n)){case"> SendTx":await Pe(e,t,a,r);break;case"> SignMessage":{const e=await ha("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(ke.red(t.output));break}console.log(ke.green("Signature: "+t.output));break}case"> Back":return}await Ae(e,t,a,r)},Ie=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new o.Separator("----------------------------------"),"> Back"],n=await Vt(r);if("> Back"===n)return;"> Send Tx"===n&&(a=await Lt("Input address to send tx",Wt)),"> Search Accounts"===n&&(a=await Lt("Input part address to send tx",zt));let s=t.account.getAccountLabel(a);if(null===s)return console.log(ke.red("Account not found")),void await Ie(e,t);let i=s.account_label,c=na(e,i);if(a=s.account_address,null===i)return console.log(ke.red("Account not found")),void await Ie(e,t);const l=await Rt(e,i,a);if(null===l)return console.log(ke.red("Account not found")),void await Ie(e,t);console.log(ke.green(`Address found!\n address: ${a}\n account name: [${c}]\n account index: #${l}`)),(await Re(e,i,t)).isLoginIn?(await Ae(e,i,a,t),await Ie(e,t)):await Ie(e,t)},Ce=require("chalk");require("dotenv").config();const Ne=require("cli-progress");require("wative-core");const Oe={keystore_slug:"",default_account_index:0},je=async e=>{const t=Fe(e);let a=[];t.accounts&&(a=t.accounts);let r=await ia("Account Name",a);return null===r?null:{account_name:r,password:await da(`Please set a password for Account [${r}]`),selected_default_network:await lt(e)}},Te=async(t,a,n,s,o,i,c)=>{let l=await dt(t,o);"evm"!==de(l.chainId.toString())||s.startsWith("0x")||(s="0x"+s);let u=await i.account.generatePKAccount(n,s,a,l.chainId.toString(),c);if(!u.status)return void console.log(Ce.red(u.output));let d,p=r.join(t,`accounts/${n}.json`);if(e.existsSync(p)){let t=JSON.parse(e.readFileSync(p,"utf8"));if("data"in t){if(t.data.map(e=>e.ciphertexts.address).includes(u.output.ciphertexts.address))return void console.log(Ce.red("The account has already been imported"));t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else t.data=[{ciphertexts:t.ciphertexts}],delete t.ciphertexts,t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else u.output.data=[{ciphertexts:u.output.ciphertexts}],delete u.output.ciphertexts,u.output.default_network=o,d=u.output;e.writeFileSync(p,JSON.stringify(d,null,4)),i.account.reloadAccount()},Ee=async(t,a)=>{const n=["> Import Passphrase","> Import Private Key",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(n)){case"> Import Passphrase":await(async(t,a)=>{let n=await je(t);if(!n)return;let s=await ua("Please enter a mnemonic [split by space]",Ut);s=s.replace(/\s+/g," ");let o=sa(n.account_name);const i=a.account.generatePPAccount(o,s,n.password);if(!i.status)return void console.log(Ce.red(i.output));let c=r.join(t,`accounts/${o}.json`);i.output.default_network=n.selected_default_network,e.writeFileSync(c,JSON.stringify(i.output,null,4));const l=r.resolve(t,"network.json"),u=JSON.parse(e.readFileSync(l,"utf8"));u.accounts.push(n.account_name),e.writeFileSync(l,JSON.stringify(u,null,4))})(t,a);break;case"> Import Private Key":await(async(t,a)=>{let n=await je(t);if(!n)return;let s=await ca("Please enter a private key"),o=sa(n.account_name);await Te(t,n.password,o,s,n.selected_default_network,a,!0);const i=r.resolve(t,"network.json"),c=JSON.parse(e.readFileSync(i,"utf8"));c.accounts.push(n.account_name),e.writeFileSync(i,JSON.stringify(c,null,4))})(t,a);break;case"> Back":return}a.account.reloadAccount()},Fe=t=>{const a=r.resolve(t,"network.json");return JSON.parse(e.readFileSync(a,"utf8"))},Le=(t,a)=>{const n=r.join(t,`accounts/${a}.json`);return JSON.parse(e.readFileSync(n,"utf8"))},Be=(t,a,n)=>{const s=r.join(t,`accounts/${a}.json`);e.writeFileSync(s,JSON.stringify(n,null,4))},Re=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let r=0;r<3;r++){let r,n=na(e,t),s="WATIVE_PASSWD_"+t;if(r=process.env[s]&&""!==process.env[s]?process.env[s]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await la(`Please input the password for Account [${n}]`),!r)return console.log(Ce.red("Password can't be empty")),{isLoginIn:!1};const o=await a.account.login(t,r);if(o.status)return{isLoginIn:!0,password:r};const i=["> Try Again","> Back"],c=await Vt(i,o.output);if("> Back"===c)return{isLoginIn:!1}}return{isLoginIn:!1}},Me=async(e,t)=>{const a=Fe(e).accounts;let r=["> Back",new o.Separator("----------------------------------")];const n=a.length;if(0===n)return void console.log(Ce.red("No address here yet"));for(let t=0;t<n;t++){const n=a[t],s=sa(n),o=Le(e,s);"data"in o?r.push(`${t+1}) ${n} [${o.account_type}:${o.data.length}]`):r.push(`${t+1}) ${n} [${o.account_type}:1]`)}const s=await Vt(r,"Select an account");if("> Back"===s)return;const i=a[r.indexOf(s)-2],c=sa(i);console.log(Ce.green(`Keystore slug: [${c}]`));let l=await Re(e,c,t);l.isLoginIn&&await ze(e,c,t,l.password),await Me(e,t)},qe=async(e,t,a)=>{const r=await Le(e,t);let n=["> Disabled Slots","> Add Single","> Add Range",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(n)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(Ce.red("No disabled slots here yet"));break}let n=r.data,s=["> Back",new o.Separator("----------------------------------")],i=r.default_network;for(let t=0;t<a.length;t++){let r=a[t].from,o=a[t].to,c=i,l=i;"default_network"in n[r]&&(c=n[r].default_network),"default_network"in n[o]&&(l=n[o].default_network);let u,d,p=ut(e,c),h=ut(e,l);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==h&&"solana"!==h)throw new Error(`Invalid network type: ${h}`);u="evm"===p?n[r].ciphertexts.evm.address:n[o].ciphertexts.solana.address,d="evm"===h?n[o].ciphertexts.evm.address:n[o].ciphertexts.solana.address,r===o?s.push(`${t+1}. ${u}[${r}]`):s.push(`${t+1}. ${u}[${r}]-${d}[${o}]`)}let c=await Vt(s);if("> Back"===c)break;if(!await pa(`Are you sure to delete the ${c}?`,!0))break;let l=s.indexOf(c)-2;r.disabled_slots.splice(l,1),Be(e,t,r);break}case"> Add Single":{let a=await Mt(r,"Input address or index");if(null===a){console.log(Ce.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],Be(e,t,r);break}case"> Add Range":{let a=await Bt(r);if(!a){console.log(Ce.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],Be(e,t,r);break}}await qe(e,t)},ze=async(t,a,n,s)=>{let i,c=await Le(t,a);i="PP"===c.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${c.default_network}]`,"> Remove",new o.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${c.default_network}]`,"> Remove",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(i)){case"> Address List":await De(t,a,n);break;case"> Expand Address":{const e=await Lt("Expand accounts count",Ht);if(Number(e)>2e3){console.log(Ce.red("Too many accounts, please input less than 2000"));break}await Ue(t,a,Number(e),n);break}case"> Import Private Key":await(async(t,a,n,s)=>{let o=await Lt("Please enter a private key"),i=r.join(t,`accounts/${n}.json`),c=JSON.parse(e.readFileSync(i,"utf8"));await Te(t,a,n,o,c.default_network,s,!1)})(t,s,a,n);break;case"> Slice Address":{const e=await Lt("Please input last account number",Jt);await He(t,a,Number(e),n);break}case"> Remove Address":await Je(t,a,n);break;case"> Disable Address":await qe(t,a);break;case"> Reset Account Password":{let e=na(t,a);const r=await da(`Please input new password for Account [${e}]`),s=await da(`Please confirm new password for Account [${e}]`);if(!r||!s||r!==s){console.log(Ce.red("Passwords do not match"));break}return void await n.account.resetPassword(a,r)}case`> Switch Networks [${c.default_network}]`:await ft(t,a,!0);break;case"> Remove":return void await Ge(t,a);case"> Back":return}await ze(t,a,n,s)},De=async(e,t,a)=>{const r=await Le(e,t);let n=["> Back",new o.Separator("----------------------------------")],s=r.disabled_slots,i=kt(e),c=r.default_network,l=dt(e,c),u=de(l.chainId.toString()),d=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,c=r.data[e].tag?`(${r.data[e].tag})`:"",l=a.account.checkIsDisableAddress(s,e);t="PP"===r.account_type?"evm"===u?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,l?n.push(new o.Separator(Ce.yellow(`#${e.toString().padEnd(d)} ${ba(t,i.fullAddr)} ${c}`))):n.push(`#${e.toString().padEnd(d)} ${ba(t,i.fullAddr)} ${c}`)}let p,h=Oe.keystore_slug===t?n[Oe.account_index]:n[0],g=Oe.keystore_slug===t&&Oe.account_index>0,m=await xt(e,l.chainId.toString());if(g&&Oe.account_index>15){let e=n.slice(0,Oe.account_index-15);p=n.slice(Oe.account_index-15).concat(e)}else p=n.slice(0);let f=await $a(p,"evm"===u,e,m,l,i.gasToken,i.extendedToken,g,"Select an account",h);"> Back"!==f&&(Oe.keystore_slug=t,Oe.account_index=n.indexOf(f),await Ke(e,t,n.indexOf(f)-2,a),await De(e,t,a))},Ke=async(e,t,a,r)=>{const n=await Le(e,t);let s=n.default_network,i=pt(e,t,a);const c=await dt(e,s),l=await wt(i,e,s);l.status?console.log(Ce.green(` Address No: #${a}\n Network: ${s}\n ${c.nativeCurrency.symbol} Balance: ${l.output}`)):console.log(Ce.green(` Address No: #${a}\n Network: ${s}\n ${c.nativeCurrency.symbol}`));let u="> Tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(u=`> Tag(${n.data[a].tag})`);let d=["> Tools","> Show address","> Assets",u,"> Reload balances","> Dump private key",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(d)){case"> Tools":await Ae(e,t,i,r);break;case"> Show address":await mt(e,t,a);break;case"> Assets":await $t(e,s,i);break;case"> Reload balances":await Pt(e,s,i);break;case u:{let r="Current tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(r=`Current tag (${n.data[a].tag})`);let s=await Lt(r,qt);n.data[a].tag=s.replace(/\s+/g," ").trim(),Be(e,t,n);break}case"> Dump private key":{let n=pt(e,t,a),s=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",s);break}case"> Back":return}},Ue=async(e,t,a,r)=>{const n=await Le(e,t),s=n.data.length,o=new Ne.SingleBar({},Ne.Presets.legacy);o.start(a,0);for(let e=s;e<s+a;e++){let a=await r.account.generateSubAccount(t,e);if(!a.status)return void console.log(Ce.red(a.output));n.data.push({ciphertexts:a.output}),o.increment()}o.stop(),Be(e,t,n),r.account.reloadAccount()},He=async(e,t,a,r)=>{const n=await Le(e,t);n.data=n.data.slice(0,a+1),Be(e,t,n),r.account.reloadAccount()},Je=async(e,t,a)=>{let r=await Lt("Please input the accountIndex to remove this account",Dt);if("0"===r)return void console.log(Ce.red("Can't remove the first account"));let n=await Le(e,t);await pa(`Are you sure you want to remove this account(${n.data[r].ciphertexts.address})`,!0)&&(n.data.splice(Number(r),1),Be(e,t,n),a.account.reloadAccount())},Ge=async(t,a)=>{let n=await Lt("Please input the account name to remove this account"),s=na(t,a);if(n!==s)return void console.log(Ce.red("Can't remove this account"));if(!await pa(`Are you sure you want to remove this account(${s})`,!0))return;let o=r.join(t,`accounts/${a}.json`);e.rmSync(o);const i=r.resolve(t,"network.json");if(!e.existsSync(i))return;const c=JSON.parse(e.readFileSync(i,"utf8"));let l=c.accounts.indexOf(s);c.accounts.splice(l,1),e.writeFileSync(i,JSON.stringify(c,null,2))},We=async(t,a)=>{const n=r.resolve(t,"accounts");e.existsSync(n)||e.mkdirSync(n);let s;switch(s=0===Fe(t).accounts.length?["> Create a new account",new o.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new o.Separator("----------------------------------"),"> Back"],await Vt(s)){case"> Select an account":await Me(t,a);break;case"> Create a new account":await Ee(t,a);break;case"> Back":return}await We(t,a)},Ve=require("chalk"),Ze=async t=>{const a=r.resolve(t,"network.json");if(e.existsSync(a))return;const n={networks:ce,currentNetwork:"Ethereum Mainnet",accounts:[]};e.writeFileSync(a,JSON.stringify(n,null,2))},Xe=async(e,t)=>{let a=["> Edit"];"Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new o.Separator("----------------------------------")),a.push("> Back");switch(await Vt(a)){case"> Edit":await Qe(e,t);break;case"> Remove":await Ye(e,t)}},Qe=async(t,a)=>{const n=r.resolve(t,"network.json"),s=JSON.parse(e.readFileSync(n,"utf8"));let o=[];for(let e=0;e<s.networks.length;e++){const t=s.networks[e];o.push(t.name)}let i=a.rpcUrl,c=a.chainId.toString(),l=a.nativeCurrency.symbol,u=a.name,d=a.multicallAddress,p=a.color;if("Ethereum Mainnet"===a.name||"Solana Mainnet"===a.name)i=await ea(a.chainId.toString(),`Rpc Url (default: ${a.rpcUrl})`,!0);else{if(u=await Lt(`Chain Name (default: ${a.name})`),u&&u!==a.name&&o.includes(u))return void console.log(Ve.red("Chain Name already exists"));c=await Yt(`Chain Id (default: ${a.chainId})`,!0),i=await ea(c||a.chainId,`RPC Url (default: ${a.rpcUrl})`,!0),l=await aa(`Symbol (default: ${a.nativeCurrency.symbol})`),d=await ta(a.multicallAddress?`Multicall Address (Optional) (default: ${a.multicallAddress})`:"Multicall Address (Optional)"),p=await ra(a.color?`Color (Optional): (default: ${a.color})`:"Color (Optional)")}i=i||a.rpcUrl,c=c||a.chainId.toString(),l=l||a.nativeCurrency.symbol,u=u||a.name,d=d||a.multicallAddress,p=p||a.color;let h=ue(c.toString()),g={name:u||a.name,chainId:Number(c)||a.chainId,rpcUrl:i||a.rpcUrl,nativeCurrency:{name:l||a.nativeCurrency.symbol,symbol:l||a.nativeCurrency.symbol,decimals:h||a.nativeCurrency.decimals}};(d||a.multicallAddress)&&(g.multicallAddress=d||a.multicallAddress),(p||a.color)&&(g.color=p||a.color);for(let e=0;e<s.networks.length;e++)if(s.networks[e].name===a.name){s.networks[e]=g;break}e.writeFileSync(n,JSON.stringify(s,null,2))},Ye=async(t,a)=>{const n=r.resolve(t,"network.json");let s=JSON.parse(e.readFileSync(n,"utf8"));for(let e=0;e<s.networks.length;e++)if(s.networks[e].name===a.name){s.networks.splice(e,1);break}a.name===s.currentNetwork&&(s.currentNetwork="Ethereum Mainnet"),e.writeFileSync(n,JSON.stringify(s,null,2))},et=async t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));let s=[];for(let e=0;e<n.networks.length;e++){const t=n.networks[e];s.push(t.name)}console.log(Ve.green("Please input someting about network"));const o=await Lt("Chain Name");if(s.includes(o))return void console.log(Ve.red("Chain Name already exists"));const i=await Yt("Chain Id");if(!i)return;const c=await ea(i,"RPC Url");if(!c)return;const l=await aa("Symbol");if(!l)return;const u=await ta("Multicall Address (Optional)"),d=await ra("Color (Optional)");let p=ue(i.toString()),h={name:o,chainId:Number(i),rpcUrl:c,nativeCurrency:{name:l,symbol:l,decimals:p}};u&&(h.multicallAddress=u),d&&(h.color=d),n.networks.push(h),e.writeFileSync(a,JSON.stringify(n,null,2))},tt=async t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));let s=[],i=[];for(let e=0;e<n.networks.length;e++){const t=n.networks[e];"solana"===de(t.chainId.toString())?i.push(e):s.push(e)}let c=["> Back","+ Add Network",new o.Separator("----Networks(evm)----")];for(let e=0;e<s.length;e++){const t=s[e];let a=`${e+1}.${n.networks[t].name}`;0===e&&(a+=" 🔒"),c.push(a)}c.push(new o.Separator("----Networks(solana)----"));for(let e=0;e<i.length;e++){const t=i[e];let a=`${e+1}.${n.networks[t].name}`;0===e&&(a+=" 🔒"),c.push(a)}const l=await Vt(c);if("> Back"===l)return;if("+ Add Network"===l)return void await et(t);let u,d=c.indexOf(l);u=d<s.length+3?n.networks[s[d-3]]:n.networks[i[d-s.length-4]],await Xe(t,u),await tt(t)},at=async e=>{let t=["> Enhanced Balance Display",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(t)){case"> Enhanced Balance Display":await it(e);break;case"> Back":return}await at(e)},rt=async t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));"status"in n||(n.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let s=[`> Show Full Address [${n.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${n.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${n.status.extendedToken?"ON":"OFF"}]`,new o.Separator("----------------------------------"),"> Back"];const i=await Vt(s);"> Back"!==i&&(i.includes("Full Address")?n.status.fullAddr=await nt():i.includes("Gas Token")?n.status.gasToken=await nt():i.includes("Extended Token")&&(n.status.extendedToken=await nt()),e.writeFileSync(a,JSON.stringify(n,null,2)))},nt=async()=>{switch(await Vt(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},st=(t,a)=>{const n=r.resolve(t,"network.json");let s=JSON.parse(e.readFileSync(n,"utf8")).showTokens;return a in s?s[a]:[]},ot=async t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));let s={};for(let e of n.networks)s[e.chainId.toString()]=e.name;const i=r.resolve(t,"assets.json");if(!ya(i))return void console.log(Ve.red("No asset here yet"));const c=JSON.parse(e.readFileSync(i,"utf8"));let l=[],u=[],d={};for(let e in c){d[l.length]={name:s[e],address:null},l.push(new o.Separator(`----- Networks (${s[e]}) -------`));let a=st(t,s[e]),r=c[e].length;for(let t=0;t<r;t++){let r=c[e][t];a.includes(r.address)&&u.push(`${t+1}.${r.symbol.padEnd(6)} CA: ${Ve.green(`${ba(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`),d[l.length]={name:s[e],address:r.address},l.push(`${t+1}.${r.symbol.padEnd(6)} CA: ${Ve.green(`${ba(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`)}}let p=await Zt(l,"Choose Tokens",u),h={};for(let e=0;e<p.length;e++){let t=p[e],a=d[l.indexOf(t)];a.name in h?h[a.name].push(a.address):h[a.name]=[a.address]}n.showTokens=h,e.writeFileSync(a,JSON.stringify(n,null,2))},it=async e=>{const t=["> Status","> Token List","> Add Token",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(t)){case"> Status":await rt(e);break;case"> Token List":await ot(e);break;case"> Add Token":await It(e);break;case"> Back":return}await it(e)},ct=async e=>{let t=["> Networks","> Dataview",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(t)){case"> Networks":await tt(e);break;case"> Dataview":await at(e);break;case"> Back":return}await ct(e)},lt=async t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8")).networks.map(e=>`> ${e.name}`);return(await Vt(n,"Please select a default network")).slice(2)},ut=(t,a)=>{const n=r.resolve(t,"network.json"),s=JSON.parse(e.readFileSync(n,"utf8"));for(let e=0;e<s.networks.length;e++){const t=s.networks[e];if(t.name===a)return de(t.chainId.toString())}return"unknown"},dt=(t,a)=>{const n=r.resolve(t,"network.json"),s=JSON.parse(e.readFileSync(n,"utf8"));for(let e=0;e<s.networks.length;e++){const t=s.networks[e];if(t.name===a)return t}return null},pt=(e,t,a)=>{const r=Le(e,t);if("PK"===r.account_type)return r.data[a].ciphertexts.address;let n=r.default_network,s=ut(e,n);return"solana"===s?r.data[a].ciphertexts.solana.address:"evm"===s?r.data[a].ciphertexts.evm.address:null},ht=(e,t)=>Le(e,t).ciphertexts.address,gt=async(t,a,n)=>{const s=r.resolve(t,"network.json"),i=JSON.parse(e.readFileSync(s,"utf8")).networks,c=i.length;let l=Le(t,a),u=["> Back",new o.Separator("----------------------------------")],d=l.data[n].default_network;d&&""!==d?u.push("○ Same as the account setting"):u.push("● Same as the account setting");for(let e=0;e<c;e++){const t=i[e];let a;a=de(t.chainId.toString())?l.data[n].ciphertexts.solana.address:l.data[n].ciphertexts.evm.address,t.name===d?u.push(`● ${a} [${t.name}]`):u.push(`○ ${a} [${t.name}]`)}const p=await Vt(u);if("> Back"===p)return;let h=u.indexOf(p);2===h?delete l.data[n].default_network:l.data[n].default_network=i[h-3].name,Be(t,a,l);let g=l.default_network;"default_network"in l.data[n]&&""!==l.data[n].default_network&&(g=l.data[n].default_network);let m=dt(t,g);console.log(Ve.green(` Address No: #${n}\n Network: ${g}\n ${m.nativeCurrency.symbol} Balance: 0`))},mt=async(t,a,n)=>{const s=r.resolve(t,"network.json"),o=JSON.parse(e.readFileSync(s,"utf8")).networks,i=o.length;let c=Le(t,a),l=c.default_network;const u=ut(t,l);for(let e=0;e<i;e++){const a=o[e],r=ut(t,a.name);if("PK"===c.account_type&&u!==r)continue;let s;s="PK"===c.account_type?c.data[n].ciphertexts.address:"evm"===r?c.data[n].ciphertexts.evm.address:c.data[n].ciphertexts.solana.address,a.name===l?console.log(`● ${s} [${a.name}]`):console.log(`○ ${s} [${a.name}]`)}},ft=async(t,a,n)=>{const s=r.resolve(t,"network.json"),i=JSON.parse(e.readFileSync(s,"utf8")).networks,c=i.length;let l=Le(t,a),u=["> Back",new o.Separator("----------------------------------")],d=l.default_network,p="";n||(p=l.ciphertexts.address);let h=[];const g=ut(t,d);for(let e=0;e<c;e++){const a=i[e],r=ut(t,a.name);"PK"===l.account_type&&g!==r||(a.name===d?n?u.push(`● ${a.name}`):u.push(`● ${p} [${a.name}]`):n?u.push(`○ ${a.name}`):u.push(`○ ${p} [${a.name}]`),h.push(a.name))}const m=await Vt(u);if("> Back"===m)return;let f=u.indexOf(m);if(l.default_network=h[f-2],Be(t,a,l),!n){let e=l.default_network,a=dt(t,e);console.log(Ve.green(` Address No: #0\n Network: ${e}\n ${a.nativeCurrency.symbol} Balance: 0`))}},yt=async(e,t,a,r)=>{let n;n="PK"===Le(a,e).account_type?pt(a,e,t):ht(a,e);const s=await wt(n,a,r);s.status,console.log(Ve.green(` Address No: #${t}\n Network: ${r}\n ${s.output}`))},wt=async(e,t,a)=>{const r=dt(t,a),n=r.rpcUrl,s=r.nativeCurrency.decimals;let o;if(o="solana"===de(r.chainId.toString())?await H(e,n):await U(e,n),o.status){let e=new b(o.output.toString());o.output=e.dividedBy(Math.pow(10,s)).toFixed(4,b.ROUND_FLOOR)}return se(r.chainId.toString(),[e],["0"]),o},vt=(e,t,a)=>{const r=Le(e,t);if("PK"===r.account_type)return r.default_network;for(let e=0;e<r.data.length;e++)if(r.data[e].ciphertexts.solana.address===a||r.data[e].ciphertexts.evm.address===a)return"default_network"in r.data[e]?r.data[e].default_network:r.default_network;return null},bt=t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8")).networks,s=n.length;let o=[];for(let e=0;e<s;e++)"evm"===de(n[e].chainId.toString())&&o.push(n[e].name);return o},kt=t=>{const a=r.resolve(t,"network.json");return JSON.parse(e.readFileSync(a,"utf8")).status},St=require("chalk"),xt=async(t,a)=>{let n=r.join(t,"assets.json");if(!ya(n))return[];const s=e.readFileSync(n).toString(),o=JSON.parse(s);return a in o?o[a]:[]},_t=async(e,t,a)=>{const r=await xt(e,t);let n=[];for(let e=0;e<r.length;e++)r[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&n.push(r[e]);return n},$t=async(e,t,a)=>{const r=dt(e,t),n=de(r.chainId.toString()),s=await xt(e,r.chainId.toString());if(!s)return void console.log(St.red("No asset found"));const o=await Ot(a,s,r.rpcUrl,n,r.chainId.toString());let i=1;for(let e=0;e<o.length;e++)"0"!==o[e].balance&&"0.0000"!==o[e].balance&&(console.log(St.green(`${i}. ${o[e].symbol} Balance: ${o[e].balance}`)),i+=1);1===i&&console.log(St.red("No asset found"))},Pt=async(e,t,a)=>{const r=dt(e,t);let n=(await xt(e,r.chainId.toString())).map(e=>e.address);n.push("0"),se(r.chainId.toString(),[a],n)},At=async(t,a,n,s,o,i,c)=>{let l=r.join(t,"assets.json"),u={};if(ya(l)){const t=e.readFileSync(l).toString();u=JSON.parse(t)}void 0===u[a]&&(u[a]=[]);for(let t=0;t<u[a].length;t++)if(u[a][t].address.toLocaleLowerCase()===n.toLocaleLowerCase()||u[a][t].symbol.toLocaleLowerCase()===s.toLocaleLowerCase())return u[a][t]={address:n,symbol:s,name:o,decimals:i,display_decimals:c},void e.writeFileSync(l,JSON.stringify(u,null,4));u[a].push({address:n,symbol:s,name:o,decimals:i,display_decimals:c}),e.writeFileSync(l,JSON.stringify(u,null,4))},It=async t=>{const a=r.resolve(t,"network.json");let n=[],s=JSON.parse(e.readFileSync(a,"utf8")).networks;for(let e=0;e<s.length;e++)n.push(`${e+1}. ${s[e].name}`);let o=(await Vt(n)).split(".")[1].trim();const i=ut(t,o),c=dt(t,o),l=await Lt("Enter contract address",Wt);let u;if("evm"===i){if(!he(l))return void console.log(St.red("evm address format error"));u=await G(l,c.rpcUrl)}else{if(!pe(l))return void console.log(St.red("solana address format error"));u=await W(l,c.rpcUrl)}if(!u.status)return void console.log(St.red(u.output));u.output.name||(u.output.name=await Lt("Please input token name")),u.output.symbol||(u.output.symbol=await Lt("Please input token symbol")),console.log(St.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let d=await Lt("Enter decimals for display",Dt);d=parseInt(d),await At(t,c.chainId.toString(),l,u.output.symbol,u.output.name,u.output.decimals,d)},Ct=async(e,t)=>{const a=ut(e,t),r=dt(e,t),n=await Lt("Enter contract address",Wt);let s;if("evm"===a){if(!he(n))return void console.log(St.red("evm address format error"));s=await G(n,r.rpcUrl)}else{if(!pe(n))return void console.log(St.red("solana address format error"));s=await W(n,r.rpcUrl)}if(!s.status)return void console.log(St.red(s.output));s.output.name||(s.output.name=await Lt("Please input token name")),s.output.symbol||(s.output.symbol=await Lt("Please input token symbol")),console.log(St.green(`Token ${s.output.symbol}(${s.output.name}) loaded successfully.`));let o=await Lt("Enter decimals for display",Dt);o=parseInt(o),await At(e,r.chainId.toString(),n,s.output.symbol,s.output.name,s.output.decimals,o)},Nt=async(e,t,a)=>{const r=["> Show Assets","> Add Asset",new o.Separator("----------------------------------"),"> Back"];switch(await Vt(r)){case"> Show Assets":await $t(e,a,t);break;case"> Add Asset":await Ct(e,a);break;case"> Back":return}await Nt(e,t,a)},Ot=async(e,t,a,r,n)=>{let s=t.length,o=[];for(let n=0;n<s;n++){let s=t[n];"evm"===r?o.push(V(e,s.address,a)):"solana"===r&&o.push(Z(e,s.address,a))}let i=await Promise.all(o),c=[];for(let a=0;a<s;a++){let r=t[a],s=r.decimals;if(!i[a].status)return console.log(St.red(i[a].output)),null;let o=new b(i[a].output).dividedBy(Math.pow(10,s)).toFixed(4,b.ROUND_FLOOR);c.push({address:r.address,symbol:r.symbol,balance:o}),se(n,[e],[r.address])}return se(n,[e],["0"]),c},jt=async(e,t,a,r,n,s,o)=>{let i=a.length,c=dt(e,n),l="evm"===de(c.chainId.toString());if(s&&await re(t,"0",c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:""),o){let s=st(e,n);for(let e=0;e<i;e++){let n=a[e].address;s.includes(n)&&await re(t,n,c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"")}}return ne(c.chainId.toString(),t,a,c)},Tt=require("chalk"),Et=process.env.HOME||process.env.USERPROFILE,Ft=`${Et}/.wative`,Lt=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await o.prompt(a);return r.trim().toString()},Bt=async e=>{for(let t=0;t<5;t++){let t=await Mt(e,"Input start address or index");if(!t)return console.log(Tt.red("Invalid start account index")),null;let a=await Mt(e,"Input end address or index");if(!a)return console.log(Tt.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(Tt.red("Invalid address range"))}return null},Rt=async(t,a,n)=>{let s=r.join(t,`accounts/${a}.json`);if(!e.existsSync(s))return null;let o=JSON.parse(e.readFileSync(s,"utf8")),i=o.data,c=o.account_type,l=i.length;if(0===l)return null;for(let e=0;e<l;e++){if("PK"===c&&i[e].ciphertexts.address.toLocaleLowerCase()===n.toLocaleLowerCase())return e.toString();if("PP"===c&&(i[e].ciphertexts.evm.address.toLocaleLowerCase()===n.toLocaleLowerCase()||i[e].ciphertexts.solana.address.toLocaleLowerCase()===n.toLocaleLowerCase()))return e.toString()}return null},Mt=async(e,t)=>{let a=e.data,r=a.length;if(0===r)return null;let n=[],s=[];for(let e=0;e<r;e++)n.push(a[e].ciphertexts.evm.address.toLocaleLowerCase()),s.push(a[e].ciphertexts.solana.address.toLocaleLowerCase());let o=r-1;for(let e=0;e<5;e++){let e=await Lt(t,Gt),a=fa(e);if("unknown"===a){if(Number(e)>o){console.log(Tt.red("Invalid account index"));continue}return Number(e)}if("evm"===a&&-1!==n.indexOf(e.toLocaleLowerCase()))return n.indexOf(e.toLocaleLowerCase());if("solana"===a&&-1!==s.indexOf(e.toLocaleLowerCase()))return s.indexOf(e.toLocaleLowerCase())}return null},qt=e=>""===e||((e=e.replace(/\s+/g," ").trim()).length>40?"Tag length should be less than 10":!1!==/^[0-9a-zA-Z\s]*$/g.test(e)||"Tag should be alphanumeric"),zt=e=>!(e.length<6)||"Address length should be greater than 6",Dt=e=>!isNaN(Number(e))||"Value should be a number",Kt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",Ut=e=>{const t=(e=e.replace(/\s+/g," ")).split(/\s+/g);if(12!==t.length&&24!==t.length)return"Passphrase should be equal to 12 or 24 words";for(let e=0;e<t.length;e++)if(!1===ie.includes(t[e]))return"Passphrase word should be valid";return!0},Ht=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},Jt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},Gt=e=>!1===isNaN(Number(e))||Wt(e),Wt=e=>"unknown"!=fa(e)||"Address should be valid",Vt=async(e,t,a)=>{const r=[{type:"list",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:n}=await o.prompt(r);return n.toString()},Zt=async(e,t,a)=>{const r=[{type:"checkbox",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:n}=await o.prompt(r);return n},Xt=()=>{console.log(Tt.green(s.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})))},Qt=async()=>{let t=await Lt(`Keystore storage located in (default: ${Ft})`);return t||(t=Ft),t=t.trim(),t=t.replace("~",Et),e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),t},Yt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Lt(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},ea=async(e,t,a=!1)=>{for(let r=0;r<5;r++){let r=await Lt(t);try{if(""===r&&a)return null;if("solana"===de(e.toString()))return r;const t=await K(r);if(!t.status){console.log(Tt.red(t.output));continue}if(t.output.toString()===e.toString())return r;console.log(Tt.red("Rpc url not match chain id"))}catch(e){console.log(Tt.red(e.message))}}return null},ta=async e=>{for(let t=0;t<5;t++){let t=await Lt(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(Tt.red("Multicall address length must be 42"))}return null},aa=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Lt(e);if(""===a)return null;if(t.test(a))return a}return null},ra=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Lt(e);if(""===a)return null;if(t.test(a))return a}return null},na=(e,t)=>{const a=Fe(e).accounts,r=oa(a).indexOf(t);return-1!==r?a[r]:t},sa=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),oa=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(sa(e[a]));return t},ia=async(e,t)=>{let a=oa(t),r=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Lt(e);t=t.trim();let n=sa(t);if(r.test(n)){if(a.includes(n)){console.log(Tt.red("Account name already exists"));continue}return t}}return null},ca=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await o.prompt(a);return r.trim().toString()},la=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await o.prompt(t);return a},ua=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t,transformer:e=>{const t=e.split(" "),a=t.map((e,a)=>a<t.length-1?"#".repeat(e.length):e);return a.join(" ")}}],{inputText:r}=await o.prompt(a);return r.trim().toString()},da=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`,validate:e=>function(e){let t,a="Password must contain at least: \n",r=!0,n=" ",s=Tt.green("✔"),o=Tt.red("✖");return e.length>=8?a+=n+s+" 8 characters\n":(a+=n+o+" 8 characters\n",r=!1),t=/[0-9]/,t.test(e)?a+=n+s+" One numerical character\n":(a+=n+o+" One numerical character\n",r=!1),t=/[A-Z]/,t.test(e)?a+=n+s+" One uppercase letter\n":(a+=n+o+" One uppercase letter\n",r=!1),t=/[!@#$%]/,t.test(e)?a+=n+s+" One sepcial character (i.e. !@#$%)\n":(a+=n+o+" One sepcial character (i.e. !@#$%)\n",r=!1),!!r||a}(e)}];let{password:a}=await o.prompt(t);return a},pa=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await o.prompt(a);return r},ha=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await o.prompt(a);return r.trim().toString()},ga=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},ma=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},fa=e=>e.startsWith("0x")&&42===e.length?"evm":/^[A-HJ-NP-Za-km-z1-9]*$/.test(e)&&e.length<=44&&e.length>=32?"solana":"unknown",ya=t=>(t=t.trim(),e.existsSync(t)),wa=(e,t)=>{let a=[];for(let r=0;r<e.length;r+=t)a.push(e.slice(r,r+t));return a},va=e=>new Promise(t=>setTimeout(t,e)),ba=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),ka=(e,t)=>{if(!e.name)return null;let a=null;if(t)a=/0x[0-9a-fA-f]{40}/.exec(e.name),a=a?a[0]:null;else{let t=/\s+([0-9a-zA-Z]*)/.exec(e.name);a=t?t[1]:null,"Back"===a&&(a=null)}return a},Sa=(e,t,a)=>{let r,n;return e<t/2?a/2<=t?(r=0,n=a/2):(r=0,n=t):a/2<=t?(r=0,n=a/2):(r=e-t/2+1,n=e+t/2+1),{fromIndex:r,toIndex:n}},xa=(e,t)=>{const a=[];for(let r=0;r<e.length;r++){const n=ka(e[r],t);a.push(n)}return a.concat(a)},_a=(e,t,a,r,n,s,o,i,c)=>{for(let l=i;l<c;l++){let i=l>=t.length/2?l-t.length/2:l,c=e[i];if(!c.name)continue;let u=c.name,d=t[l],p="";if(!d)continue;for(let e in a[d])(s||e!==n)&&(o||e===n)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(r[e])} `));let h=u.split("(");if(h.length>1){let t=h[1];e[i].name=h[0]+` ${p}`+`(${t}`}else e[i].name=h[0]+` ${p}`}},$a=async(e,t,a,r,n,s,i,c,l,u)=>{const d=[{type:"list",name:"inputText",message:l||"Choose an option",choices:e,pageSize:30,default:u,loop:!0,filter:e=>e}],p=o.prompt(d);let h,g=0,m=0;for(;!p.ui.activePrompt.answers[p.ui.activePrompt.opt.name];){if(c||await va(1e3),h===p.ui.activePrompt.selected)continue;if(g===p.ui.activePrompt.selected?m+=1:(m=0,g=p.ui.activePrompt.selected),c){m=6,c=!1;const e=p.ui.activePrompt.opt.pageSize,a=xa(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:r,toIndex:s}=Sa(g,e,a.length),o=a.slice(r,s);if(!oe(n.chainId.toString(),o)){m=0;continue}}if(m<5)continue;m=0;const e=p.ui.activePrompt.opt.pageSize,o=xa(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:l,toIndex:u}=Sa(g,e,o.length),d=o.slice(l,u);let f=await jt(a,d,r,n.rpcUrl,n.name,s,i),y={};for(let e in f)for(let t in f[e]){let a=f[e][t].length+1;y[t]?y[t]<a&&(y[t]=a):y[t]=a}const w=n.nativeCurrency.symbol;_a(p.ui.activePrompt.opt.choices.choices,o,f,y,w,s,i,l,u),p.ui.activePrompt.screen.render(""),p.ui.activePrompt.render(),h=g}return p.ui.activePrompt.answers[p.ui.activePrompt.opt.name]},Pa=t=>{const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));n.status||(n.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),n.showTokens||(n.showTokens={});let s=n.accounts.length;for(let a=0;a<s;a++){let o=n.accounts[s-1-a],i=sa(o),c=r.resolve(t,`accounts/${i}.json`);e.existsSync(c)||n.accounts.splice(s-1-a,1)}e.writeFileSync(a,JSON.stringify(n,null,4));let o=n.accounts,i=oa(o);for(let a=0;a<i.length;a++){let n=r.resolve(t,`accounts/${i[a]}.json`),s=JSON.parse(e.readFileSync(n,"utf8"));"PP"!==s.account_type&&("data"in s||(s.data=[{ciphertexts:s.ciphertexts}],delete s.ciphertexts,e.writeFileSync(n,JSON.stringify(s,null,4))))}};require("wative-core");const Aa=async(e,t)=>{switch(await Vt(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await ct(e);break;case"> Accounts":await We(e,t);break;case"> Tools":await Ie(e,t);break;case"> Exit":return}await Aa(e,t)};class Ia{constructor(t,a){this.configDir=t||r.join(require("os").homedir(),".wative/ssh"),this.keystorePath=a||r.join(require("os").homedir(),".wative"),e.existsSync(this.configDir)||e.mkdirSync(this.configDir,{recursive:!0});const n=r.join(this.configDir,"conf.d");e.existsSync(n)||e.mkdirSync(n,{recursive:!0})}getKeystorePath(){return this.keystorePath}getConfigDir(){return this.configDir}async createServiceConfig(e,t,a,r="default_client",n){if(!this.isValidServiceName(e))throw new Error("Invalid service name. Use only alphanumeric characters, hyphens, and underscores.");if(this.isPortInUse(t))throw new Error(`Port ${t} is already in use by another service.`);const s=await this.generateServiceKeyPair(e),o=await this.generateClientKeyPair(e,r),i={name:e,description:n||`Wative SSH Service - ${e}`,ssh:{listen:"127.0.0.1",port:t,log:{size:10485760,backups:3}},keystore:{path:this.keystorePath,allowed_keystores:a},clients:[{name:r,public_key_path:o.publicKey,allowed_keystores:a}],server_keys:{private_key_path:s.privateKey,passphrase:s.passphrase}};return this.saveServiceConfig(e,i),i}loadServiceConfig(t){const a=this.getServiceConfigPath(t);if(!e.existsSync(a))throw new Error(`Service configuration '${t}' not found.`);const r=k.parse(e.readFileSync(a,"utf-8"));return this.parseConfigData(r)}serviceIsExist(t){const a=this.getServiceConfigPath(t);return e.existsSync(r.dirname(a))}listServiceConfigs(){const t=r.join(this.configDir,"conf.d");if(!e.existsSync(t))return[];return e.readdirSync(t).filter(a=>{const n=r.join(t,a);return e.statSync(n).isDirectory()&&e.existsSync(r.join(n,"config.ini"))})}removeServiceConfig(t){const a=this.getServiceConfigPath(t),n=r.dirname(a);e.existsSync(n)&&e.rmSync(n,{recursive:!0})}updateServiceConfig(e,t){const a={...this.loadServiceConfig(e),...t};this.saveServiceConfig(e,a)}async validateKeystorePasswords(e,t){const a={},{WativeCore:r}=require("wative-core");for(const n of e)try{const e=t[n];if(!e){a[n]=!1;continue}const s=new r(this.keystorePath,[n],[e]);a[n]=s.account.isLogin(n)}catch(e){a[n]=!1}return a}isValidServiceName(e){return/^[a-zA-Z0-9_-]+$/.test(e)&&e.length>0&&e.length<=50}isPortInUse(e){const t=this.listServiceConfigs();for(const a of t)try{if(this.loadServiceConfig(a).ssh.port===e)return!0}catch(e){}return!1}async generateServiceKeyPair(t){const a=this.generateSecurePassphrase(),n=r.join(this.configDir,"conf.d",t);e.existsSync(n)||e.mkdirSync(n,{recursive:!0});const s=r.join(n,"server_private_key"),o=r.join(n,"server_public_key.pub");return e.existsSync(s)||(console.log(`Generating SSH server key pair for service '${t}'...`),_(`ssh-keygen -t rsa -b 4096 -f ${s} -N '${a}' -C 'wative_${t}_server'`,{stdio:"inherit"})),{privateKey:s,publicKey:o,passphrase:a}}async generateClientKeyPair(t,a){const n=r.join(this.configDir,"conf.d",t);e.existsSync(n)||e.mkdirSync(n,{recursive:!0});return{privateKey:"",publicKey:r.join(n,`${a}.pub`),passphrase:""}}generateSecurePassphrase(){return S.randomBytes(32).toString("hex")}getServiceConfigPath(e){return r.join(this.configDir,"conf.d",e,"config.ini")}saveServiceConfig(t,a){const n=this.getServiceConfigPath(t),s=r.dirname(n);e.existsSync(s)||e.mkdirSync(s,{recursive:!0});const o=k.stringify(a);e.writeFileSync(n,o)}parseConfigData(e){return{name:e.name,description:e.description,ssh:{listen:e.ssh.listen,port:parseInt(e.ssh.port),log:{size:parseInt(e.ssh.log.size),backups:parseInt(e.ssh.log.backups)}},keystore:{path:e.keystore.path,allowed_keystores:Array.isArray(e.keystore.allowed_keystores)?e.keystore.allowed_keystores:e.keystore.allowed_keystores.split(",")},clients:Array.isArray(e.clients)?e.clients:[e.clients],server_keys:{private_key_path:e.server_keys.private_key_path,passphrase:e.server_keys.passphrase}}}}const Ca=t=>{if(t=t.trim(),!e.existsSync(t))throw new Error("File not exists")};const{WativeCore:Na}=require("wative-core"),{Connection:Oa,PublicKey:ja,VersionedTransaction:Ta,VersionedMessage:Ea}=require("@solana/web3.js"),Fa=require("bs58"),{Keypair:La,TransactionMessage:Ba,ComputeBudgetInstruction:Ra,TransactionInstruction:Ma,ComputeBudgetProgram:qa}=require("@solana/web3.js"),{Wallet:za}=require("@coral-xyz/anchor");C.configure({appenders:{file:{type:"file",filename:process.env.HOME+"/.wative/logs/wative.log",maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"}},categories:{default:{appenders:["file","console"],level:"info"}}});const Da=C.getLogger("file");Da.level="info";class Ka{constructor(e,t,r,n,s,o,i,c){if(this._allowedAppIds=[],this._allowedPubKeys=[],this._allowedKeystoreIds=[],this._sessionIdAppIdMap={},Ca(e),0===r.length||0===n.length||0===s.length||r.length!==n.length||r.length!==s.length)throw new Error("WativeWielderServer:: constructor: Invaild AllowedApp");for(let e=0;e<s.length;e++)for(let t=0;t<s[e].length;t++){const a=s[e][t];if(!i.includes(a))throw new Error("WativeWielderServer:: constructor: Invaild AllowedKeystoreIds")}for(let e of r)this._allowedAppIds.push(Buffer.from(e));for(let e of n){let t=P.parseKey(a(e));this._allowedPubKeys.push(t)}this.wativeCore=new Na(o,i,c),this._idRsaPrivatePath=e,this._idRsaPassphrase=t,this._allowedKeystoreIds=s,this._keystoreDirectoryPath=o}listen(e,t){new A({hostKeys:[{key:a(this._idRsaPrivatePath),passphrase:this._idRsaPassphrase}]},e=>{e.on("authentication",t=>{let a=!0;if(this&&(this.checkValue(Buffer.from(t.username),"appId")||(a=!1)),"publickey"!==t.method||!a)return t.reject();{let e=this.getBytesIndex(Buffer.from(t.username),this._allowedAppIds),a=this._allowedPubKeys[e];if(t.key.algo!==a.type||!this.checkValue(t.key.data,"publicKey")||t.signature&&!0!==a.verify(t.blob,t.signature,t.hashAlgo))return t.reject()}if(a){const a=e._protocol._kex.sessionID.toString("hex");this._sessionIdAppIdMap[a]=Buffer.from(t.username),t.accept()}else t.reject()}).on("ready",()=>{e.on("session",(t,a)=>{t().once("exec",async(t,a,r)=>{const n=e._protocol._kex.sessionID.toString("hex"),s=await this.web3Request(n,r.command),o=t();o&&(JSON.stringify(s)?(o.write(JSON.stringify(s)),o.exit(0),o.end()):(o.write("ssh2 connect error"),o.exit(0),o.end()))})})}).on("close",()=>{Da.info("Client disconnected")}).on("error",e=>{Da.error("err: ",e.message)})}).listen(t,e,function(){Da.info("Listening on port "+t)})}async web3Request(e,t){try{const a=this._sessionIdAppIdMap[e],r=this.getBytesIndex(a,this._allowedAppIds);if(r<0)return{status:!1,msg:"app not found"};let n=JSON.parse(t);Da.info("sign message: ",t);let s=n.method,o=n.keystoreId||n.params.keystoreId,i=n.chainId||n.params.chainId;if(!this._allowedKeystoreIds[r].includes(o))return{status:!1,msg:"keystore not allowed"};let c;if("get_root_account"===s)c=this.getRootAccount(o,i);else if("get_sub_account"===s){let e=n.params;c=this.getSubAccount(o,e.chainId,null==e?void 0:e.startIndex,null==e?void 0:e.endIndex)}else if("sign"===s){let e=n.params;try{c=await this.wativeCore.account.signTransaction(e.txParams.from,e.txParams,e.rpcUrl)}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}}else if("sign_and_send"===s){let e=n.params;try{c={transactionHash:await this.wativeCore.account.signAndSendTx(e.txParams,e.rpcUrl)}}catch(e){return{status:!1,msg:e.msg}}}else if("solana_sign"===s)try{let e=n.params;c=await this.signSolanaTransaction(e.txParams.from,e.txParams.data,e.txParams.lookup_tables,e.rpcUrl,e.priority_fee)}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("solana_send"===s)try{let e=n.params;c=await this.sendSignedSolanaTransaction(e.txParams.from,e.txParams.signature,e.txParams.data,e.rpcUrl)}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("sign_message"===s)try{let e=n.params;Da.debug("sign message: ",e),c=await this.signMessage(e.account,e.message)}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}else{if("sign_typed_data"!==s)return{status:!1,msg:"message method not find"};try{let e=n.params;Da.debug("sign message: ",e),c=await this.signTypedData(e.account,e.domain,e.types_name,e.types,e.message)}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}}return{status:!0,data:c}}catch(e){return Da.error("sign error: ",e.message),{status:!1,msg:e.msg}}}checkValue(e,t){if("appId"!==t&&"publicKey"!==t)return!1;let a=this._allowedAppIds.length;for(let r=0;r<a;r++){let a;a="appId"===t?this._allowedAppIds[r]:this._allowedPubKeys[r].getPublicSSH();const n=e.length!==a.length;n&&(a=e);const s=x(e,a);if(!n&&s)return!0}}getBytesIndex(e,t){let a=t.length;for(let r=0;r<a;r++)if(e.length===t[r].length&&x(e,t[r]))return r;return-1}getRootAccount(e,t){const n=r.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let s,o=a(n);return o=JSON.parse(o.toString()),s="SOLANA"===this.getChainType(t)?o.data[0].ciphertexts.solana.address:o.data[0].ciphertexts.evm.address,[{id:0,address:s,children:o.data.length,type:"M"}]}getChainType(e){return"901"===e||"902"===e||"903"===e?"SOLANA":"EVM"}getSubAccount(e,t,n,s){const o=r.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let i=a(o);i=JSON.parse(i.toString());let c=i.data.length-1;s&&s<c&&(c=s);let l=0;if(n&&n>0&&(l=n),l>c)return[];let u=this.getChainType(t),d=[];for(let e=l;e<=c;e++)d.push(i.data[e].ciphertexts[u.toLocaleLowerCase()].address);return d}async signMessage(e,t){let a=await this.wativeCore.account.signMessage(e,t);return console.log(a),a}async signTypedData(e,t,a,r,n){let s=JSON.parse(t),o=JSON.parse(r),i=JSON.parse(n);console.log(s),console.log(o),console.log(i);let c=this.wativeCore.account.showPrivateKey(e),l=new N.Wallet(c),u=await l.signTypedData(s,{[a]:o},i);return console.log(u),{status:!0,output:u}}async signSolanaTransaction(e,t,a,r,n){let s=new Oa(r),o=[];if(a)for(let e of a){let t=(await s.getAddressLookupTable(new ja(e))).value;o.push(t),await Ua(1e3)}let i=Ea.deserialize(Uint8Array.from(Buffer.from(t,"hex"))),c=Ba.decompile(i);c.instructions.push(qa.setComputeUnitLimit({units:2e6})),c.instructions.push(qa.setComputeUnitPrice({microLamports:1e3})),i=c.compileToV0Message(o),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,await Ua(3e3);let l=new Ta(i),u=this.wativeCore.account.showPrivateKey(e);const d=La.fromSecretKey(new Uint8Array(Fa.decode(u))),p=new za(d);let h=await s.simulateTransaction(l);if(!h||!h.value||0===h.value.unitsConsumed||h.value.err)return{status:!1,output:h.value.err};let g=c.instructions.length,m=Math.trunc(1.2*h.value.unitsConsumed);if(c.instructions[g-2]=qa.setComputeUnitLimit({units:m}),!n||"null"==n)try{n=await this.getPrioritizationFee(r)}catch(e){n=2e5}n<1e4&&(n=1e4),n>5e5&&(n=5e5),c.instructions[g-1]=qa.setComputeUnitPrice({microLamports:n}),i=c.compileToV0Message(o),await Ua(1e3),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,l=new Ta(i),l.feePayer=p.publicKey,await Ua(3e3);let f=await this.wativeCore.account.signTransaction(e,l,r),y=new Ta(f.output.message,f.output.signatures).message.serialize();return y=Buffer.from(y).toString("hex"),{status:!0,output:{transactionHash:Fa.encode(f.output.signatures[0]),message:y,compute_units:h.value.unitsConsumed.toString()}}}async sendSignedSolanaTransaction(e,t,a,r){let n=[Fa.decode(t)],s=Ea.deserialize(Uint8Array.from(Buffer.from(a,"hex"))),o=new Ta(s,n);return await this.wativeCore.account.sendSignedTransaction(e,o,r)}async getPrioritizationFee(e){let t=new ja("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4");const a=new Oa(e,"confirmed");let r=await a.getSignaturesForAddress(t,{limit:5});await Ua(2e3);let n=[];for(let e=0;e<r.length;e++)n.push(r[e].signature);let s=await a.getParsedTransactions(n,{maxSupportedTransactionVersion:0}),o=0;for(let e=0;e<s.length;e++){let t=s[e].transaction.message.instructions;for(let e=0;e<t.length;e++)if("ComputeBudget111111111111111111111111111111"===t[e].programId.toBase58()){let a=t[e].data;try{let e=new Ma({keys:[],programId:new ja("ComputeBudget111111111111111111111111111111"),data:Buffer.from(Fa.decode(a))}),{microLamports:t}=Ra.decodeSetComputeUnitPrice(e);o+=Number(t);continue}catch(e){}}}return Math.ceil(o/5)}}const Ua=e=>new Promise(t=>setTimeout(t,e));"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ha={exports:{}},Ja={name:"wative-core",version:"1.0.21",description:"An agile keystore management toolkit",main:"lib/index.umd.js",module:"lib/index.esm.js",types:"lib/index.d.ts",scripts:{test:"jest",compile:"tsc",build:"rollup --config"},repository:{type:"git",url:""},bugs:{url:"https://github.com"},homepage:"https://github.com",keywords:["keystore","wallet"],author:"",license:"ISC",files:["src/","lib/"],dependencies:{"@babel/plugin-transform-modules-commonjs":"7.24.1","@rollup/plugin-commonjs":"21.0.1","@solana/web3.js":"1.91.8","@types/bs58":"4.0.4","crypto-js":"4.2.0","ethereumjs-wallet":"1.0.2",jest:"27.5.1","micro-ed25519-hdkey":"0.1.2",rollup:"2.79.1","rollup-plugin-terser":"7.0.2","rollup-plugin-typescript2":"0.31.2",tslib:"2.6.2",typescript:"4.9.5",web3:"1.7.3","web3-core":"4.3.2","@coral-xyz/anchor":"0.30.1","@types/crypto-js":"4.2.2","nodejs-threadpool":"1.0.1",tweetnacl:"1.0.3","rpc-websockets":"7.10.0"}};!function(e,t,a,r,n,s,o,i,c,l,u,d){function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function h(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var g=h(t),m=h(a),f=p(r),y=h(n),w=h(s),v=h(o),b=h(l),k=function(){return k=Object.assign||function(e){for(var t,a=1,r=arguments.length;a<r;a++)for(var n in t=arguments[a])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},k.apply(this,arguments)};function S(e,t,a,r){return new(a||(a=Promise))(function(n,s){function o(e){try{c(r.next(e))}catch(e){s(e)}}function i(e){try{c(r.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a(function(e){e(t)})).then(o,i)}c((r=r.apply(e,t||[])).next())})}function x(e,t){var a,r,n,s={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return o.next=i(0),o.throw=i(1),o.return=i(2),"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(i){return function(c){return function(i){if(a)throw new TypeError("Generator is already executing.");for(;o&&(o=0,i[0]&&(s=0)),s;)try{if(a=1,r&&(n=2&i[0]?r.return:i[0]?r.throw||((n=r.return)&&n.call(r),0):r.next)&&!(n=n.call(r,i[1])).done)return n;switch(r=0,n&&(i=[2&i[0],n.value]),i[0]){case 0:case 1:n=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((n=(n=s.trys).length>0&&n[n.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!n||i[1]>n[0]&&i[1]<n[3])){s.label=i[1];break}if(6===i[0]&&s.label<n[1]){s.label=n[1],n=i;break}if(n&&s.label<n[2]){s.label=n[2],s.ops.push(i);break}n[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{a=n=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}"function"==typeof SuppressedError&&SuppressedError;var _=function(e,t){return S(void 0,void 0,void 0,function(){var a,r,n;return x(this,function(s){switch(s.label){case 0:return s.trys.push([0,2,,3]),[4,e.apply(void 0,t)];case 1:return r=s.sent(),a={status:!0,output:r},[3,3];case 2:return n=s.sent(),a={status:!1,output:n.toString()},[3,3];case 3:return[2,a]}})})},$=function(){function e(e){this.web3=new f.default(e)}return e.prototype.getEvmGasPrice=function(){return S(this,void 0,void 0,function(){return x(this,function(e){switch(e.label){case 0:return[4,_(this.web3.eth.getGasPrice,[])];case 1:return[2,e.sent()]}})})},e.prototype.getEvmGasLimit=function(e,t){return S(this,void 0,void 0,function(){return x(this,function(a){switch(a.label){case 0:return[4,_(this.web3.eth.estimateGas,[e,t])];case 1:return[2,a.sent()]}})})},e}(),P=function(e){return e=e.trim(),g.existsSync(e)},A=function(e,t){var a=t.length;if(0===a)return!0;for(var r=0;r<a;r++){var n=m.join(e,"accounts/".concat(t[r],".json"));if(!P(n))return!1}return!0},I=function(e){return(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim()},C=function(e,t){var a=[],r=m.join(e,"network.json");if(!P(r))throw new Error("network.json not found");for(var n=function(e){for(var t=[],a=0;a<e.length;a++)t.push(I(e[a]));return t}(N(r).accounts),s=0;s<t.length;s++)n.includes(t[s])&&a.push(t[s]);return a},N=function(e){var t=g.readFileSync(e).toString();return JSON.parse(t)},O=function(e,t){var a=JSON.stringify(e);g.writeFileSync(t,a)},j=function(e,t){return b.AES.encrypt(e,t).toString()},T=function(e,t){return b.AES.decrypt(e,t).toString(b.enc.Utf8)},E=["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"],F=new f.default(f.default.givenProvider),L=function(){function e(e,t,a,r){if(this.account_passwords={},this.account_ciphertexts={},this.disable_address=!1,this.account_signatures="",this.setting_path=e,this.account_labels=t,0!==t.length){if(a){if(t.length!==a.length)throw new Error("account_labels should have same length for account_passwords");for(var n=0;n<t.length;n++){if(!this.checkPassword(t[n],a[n].trim()))throw new Error("account_passwords is not correct");this.account_passwords[t[n]]=a[n].trim()}}r&&(this.disable_address=r),this.reload()}}return e.prototype.isLogin=function(e){return e in this.account_passwords},e.prototype.reloadAccount=function(){this.reload()},e.prototype.getAccountLabel=function(e){var t=null;for(var a in this.account_ciphertexts)a.toLocaleLowerCase().includes(e.toLocaleLowerCase())&&(t=a);return null===t?null:{account_address:t,account_label:this.account_ciphertexts[t].account_label}},e.prototype.login=function(e,t){return this.checkPassword(e,t)?(this.account_passwords[e]=t,this.account_labels.push(e),this.reload(),{status:!0,output:"Login success"}):{status:!1,output:"Password is not correct"}},e.prototype.getAccounts=function(e){var t=this.getAccountSignature();t!==this.account_signatures&&(this.account_signatures=t,this.reload());for(var a=Object.keys(this.account_ciphertexts),r=[],n=0;n<a.length;n++)this.getAccountChainType(a[n])===e&&r.push(a[n]);return r},e.prototype.checkAccountLabelIsExist=function(e){return A(this.setting_path,[e])},e.prototype.checkAccountIsExist=function(e){return(e=this.getAccountChecksumAddress(e))in this.account_ciphertexts||(this.reload(),e in this.account_ciphertexts)},e.prototype.checkPassword=function(e,t){var a=m.join(this.setting_path,"accounts/".concat(e,".json"));if(!P(a))return!1;var r,n=N(a);r="PK"===n.account_type?k({salt:t},n.data[0].ciphertexts):{slat:t,data:n.pp_ciphertexts};var s=b.SHA256(JSON.stringify(r)).toString();return n.signature===s},e.prototype.showPrivateKey=function(e){if(!this.checkAccountIsExist(e))throw new Error("Account is not exist");e=this.getAccountChecksumAddress(e);var t=this.account_ciphertexts[e],a=this.account_passwords[t.account_label];return T(t.data,a)},e.prototype.getAccountChainType=function(e){return e.startsWith("0x")&&42===e.length?"evm":/^[A-HJ-NP-Za-km-z1-9]*$/.test(e)?"solana":"unknown"},e.prototype.generatePKAccount=function(e,t,a,r,n){if(n&&this.checkAccountLabelIsExist(e))throw new Error("Account labels already exist");if(!n&&!this.account_passwords[e])throw new Error("Password is not correct");n||(a=this.account_passwords[e]);var s,o=j(t,a);try{s=this.getAccountAddressByPrivateKey(t,r)}catch(e){return{status:!1,output:e.message}}var i={address:s,data:o},c=k({salt:a},i),l={signature:b.SHA256(JSON.stringify(c)).toString(),account_type:"PK",tag:"",ciphertexts:i};return n||(this.account_passwords[e]=a,this.account_labels.push(e)),{status:!0,output:l}},e.prototype.generatePPAccount=function(e,t,a){if(this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels already exist"};var r=j(t,a),n={slat:a,data:r},s=b.SHA256(JSON.stringify(n)).toString(),o=this.getSubAccount("evm",t,0);if(!1===o.status)return{status:!1,output:o.output};var i=this.getSubAccount("solana",t,0);if(!1===i.status)return{status:!1,output:i.output};var c={signature:s,account_type:"PP",pp_ciphertexts:r,tag:"",data:[{ciphertexts:{evm:{address:o.output.address,data:j(o.output.pk,a)},solana:{address:i.output.address,data:j(i.output.pk,a)}}}]};return this.account_passwords[e]=a,this.account_labels.push(e),{status:!0,output:c}},e.prototype.generateSubAccount=function(e,t){if(!this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels not exist"};var a=m.join(this.setting_path,"accounts/".concat(e,".json")),r=N(a).pp_ciphertexts,n=T(r,this.account_passwords[e]),s=this.getSubAccount("evm",n,t);if(!1===s.status)return{status:!1,output:s.output};var o=this.getSubAccount("solana",n,t);return!1===o.status?{status:!1,output:o.output}:{status:!0,output:{evm:{address:s.output.address,data:j(s.output.pk,this.account_passwords[e])},solana:{address:o.output.address,data:j(o.output.pk,this.account_passwords[e])}}}},e.prototype.resetPassword=function(e,t){if(!this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels not exist"};if(!this.checkPassword(e,this.account_passwords[e]))return{status:!1,output:"account passwords is not correct"};var a=m.join(this.setting_path,"accounts/".concat(e,".json")),r=N(a);if("PK"===r.account_type){for(var n=r.data,s=0;s<n.length;s++){var o=n[s].ciphertexts.data,i=T(o,this.account_passwords[e]);n[s].ciphertexts.data=j(i,t)}var c=k({salt:t},r.data[0].ciphertexts);return r.signature=b.SHA256(JSON.stringify(c)).toString(),O(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}}var l=T(r.pp_ciphertexts,this.account_passwords[e]);r.pp_ciphertexts=j(l,t);var u={slat:t,data:r.pp_ciphertexts};r.signature=b.SHA256(JSON.stringify(u)).toString();var d=r.data;for(s=0;s<d.length;s++){var p=T(d[s].ciphertexts.evm.data,this.account_passwords[e]);d[s].ciphertexts.evm.data=j(p,t);var h=T(d[s].ciphertexts.solana.data,this.account_passwords[e]);d[s].ciphertexts.solana.data=j(h,t)}return O(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}},e.prototype.signTransaction=function(e,t,a){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?this.signEvmTransaction(t,a):this.signSolanaTransaction(e,a,t):{status:!1,output:"Account is not exist"}},e.prototype.sendSignedTransaction=function(e,t,a){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?this.sendEvmTransaction(t,a):this.sendSolanaTransaction(t,a):{status:!1,output:"Account is not exist"}},e.prototype.signMessage=function(e,t){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?{status:!0,output:this.signEvmMessage(t,e)}:{status:!0,output:this.signSolanaMessage(t,e)}:{status:!1,output:"Account is not exist"}},e.prototype.simulateTransaction=function(e,t,a){return S(this,void 0,void 0,function(){var r,n,s;return x(this,function(o){switch(o.label){case 0:return r=new i.Connection(t),n=this.showPrivateKey(e),s=i.Keypair.fromSecretKey(w.decode(n)),[4,_(r.simulateTransaction.bind(r),[a,[s]])];case 1:return[2,o.sent()]}})})},e.prototype.signEvmTransaction=function(e,t){return S(this,void 0,void 0,function(){var a,r,n,s;return x(this,function(o){switch(o.label){case 0:return this.account_passwords?(a=e.from,e.gas?[3,2]:[4,new $(t).getEvmGasLimit(e,t)]):[2,{status:!1,output:"Please set password first"}];case 1:if(!(r=o.sent()).status)return[2,r];e.gas=r.output,o.label=2;case 2:return e.gasPrice?[3,4]:[4,new $(t).getEvmGasPrice()];case 3:if(!(r=o.sent()).status)return[2,r];e.gasPrice=r.output,o.label=4;case 4:return n=this.showPrivateKey(a),s=new f.default(t),[4,_(s.eth.accounts.signTransaction.bind(s.eth.accounts),[e,n])];case 5:return[2,o.sent()]}})})},e.prototype.sendEvmTransaction=function(e,t){return S(this,void 0,void 0,function(){var a;return x(this,function(r){switch(r.label){case 0:return a=new f.default(t),[4,_(a.eth.sendSignedTransaction.bind(a.eth),[e])];case 1:return[2,r.sent()]}})})},e.prototype.signSolanaTransaction=function(e,t,a){return S(this,void 0,void 0,function(){var r,n,s,o,l;return x(this,function(u){switch(u.label){case 0:return r=this.showPrivateKey(e),n=i.Keypair.fromSecretKey(w.decode(r)),s=new c.Wallet(n),"recentBlockhash"in a&&a.recentBlockhash?[3,2]:(o=new i.Connection(t),[4,_(o.getLatestBlockhash.bind(o),[])]);case 1:if(!(l=u.sent()).status)return[2,{status:!1,output:"Failed to get latest blockhash"}];a.recentBlockhash=l.output.blockhash,u.label=2;case 2:return a.feePayer=s.publicKey,[4,_(s.signTransaction.bind(s),[a])];case 3:return[2,u.sent()]}})})},e.prototype.sendSolanaTransaction=function(e,t){return S(this,void 0,void 0,function(){var a;return x(this,function(r){switch(r.label){case 0:return a=new i.Connection(t),[4,_(a.sendRawTransaction.bind(a),[e.serialize()])];case 1:return[2,r.sent()]}})})},e.prototype.signEvmMessage=function(e,t){var a=this.showPrivateKey(t);return F.eth.accounts.sign(e,a).signature},e.prototype.signSolanaMessage=function(e,t){var a=this.showPrivateKey(t),r=y.sign.detached(new Uint8Array(e.match(/.{1,2}/g).map(function(e){return parseInt(e,16)})),w.decode(a));return w.encode(r)},e.prototype.checkIsDisableAddress=function(e,t){if(!e||!this.disable_address)return!1;for(var a=e.length,r=0;r<a;r++){var n=e[r].from,s=e[r].to;if(t>=n&&t<=s)return!0}return!1},e.prototype.reload=function(){if(this.account_labels=C(this.setting_path,this.account_labels),!A(this.setting_path,this.account_labels))throw new Error("Account labels not exist");for(var e={},t=this.account_labels.length,a=0;a<t;a++){var r=m.join(this.setting_path,"accounts/".concat(this.account_labels[a],".json"));if(g.existsSync(r)){var n=JSON.parse(g.readFileSync(r,"utf8"));if("PK"!==n.account_type){var s=n.data.length,o=n.disabled_slots;for(l=0;l<s;l++)this.checkIsDisableAddress(o,l)||(e[n.data[l].ciphertexts.evm.address]={account_label:this.account_labels[a],data:n.data[l].ciphertexts.evm.data},e[n.data[l].ciphertexts.solana.address]={account_label:this.account_labels[a],data:n.data[l].ciphertexts.solana.data})}else{var i=n.data;if(!i)continue;for(var c=i.length,l=0;l<c;l++)e[i[l].ciphertexts.address]={account_label:this.account_labels[a],data:i[l].ciphertexts.data}}}}this.account_ciphertexts=e},e.prototype.getAccountChecksumAddress=function(e){return"evm"===this.getAccountChainType(e)&&(e=F.utils.toChecksumAddress(e)),e},e.prototype.getAccountAddressByPrivateKey=function(e,t){return"evm"===this.getNetworkTypeByChainId(t)?F.eth.accounts.privateKeyToAccount(e).address:i.Keypair.fromSecretKey(w.decode(e)).publicKey.toBase58()},e.prototype.getNetworkTypeByChainId=function(e){return"901"===e||"902"===e||"903"===e?"solana":"evm"},e.prototype.getSubAccount=function(e,t,a){if(!function(e){var t=e.split(/\s+/g),a=t.length;if(12!==a&&24!==a)return!1;for(var r=0;r<a;r++)if(!E.includes(t[r]))return!1;return!0}(t))return{status:!1,output:"Please set correct mnemonic"};if("solana"===e){var r=v.mnemonicToSeedSync(t),n=d.HDKey.fromMasterSeed(r),s=i.Keypair.fromSeed(n.derive("m/44'/501'/".concat(a,"'/0'")).privateKey);return{status:!0,output:{address:s.publicKey.toBase58(),pk:w.encode(s.secretKey)}}}if("evm"===e){r=v.mnemonicToSeedSync(t);var o=(n=u.hdkey.fromMasterSeed(r)).derivePath("m/44'/60'/0'/0").deriveChild(a).getWallet();return{status:!0,output:{address:F.utils.toChecksumAddress(o.getAddressString()),pk:o.getPrivateKeyString()}}}return{status:!1,output:"Unknown chain type"}},e.prototype.getAccountSignature=function(){for(var e=this.account_labels.length,t=[],a=0;a<e;a++){var r=m.join(this.setting_path,"accounts/".concat(this.account_labels[a],".json")),n=g.readFileSync(r,"utf8");t.push(n)}return b.MD5(JSON.stringify(t)).toString()},e}(),B=Ja,R=function(){function e(e,t,a,r){this.account=new L(e,t,a,r)}return e.version=B.version,e}();e.WativeCore=R,Object.defineProperty(e,"__esModule",{value:!0})}(Ha.exports,t,n,i,O,j,T,c,E,F,L,B);class Ga{constructor(e,t){this.runningServices=new Map,this.configManager=new Ia(e,t),this.pidDir=r.join(this.configManager.getKeystorePath(),"ssh","pids"),this.ensurePidDir(),this.setupLogger()}ensurePidDir(){e.existsSync(this.pidDir)||e.mkdirSync(this.pidDir,{recursive:!0})}async isPortInUse(e,t="127.0.0.1"){return new Promise(a=>{const r=R.createServer();r.listen(e,t,()=>{r.once("close",()=>{a(!1)}),r.close()}),r.on("error",e=>{"EADDRINUSE"===e.code?a(!0):a(!1)})})}getPidFilePath(e){return r.join(this.pidDir,`${e}.pid`)}writePidFile(t,a){const r=this.getPidFilePath(t);e.writeFileSync(r,a.toString())}readPidFile(t){const a=this.getPidFilePath(t);if(!e.existsSync(a))return null;try{const t=e.readFileSync(a,"utf8").trim();return parseInt(t,10)}catch(e){return null}}removePidFile(t){const a=this.getPidFilePath(t);e.existsSync(a)&&e.unlinkSync(a)}isProcessRunning(e){try{return process.kill(e,0),!0}catch(e){return!1}}async startService(e,t){if(this.runningServices.has(e))throw new Error(`Service '${e}' is already running.`);const a=this.configManager.loadServiceConfig(e);if(await this.isPortInUse(a.ssh.port,a.ssh.listen)){const t=`Port ${a.ssh.port} on ${a.ssh.listen} is already in use. Cannot start SSH service '${e}'.`;throw this.logger.error(t),console.error(`Error: ${t}`),new Error(t)}this.logger.info(`Port ${a.ssh.port} on ${a.ssh.listen} is available for service '${e}'`);const r=t||await this.promptForPasswords(a.keystore.allowed_keystores),n=await this.configManager.validateKeystorePasswords(a.keystore.allowed_keystores,r),s=Object.entries(n).filter(([e,t])=>!t).map(([e,t])=>e);if(s.length>0)throw new Error(`Invalid passwords for keystores: ${s.join(", ")}`);const o=this.createServerInstance(a,r);o.listen(a.ssh.listen,a.ssh.port),this.writePidFile(e,process.pid),this.logger.info(`SSH service '${e}' started on ${a.ssh.listen}:${a.ssh.port}`),console.log(`SSH service '${e}' is now running in the background on ${a.ssh.listen}:${a.ssh.port}`);const i={config:a,passwords:r,server:o};this.runningServices.set(e,i),this.setupServiceLogger(e)}async stopService(t){const a=this.runningServices.get(t),n=this.readPidFile(t),s=r.join(this.pidDir,`${t}-daemon.pid`),o=r.join(this.pidDir,`${t}-watcher.pid`);let i=null,c=null;if(e.existsSync(s)){const t=e.readFileSync(s,"utf8").trim();t&&(i=parseInt(t))}if(e.existsSync(o)){const t=e.readFileSync(o,"utf8").trim();t&&(c=parseInt(t))}if(a)a.server&&a.server.close&&a.server.close(),this.runningServices.delete(t);else if(c&&this.isProcessRunning(c))try{process.kill(c,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(c)&&process.kill(c,"SIGKILL");try{e.existsSync(o)&&e.unlinkSync(o),e.existsSync(s)&&e.unlinkSync(s)}catch(e){}},5e3)}catch(t){if(i&&this.isProcessRunning(i))try{process.kill(i,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(i)&&process.kill(i,"SIGKILL")},5e3)}catch(e){}try{e.existsSync(o)&&e.unlinkSync(o),e.existsSync(s)&&e.unlinkSync(s)}catch(e){}}else if(i&&this.isProcessRunning(i))try{process.kill(i,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(i)&&process.kill(i,"SIGKILL")},5e3),e.existsSync(s)&&e.unlinkSync(s)}catch(e){}else{if(!n||!this.isProcessRunning(n))throw new Error(`Service '${t}' is not running.`);try{process.kill(n,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(n)&&process.kill(n,"SIGKILL")},5e3)}catch(e){}}this.removePidFile(t),this.logger.info(`SSH service '${t}' stopped.`)}async restartService(e,t){this.runningServices.has(e)&&await this.stopService(e),await this.startService(e,t)}getRunningServices(){return Array.from(this.runningServices.keys())}getServiceConfig(e){return this.configManager.loadServiceConfig(e)}getServiceStatus(t){if(this.runningServices.has(t))return"running";try{this.configManager.loadServiceConfig(t);const a=r.join(this.pidDir,`${t}-daemon.pid`);if(e.existsSync(a)){const t=e.readFileSync(a,"utf8").trim();if(t){const r=parseInt(t);if(this.isProcessRunning(r))return"running";e.unlinkSync(a)}}const n=this.readPidFile(t);return n&&this.isProcessRunning(n)?"running":(n&&this.removePidFile(t),"stopped")}catch(e){return"not_found"}}async stopAllServices(){const e=Array.from(this.runningServices.keys());for(const t of e)await this.stopService(t)}async createService(e,t,a,r,n){return this.configManager.createServiceConfig(e,t,a,r,n)}async removeService(e){this.runningServices.has(e)&&await this.stopService(e),console.log("serviceName:",e),this.configManager.removeServiceConfig(e),this.logger.info(`Service '${e}' removed.`)}listServices(){return this.configManager.listServiceConfigs().map(e=>{const t=this.getServiceStatus(e);let a,r;try{const t=this.configManager.loadServiceConfig(e);a=t.ssh.port,r=t.description}catch(e){}return{name:e,status:t,port:a,description:r}})}updateServiceKeystores(e,t){this.configManager.updateServiceConfig(e,{keystore:{path:this.configManager.loadServiceConfig(e).keystore.path,allowed_keystores:t}})}async promptForPasswords(e){const t={};for(const a of e){let e,r=!1,n=0;const s=3;for(;!r&&n<s;){e=await la(`Enter password for keystore [${a}]`);try{const o=this.configManager.getKeystorePath();if(r=new Ha.exports.WativeCore(o,[a]).account.checkPassword(a,e),r){t[a]=e;break}if(n++,!(n<s))throw new Error(`Failed to authenticate keystore [${a}] after ${s} attempts.`);console.log(`Invalid password for ${a}`)}catch(e){if(n++,!(n<s))throw new Error(`Failed to authenticate keystore [${a}] after ${s} attempts: ${e.message}`);console.log("Error validating password for keystore")}}}return t}createServerInstance(e,t){const a=e.clients;if(0===a.length)throw new Error("No clients configured for service");if(a.length>1)throw new Error("Only one client is supported for this service");const r=JSON.parse(a[0]),n=[r.name],s=[r.public_key_path],o=[r.allowed_keystores],i=e.keystore.allowed_keystores;if(0===i.length)throw new Error("No keystores configured for service");let c=[];for(const e of i)c.push(t[e]);return new Ka(e.server_keys.private_key_path,e.server_keys.passphrase,n,s,o,e.keystore.path,i,c)}async showLogs(t,a=50,n=!1){const s=process.env.HOME+"/.wative/logs";let o;if(o=t?r.join(s,`${t}.log`):r.join(s,"service_manager.log"),!e.existsSync(o))throw new Error(`Log file not found: ${o}`);const i=$("tail",n?["-f",`-n${a}`,o]:[`-n${a}`,o],{stdio:["ignore","inherit","inherit"]});return n?(process.on("SIGINT",()=>{i.kill("SIGTERM"),process.exit(0)}),new Promise((e,t)=>{i.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})):new Promise((e,t)=>{i.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})}setupLogger(){const t=process.env.HOME+"/.wative/logs";e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),C.configure({appenders:{file:{type:"file",filename:r.join(t,"service_manager.log"),maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"}},categories:{default:{appenders:["file","console"],level:"info"}}}),this.logger=C.getLogger("service_manager"),this.logger.level="info"}setupServiceLogger(t){const a=process.env.HOME+"/.wative/logs";e.existsSync(a)||e.mkdirSync(a,{recursive:!0});const n=r.join(a,`${t}.log`);this.cleanupOldLogs(a),C.configure({appenders:{file:{type:"file",filename:r.join(a,"service_manager.log"),maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"},[`${t}_file`]:{type:"file",filename:n,maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"}},categories:{default:{appenders:["file","console"],level:"info"},[t]:{appenders:[`${t}_file`],level:"info"}}})}cleanupOldLogs(t){try{const a=e.readdirSync(t),n=new Date;n.setDate(n.getDate()-3),a.forEach(a=>{const s=r.join(t,a);e.statSync(s).mtime<n&&a.endsWith(".log")&&(e.unlinkSync(s),this.logger.info(`Deleted old log file: ${a}`))})}catch(e){this.logger.warn(`Failed to cleanup old logs: ${e}`)}}}class Wa{constructor(e){this.config=e}async executeCommand(e){return this.config.useRemoteServer?this.executeCommandThroughRemoteServer(e):new Promise((t,r)=>{const n=new I;n.on("ready",()=>{n.exec(e,(e,a)=>{if(e)return n.end(),r(e);let s="",o="";a.on("close",(e,a)=>{n.end(),0===e?t(s):r(new Error(`Command failed with code ${e}: ${o||s}`))}).on("data",e=>{s+=e.toString()}).stderr.on("data",e=>{o+=e.toString()})})}).on("error",e=>{r(e)});const s=this.config.clientAuth,o={host:this.config.host,port:this.config.port,username:s.username,privateKey:a(s.privateKeyPath),passphrase:s.passphrase};n.connect(o)})}async executeCommandThroughRemoteServer(e){return new Promise((t,r)=>{const n=new I;n.on("ready",()=>{n.forwardOut("127.0.0.1",0,this.config.host,this.config.port,(s,o)=>{if(s)return n.end(),r(s);const i=new I;i.on("ready",()=>{i.exec(e,(e,a)=>{if(e)return i.end(),n.end(),r(e);let s="",o="";a.on("close",(e,a)=>{i.end(),n.end(),0===e?t(s):r(new Error(`Command failed with code ${e}: ${o||s}`))}).on("data",e=>{s+=e.toString()}).stderr.on("data",e=>{o+=e.toString()})})}).on("error",e=>{n.end(),r(e)});const c=this.config.clientAuth,l={sock:o,username:c.username,privateKey:a(c.privateKeyPath),passphrase:c.passphrase};i.connect(l)})}).on("error",e=>{r(e)});const s={host:this.config.remoteServer.host,port:this.config.remoteServer.port||22,username:this.config.remoteServer.auth.username,privateKey:a(this.config.remoteServer.auth.privateKeyPath),passphrase:this.config.remoteServer.auth.passphrase};n.connect(s)})}async sendRequest(e){try{const t=JSON.stringify(e),a=await this.executeCommand(t),r=JSON.parse(a);if(!r.status)throw new Error(r.msg||"Request failed");return r}catch(e){if(e instanceof Error)throw new Error(`SSH request failed: ${e.message}`);throw e}}async getRootAccount(e,t){const a={method:"get_root_account",keystoreId:e,chainId:t};return(await this.sendRequest(a)).data}async getSubAccount(e,t,a,r){const n={method:"get_sub_account",params:{keystoreId:e,chainId:t,startIndex:a,endIndex:r}};return(await this.sendRequest(n)).data}async signTransaction(e,t){const a={method:"sign",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signAndSendTransaction(e,t){const a={method:"sign_and_send",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signSolanaTransaction(e,t,a){const r={method:"solana_sign",params:{txParams:e,rpcUrl:t,priority_fee:a}};return(await this.sendRequest(r)).data}async sendSignedSolanaTransaction(e,t){const a={method:"solana_send",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signMessage(e,t){const a={method:"sign_message",params:{account:e,message:t}};return(await this.sendRequest(a)).data}async signTypedData(e,t,a,r,n){const s={method:"sign_typed_data",params:{account:e,domain:t,types_name:a,types:r,message:n}};return(await this.sendRequest(s)).data}}require("dotenv").config();const Va=async e=>{const t=new Ga;try{if(!e)throw new Error("Configuration name is required. Please specify a configuration name.");console.log(`Starting SSH service with configuration: ${e}`),await t.startService(e),console.log("SSH service started successfully."),process.on("SIGINT",async()=>{console.log("\nShutting down SSH services..."),await t.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nShutting down SSH services..."),await t.stopAllServices(),process.exit(0)})}catch(e){console.error(`Failed to start SSH service: ${e.message}`),process.exit(1)}},Za=process.argv.slice(2),Xa=Za.includes("--daemon"),Qa=Za.indexOf("--config"),Ya=-1!==Qa&&Za[Qa+1]?Za[Qa+1]:void 0;(Xa||Ya)&&Va(Ya).catch(e=>{console.error("Failed to start SSH service:",e),process.exit(1)}),process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)});var er=Object.freeze({__proto__:null,mainWithConfig:Va,WativeSSHClient:Wa,createWativeSSHClient:function(e){return new Wa(e)},WativeWielderServer:Ka,SSHConfigManager:Ia,checkFileExistence:Ca,sleep:function(e=0){return new Promise((t,a)=>{setTimeout(()=>{t(!0)},e)})},getAndGenerateConfig:async t=>{const a="/etc/wative";e.existsSync(a)||e.mkdirSync(a),await(async()=>{const t="/etc/wative",a=r.join(t,"id_rsa_server.pub"),n=r.join(t,"id_rsa_server");e.existsSync(a)&&e.existsSync(n)||(console.log("Generating SSH key pair..."),_(`ssh-keygen -t rsa -f ${n} -N 'wative_server'`,{stdio:"inherit"}));const s=r.join(t,"id_rsa_detake.pub"),o=r.join(t,"id_rsa_detake");e.existsSync(s)&&e.existsSync(o)||(console.log("Generating SSH key pair..."),_(`ssh-keygen -t rsa -f ${o} -N 'wative_detake'`,{stdio:"inherit"}))})();const n=r.join(a,"config.ini");if(!e.existsSync(n)){const a=Fe(t).accounts,r={keystore:{path:t,allowed_keystores:oa(a)},ssh:{listen:"127.0.0.1",port:5678,log:{size:10485760,backups:3}}};let s=k.stringify(r);e.writeFileSync(n,s)}return k.parse(e.readFileSync(n,"utf-8"))}});const tr=new M,ar=require("../package.json");let rr;tr.version(ar.version).description("Wative CLI Tool"),tr.command("version").description("Show the version of wative").action(()=>{console.log(`Wative CLI Tool v${ar.version}`)});const nr=()=>{if(!rr){const e=r.join(process.env.HOME||"",".wative","ssh");rr=new Ga(e)}return rr},sr=tr.command("ssh").description("Manage SSH services");sr.command("start").description("Start SSH service").option("-c, --config <name>","Specify service configuration name").option("-d, --daemon","Run service in daemon mode").action(async t=>{const a=nr();try{t.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1));const n=t.config,s=a.getServiceConfig(n),o=require("net"),i=async(e,t="127.0.0.1")=>new Promise(a=>{const r=o.createServer();r.listen(e,t,()=>{r.once("close",()=>{a(!1)}),r.close()}),r.on("error",e=>{"EADDRINUSE"===e.code?a(!0):a(!1)})});if(await i(s.ssh.port,s.ssh.listen)){const e=`Port ${s.ssh.port} on ${s.ssh.listen} is already in use. Cannot start SSH service '${n}'.`;console.error(`Error: ${e}`),process.exit(1)}if(console.log(`Port ${s.ssh.port} on ${s.ssh.listen} is available for service '${n}'`),t.daemon){console.log(`Starting SSH service '${n}' in daemon mode...`);const t=await a.promptForPasswords(s.keystore.allowed_keystores),o=require("crypto"),i=o.randomBytes(32),c=o.randomBytes(16),l=o.createCipheriv("aes-256-cbc",i,c);let u=l.update(JSON.stringify(t),"utf8","hex");u+=l.final("hex");const d=c.toString("hex")+":"+i.toString("hex")+":"+u;return void((t,a)=>{const n=r.join(process.env.HOME||"",".wative","logs"),s=r.join(process.env.HOME||"",".wative","ssh","pids");e.existsSync(n)||e.mkdirSync(n,{recursive:!0}),e.existsSync(s)||e.mkdirSync(s,{recursive:!0});const o=r.join(n,`${t}-daemon.log`),i=r.join(s,`${t}-daemon.pid`),c=r.join(s,`${t}-watcher.pid`),l=$("node",[r.resolve(__dirname,"daemon-watcher.js"),t,o,i,c,r.resolve(__dirname,"..")],{detached:!0,stdio:"ignore",env:{...process.env,WATIVE_ENCRYPTED_PASSWORDS:a}});e.writeFileSync(c,l.pid.toString()),l.unref(),console.log(`SSH service '${t}' daemon watcher started with PID: ${l.pid}`),console.log(`Daemon log file: ${o}`),console.log(`Watcher PID file: ${c}`)})(n,d)}if(process.env.WATIVE_DAEMON_PASSWORDS&&process.env.WATIVE_WORKER_MODE){const e=require("crypto"),t=process.env.WATIVE_DAEMON_PASSWORDS;delete process.env.WATIVE_DAEMON_PASSWORDS,delete process.env.WATIVE_WORKER_MODE;try{const a=t.split(":"),r=Buffer.from(a[0],"hex"),s=Buffer.from(a[1],"hex"),o=a[2],i=e.createDecipheriv("aes-256-cbc",s,r);let c=i.update(o,"hex","utf8");c+=i.final("utf8");const l=JSON.parse(c);console.log(`[${(new Date).toISOString()}] Worker process starting SSH service '${n}'...`);const u=nr();await u.startService(n,l);for(const e in l)l[e]=null,delete l[e];console.log(`[${(new Date).toISOString()}] SSH service '${n}' started successfully`);const d=async e=>{console.log(`[${(new Date).toISOString()}] Worker received ${e}, stopping service...`);try{await u.stopService(n),console.log(`[${(new Date).toISOString()}] Service stopped successfully`)}catch(e){console.error(`[${(new Date).toISOString()}] Error stopping service:`,e)}process.exit(0)};process.on("SIGTERM",()=>d("SIGTERM")),process.on("SIGINT",()=>d("SIGINT"));const p=setInterval(async()=>{try{const e=await u.getServiceStatus(n);"running"!==e&&(console.log(`[${(new Date).toISOString()}] Service status changed to: ${e}`),"stopped"===e&&(console.log(`[${(new Date).toISOString()}] Service stopped unexpectedly, exiting worker...`),clearInterval(p),process.exit(1)))}catch(e){console.error(`[${(new Date).toISOString()}] Error checking service status:`,e)}},3e4),h=setInterval(()=>{},6e4),g=()=>{clearInterval(p),clearInterval(h)};process.on("exit",g)}catch(e){console.error(`[${(new Date).toISOString()}] Worker process error:`,e),process.exit(1)}return}{await a.startService(n),console.log(`SSH service '${n}' started successfully`),process.on("SIGINT",async()=>{console.log("\nReceived SIGINT, stopping services..."),await a.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nReceived SIGTERM, stopping services..."),await a.stopAllServices(),process.exit(0)});const e=setInterval(()=>{"running"!==a.getServiceStatus(n)&&(console.log(`Service ${n} is no longer running, exiting...`),clearInterval(e),process.exit(1))},5e3);process.stdin.resume()}}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),sr.command("stop").description("Stop SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=nr();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1)),await t.stopService(e.config),console.log(`SSH service '${e.config}' stopped successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),sr.command("restart").description("Restart SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=nr();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1)),await t.restartService(e.config),console.log(`SSH service '${e.config}' restarted successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),sr.command("create").description("Create new SSH service configuration interactively").action(async()=>{const e=require("readline"),t=require("fs"),a=require("path"),r=e.createInterface({input:process.stdin,output:process.stdout}),n=e=>new Promise(t=>{r.question(e,t)});try{console.log("SSH create command started...");const e=a.join(process.env.HOME||"",".wative/ssh"),r=(await n(`SSH storage located in (default: ${e}): `)).trim()||e,s=a.join(process.env.HOME||"",".wative"),o=(await n(`Keystore storage located in (default: ${s}): `)).trim()||s,i=new Ia(r,o);let c,l,u,d;for(;;)if(c=await n("Enter service name: "),c=sa(c),c.trim()){if(!i.serviceIsExist(c)){console.log(`Service name: ${c}`);break}console.log("Service name already exists, please enter a different name")}else console.log("Service name cannot be empty");for(;;){const e=await n("Enter port number: ");if(l=parseInt(e),isNaN(l)||l<1024||l>65535){console.log("Port number must be between 1024-65535");continue}const t=i.listServiceConfigs();let a=!1;for(const e of t)try{if(i.loadServiceConfig(e).ssh.port===l){a=!0;break}}catch(e){}if(!a)break;console.log(`Port ${l} is already in use by another service, please enter a different port`)}for(;;){const e=await n("Enter open keystore slugs (comma separated): ");if(!e.trim()){console.log("Keystore list cannot be empty");continue}if(u=e.split(",").map(e=>e.trim()).filter(e=>e),0===u.length){console.log("At least one valid keystore is required");continue}const r=a.join(o,"accounts");let s=!0;for(const e of u){const n=a.join(r,`${e}.json`);if(!t.existsSync(n)){console.log(`Keystore '${e}' does not exist`),s=!1;break}}if(s){console.log("All keystores verified to exist");break}console.log("Please re-enter valid keystore list")}for(;;){if(d=await n("Enter remote client name: "),d=sa(d),d.trim()){console.log(`Client name: ${d}`);break}console.log("Client name cannot be empty")}const p=a.join(r,"conf.d",c);t.existsSync(p)||t.mkdirSync(p,{recursive:!0});const h=a.join(p,`${d}.pub`);for(console.log("\nPlease place the remote client's public key file at the following path:"),console.log(`${h}`),console.log("\nPress Enter to continue after placing the file...");;){if(await n(""),t.existsSync(h)){console.log("Client public key file found");break}console.log("Client public key file not found, please confirm the file is correctly placed and press Enter again")}const g=await n("Enter service description (optional): ");console.log("\nCreating SSH service configuration...");const m=await i.createServiceConfig(c,l,u,d,g||void 0);console.log("\nNote: Passwords will be requested when starting the service."),console.log(`\nSSH service configuration '${c}' created successfully!`),console.log(`Port: ${l}`),console.log(`Allowed keystores: ${u.join(", ")}`),console.log(`Client name: ${d}`),console.log(`Server private key: ${m.server_keys.private_key_path}`),console.log(`Client public key: ${h}`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}finally{r.close()}}),sr.command("remove").description("Remove SSH service configuration").option("-c, --config <name>","Service configuration name").action(async e=>{const t=nr();try{e.config||(console.error("Error: Configuration name is required for remove command"),process.exit(1)),await t.removeService(e.config),console.log(`SSH service configuration '${e.config}' removed successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),sr.command("list").description("List all SSH service configurations").action(async()=>{const e=new Ia,t=new Ga,a=e.listServiceConfigs();if(0!==a.length){console.log("SSH Service Configurations:");for(const r of a)try{const a=e.loadServiceConfig(r),n=t.getServiceStatus(r);console.log(` - ${r}: ${a.description||"No description"} (${n})`)}catch(e){const a=t.getServiceStatus(r);console.log(` - ${r}: Configuration error (${a})`)}}else console.log("No SSH service configurations found.")}),sr.command("status").description("Show SSH service status").option("-c, --config <name>","Service configuration name").action(async e=>{const t=nr();try{if(e.config){const a=t.getServiceStatus(e.config);console.log(`SSH service '${e.config}' status: ${a}`)}else{const e=t.listServices();if(0===e.length)return void console.log("No SSH service configurations found");console.log("SSH Service Status:"),e.forEach(e=>{const a=t.getServiceStatus(e.name);console.log(` - ${e.name}: ${a}`)})}}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),sr.command("log").description("Show SSH service logs").option("-c, --config <name>","Service configuration name").option("-n, --lines <number>","Number of lines to show (default: 50)","50").option("-f, --follow","Follow log output").action(async e=>{const t=nr();try{const a=parseInt(e.lines)||50;await t.showLogs(e.config,a,e.follow)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),tr.command("cmd").description("Start wallet-cli shell").action(async()=>{try{_("wallet-cli",{stdio:"inherit"})}catch(e){}}),(require.main===module||process.argv[1]&&(process.argv[1].includes("bin/wative.js")||process.argv[1].includes("wative")||process.argv[1].includes("ssh")))&&tr.parse(process.argv);const{WativeCore:or}=require("wative-core"),ir=require("../package.json");require("events").EventEmitter.defaultMaxListeners=0;process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)}),require.main===module&&(async()=>{console.log("version:",ir.version),Xt();const t=await Qt();await Ze(t),Pa(t);const a=r.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(a,"utf8"));let s=oa(n.accounts);const o=new or(t,s,null,!0);await Aa(t,o)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)});export{ce as DEFAULT_NETWORK,be as GasUtil,ie as MNEMONIC_WORDS,le as SOLANA_CHAIN_IDS,er as SSH,yt as accountBalanceLog,Gt as accountIndexOrAddressValidator,We as accountSetting,Ct as addAsset,et as addNetwork,It as addToken,zt as addrValidator,oa as batchGetKeystoreSlugByAccountName,Ot as batchGetTokenBalance,ae as batchGetTokenBalanceViaMulticall,oe as batchHasTokenBalance,Wt as chainAddressValidator,ya as checkFileExistence,wa as chunkArray,pa as confirmSomething,Ze as createNetwork,se as deleteTokenBalance,ha as editorSomething,it as enhancedBalanceDisplay,ma as excutePromiseFunction,Ht as expandAmountValidator,ba as formatAddr,Kt as gasValidator,pt as getAccountAddress,wt as getAccountBalance,U as getAccountBalanceInEvm,H as getAccountBalanceInSolana,fa as getAccountChainType,Mt as getAccountIndex,Rt as getAccountIndexByKeystoreSlug,Le as getAccountInfo,te as getAccountInfoInSolana,ia as getAccountName,na as getAccountNameByKeystoreSlug,Bt as getAccountRange,xt as getAssetList,_t as getAssetListByTokenName,jt as getBatchAccountBalance,Yt as getChainId,K as getChainIdByEvm,de as getChainType,X as getCodeInEvm,ra as getColor,vt as getDefaultNetworkByAddress,bt as getEvmNetworks,Qt as getKeystorePath,sa as getKeystoreSlugByAccountName,ee as getLatestBlockhash,ta as getMulticallAddress,ue as getNativeTokenDecimals,Fe as getNetworkInfo,dt as getNetworkInfoByName,ut as getNetworkTypeByName,ht as getPKAccountAddress,Y as getPrioritizationFee,ea as getRpcUrl,st as getShowTokenList,kt as getStatus,aa as getSymbol,ne as getTokenBalance,V as getTokenBalanceInEvm,Z as getTokenBalanceInSolana,G as getTokenInfoInEvm,W as getTokenInfoInSolana,J as getTokenProgramId,Q as getTransferTokenData,ga as hexValidator,ua as importMaskedPassphrase,ca as inputMaskedPassword,da as inputPassword,la as inputPasswordWithoutValidator,Lt as inputSomething,he as isEvmAddress,pe as isSolanaAddress,Jt as lastAccountNoValidator,$a as listWithLazyBalanceLoading,Re as loginIn,Dt as numberValidator,Ut as passphraseValidator,tr as program,Ye as removeNetwork,Be as saveAccountInfo,At as saveAsset,Zt as selectCheckboxSomething,lt as selectDefaultNetwork,nt as selectFlag,Xe as selectOrEditNetwork,Vt as selectSomething,Ae as selectToolsOptions,xe as sendSolanaRawTransaction,mt as showAllAccounts,Nt as showAssets,$t as showAssetsDetail,tt as showAvailableNetworks,at as showDataview,Xt as showIntroduction,ct as showNetwork,ot as showTokenList,Ie as showTools,va as sleep,ft as switchNetworkByAccountName,gt as switchPPNetwork,qt as tagValidator,re as updateBalance,Qe as updateNetwork,rt as updateStatus,Pa as updateStorage,Pt as updateTokenBalanceOption};
1
+ import*as e from"fs";import t,{readFileSync as a,writeFileSync as r}from"fs";import*as s from"path";import n from"path";import*as o from"figlet";import i from"inquirer";import c from"web3";import l,{Connection as u,PublicKey as d,Transaction as p,SystemProgram as h,ComputeBudgetProgram as g}from"@solana/web3.js";import{getMint as m,getTokenMetadata as f,getAssociatedTokenAddressSync as y,createAssociatedTokenAccountInstruction as w,createTransferInstruction as v}from"@solana/spl-token";import{Metaplex as b}from"@metaplex-foundation/js";import{BigNumber as k}from"bignumber.js";import*as S from"ini";import*as x from"crypto";import{timingSafeEqual as _}from"crypto";import{execSync as $,spawn as P}from"child_process";import{utils as A,Server as I,Client as C}from"ssh2";import*as N from"log4js";import{ethers as O}from"ethers";import j from"tweetnacl";import T from"bs58";import E from"bip39";import F from"@coral-xyz/anchor";import L from"crypto-js";import B from"ethereumjs-wallet";import R from"micro-ed25519-hdkey";import*as D from"net";import{Command as M}from"commander";const q=console.error;console.error=(...e)=>{((new Error).stack||"").toLowerCase().includes("@solana/web3.js")||q.apply(console,e)};const z={},K=[{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall.Call[]",name:"calls",type:"tuple[]"}],name:"aggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes[]",name:"returnData",type:"bytes[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"getEthBalance",outputs:[{internalType:"uint256",name:"balance",type:"uint256"}],stateMutability:"view",type:"function"}],U=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],J=async e=>{let t=new c(e);return await ya(t.eth.getChainId,[])},H=async(e,t)=>{const a=new c(t);return await ya(a.eth.getBalance,[e])},G=async(e,t)=>{const a=new u(t);return await ya(a.getBalance.bind(a),[new d(e)])},W=async(e,t)=>{const a=new u(t),r=new d(e);let s=await ya(a.getAccountInfo.bind(a),[r]);if(!s.status)return{status:!1,output:"Failed to get mint account info"};const n=s.output;if(!n)return{status:!1,output:"Mint account not found"};return{status:!0,output:n.owner.toBase58()}},V=async(e,t)=>{const a=new(new c(t).eth.Contract)([{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],e);let r=await ya(a.methods.symbol().call.bind(a),[]),s=await ya(a.methods.name().call.bind(a),[]),n=await ya(a.methods.decimals().call.bind(a),[]);return r.status&&s.status&&n.status?{status:!0,output:{symbol:r.output,name:s.output,decimals:n.output}}:{status:!1,output:"Failed to get token info"}},Z=async(e,t)=>{let a=await W(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const r=a.output,s=new u(t),n=b.make(s),o=new d(e);let i=await ya(m,[s,o,"finalized",new d(r)]),c={status:!0,output:{symbol:"",name:"",decimals:""}};if(!i.status)return{status:!1,output:"Failed to get token decimals"};c.output.decimals=i.output.decimals;try{const e=n.nfts().pdas().metadata({mint:o});if(await s.getAccountInfo(e)){const e=await n.nfts().findByMint({mintAddress:o});c.output.name=e.name,c.output.symbol=e.symbol}else try{const e=await f(s,o);e&&(e.name&&(c.output.name=e.name),e.symbol&&(c.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return c},X=async(e,t,a)=>{const r=new(new c(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let s=await ya(r.methods.balanceOf(e).call.bind(r),[]);return s.status?{status:!0,output:s.output}:{status:!1,output:"Failed to get token balance"}},Q=async(e,t,a)=>{let r=await W(t,a);if(!r.status)return{status:!1,output:"Failed to get token program id"};const s=r.output,n=new u(a),o=y(new d(t),new d(e),!1,new d(s));let i=await ya(n.getTokenAccountBalance.bind(n),[o]);return i.status?{status:!0,output:i.output.value.amount}:i.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},Y=async(e,t)=>{const a=new c(t);let r=await ya(a.eth.getCode.bind(a),[e]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get code"}},ee=async(e,t,a)=>new c(a).eth.abi.encodeFunctionCall({constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},[e,t]),te=async e=>{const t=new u(e);let a=await ya(t.getRecentPrioritizationFees.bind(t),[]);if(!a.status)return{status:!1,output:"Failed to get recent prioritization fees"};const r=a.output.map(e=>e.prioritizationFee).sort();return{status:!0,output:r.length>0?Math.ceil(r.reduce((e,t)=>e+t)/r.length):1e3}},ae=async e=>{const t=new u(e);let a=await ya(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}},re=async(e,t)=>{const a=new u(t);let r=await ya(a.getAccountInfo.bind(a),[new d(e.toString())]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get account info"}},se=async(e,t,a,r)=>{let s=[];try{let n=[];const o=new c(a),i=new o.eth.Contract(K,r);for(const a of e)if("0"===t){const e=i.methods.getEthBalance(a).encodeABI();n.push({target:r,callData:e})}else{const e=new o.eth.Contract(U,t).methods.balanceOf(a).encodeABI();n.push({target:t,callData:e})}const{returnData:l}=await i.methods.aggregate(n).call();for(let e=0;e<l.length;e++){const t=o.eth.abi.decodeParameter("uint256",l[e]);s.push(t)}}catch(e){console.log("Multicall aggregate failed")}return s},ne=async(e,t,a,r,s,n)=>{let o;if(e=e.filter(e=>e&&e.length>30),a in z?o=z[a][t]||{}:(z[a]={},o={}),n&&n.length>0&&s){let a=await se(e,t,r,n);if(e.length===a.length)for(let t=0;t<e.length;t++)o[e[t]]=a[t]}else for(const a of e)if(a&&!(a in o)){let e;e="0"===t?s?await H(a,r):await G(a,r):s?await X(a,t,r):await Q(a,t,r),e.status&&(o[a]=e.output),await ka(1e3)}return z[a][t]=o,z},oe=(e,t,a,r,s,n)=>{let o={};if(!(e in z))return o;s&&a.unshift({address:"0",name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,display_decimals:4});let i=t.length;for(let r=0;r<i;r++){let i=t[r];if(i)for(let t=0;t<a.length;t++){let r=a[t],c="0";if(("0"===r.address||n.includes(r.address))&&((s||"0"!==r.address)&&z[e][r.address])){if(i in z[e][r.address]){c=new k(z[e][r.address][i]).dividedBy(10**r.decimals).toFixed(r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:4,k.ROUND_FLOOR)}o[i]||(o[i]={}),o[i][r.symbol]=c}}}return o},ie=(e,t,a)=>{for(let r=0;r<t.length;r++){let s=t[r];for(let t=0;t<a.length;t++){let r=a[t];try{delete z[e][r][s]}catch(e){}}}},ce=(e,t)=>{let a=0;if(e in z&&"0"in z[e])for(let r=0;r<t.length;r++)t[r]in z[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},le=["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"],ue=[{name:"Ethereum Mainnet",chainId:1,rpcUrl:"https://eth.llamarpc.com",nativeCurrency:{name:"ETH",symbol:"ETH",decimals:18},multicallAddress:"0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441"},{name:"Solana Mainnet",chainId:901,rpcUrl:"https://api.mainnet-beta.solana.com",nativeCurrency:{name:"SOL",symbol:"SOL",decimals:9}}],de=["901","902","903"],pe=e=>de.includes(e)?9:18,he=e=>de.includes(e)?"solana":"evm",ge=e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e),me=e=>e.startsWith("0x")&&42===e.length,{BN:fe}=require("bn.js"),{stripHexPrefix:ye}=require("ethereumjs-util"),{BigNumber:we}=require("bignumber.js");function ve(e){return new fe(ye(e.toString("hex")),16)}const be=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function ke(e){return be(e.toString(16))}class Se{constructor(e){this.query=new c(c.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,r=ke(function(e,t,a){const r=new fe(t),s=new fe(a);return e.mul(r).div(s)}(ve(t.gasLimit),19,20));try{r=await this.estimateTxGas(e)}catch(e){a={reason:e.message,errorKey:e.errorKey,debug:{blockNumber:t.number,blockGasLimit:t.gasLimit}}}return{blockGasLimit:t.gasLimit,estimatedGasHex:r,simulationFails:a}}async estimateTxGas(e){let t=await this.query.estimateGas(e);return t=new we(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const r=ve(e),s=ve(t).muln(.9),n=r.muln(a);return r.gt(s)?ke(r):n.lt(s)?ke(n):ke(s)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:r,simulationFails:s}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(be(r),a,t),simulationFails:s}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const xe=require("chalk");require("wative-core");const _e=async e=>{let t=[new i.Separator("————Tx Detail—————-"),`from: ${e.from}`,`to: ${e.to}`,`nonce: ${e.nonce}`,`gasPrice: ${e.gasPrice}`,`data: ${e.data}`,`value: ${e.value}`,`gas: ${e.gas}`,new i.Separator("——————————————-"),"Send it now","Back"],a=await Xt(t),r=t.indexOf(a);return 1===r&&(e.from=await Rt("from",Zt)),2===r&&(e.to=await Rt("to",Zt)),3===r&&(e.nonce=await Rt("nonce")),4===r&&(e.gasPrice=await Rt("gasPrice")),5===r&&(e.data=await ma("data")),6===r&&(e.value=await Rt("value")),7===r&&(e.gas=await Rt("gas")),9===r?e:10===r?null:await _e(e)},$e=async(e,t,a,r,s)=>{const n=await Rt("to",Zt);let o=(new p).add(h.transfer({fromPubkey:new d(r),toPubkey:new d(n),lamports:1e6}));o.add(g.setComputeUnitLimit({units:2e5})),o.add(g.setComputeUnitPrice({microLamports:1e3})),o.feePayer=new d(r);let i=await ae(t);if(!i.status)return void console.log(xe.red(i.output));o.recentBlockhash=i.output.blockhash;const c=await s.account.simulateTransaction(r,t,o);if(!c.status)return void console.log(xe.red(c.output));if(!c.output||!c.output.value||0===c.output.value.unitsConsumed||c.output.value.err)return console.log(xe.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(c.output,null,4)),void console.log("==============================================");let l=new k(c.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,k.ROUND_CEIL),u=new k(l);const m=await te(t);if(!m.status)return void console.log(xe.red(m.output));const f=new k(m.output.toString()),y=u.multipliedBy(f).dividedBy(1e6).toFixed(0,k.ROUND_CEIL),w=await G(r,t);if(!w.status)return void console.log(xe.red(w.output));const v=new k(w.output).minus(5e3).minus(y);let b=new k(v).dividedBy(1e9).toFixed(4,k.ROUND_FLOOR);if(new k(b)<new k(0))return void console.log(xe.red("Not enough balance"));let S=await Pe(b,v.toString(),a,9),x=new p;x.add(g.setComputeUnitLimit({units:Number(u)})),x.add(g.setComputeUnitPrice({microLamports:Number(f)})),x.add(h.transfer({fromPubkey:new d(r),toPubkey:new d(n),lamports:Number(S)})),x.feePayer=new d(r),x.recentBlockhash=i.output.blockhash;const _=await s.account.signTransaction(r,x,t);if(!_.status)return void console.log(xe.red(_.output));let $=await s.account.sendSignedTransaction(r,_.output,t);$.status?(ie(e,[r,n],["0"]),console.log(xe.green(`Transaction hash: ${$.output}`))):console.log(xe.red($.output))},Pe=async(e,t,a,r)=>{let s=["> Input value",`> Total Balance (${e} ${a})`],n=await Xt(s),o=s.indexOf(n),i="0";if(0===o){let e=await Rt("value",Ut);i=new k(e).multipliedBy(10**r).toFixed(0,k.ROUND_FLOOR)}else 1===o&&(i=t);return new k(i).isLessThanOrEqualTo(new k(t))?i:(console.log(xe.red("Not enough balance")),Pe(e,t,a,r))},Ae=async(e,t,a)=>{let r=["> Input amount",`> Total Balance (${new k(e).dividedBy(10**a).toFixed(4,k.ROUND_FLOOR)} ${t})`],s=await Xt(r),n=r.indexOf(s),o="0";if(0===n){let e=await Rt("amount",Ut);o=new k(e).multipliedBy(10**a).toFixed(0,k.ROUND_FLOOR)}else 1===n&&(o=e);return new k(o).isLessThanOrEqualTo(new k(e))?o:(console.log(xe.red("Not enough balance")),Ae(e,t,a))},Ie=async(e,t,a,r)=>{let s=kt(e,t,a),n=pt(e,s),o=wa(a);if(n!==o&&("evm"===o&&(s="Ethereum Mainnet"),"solana"===o&&(s="Solana Mainnet"),n=pt(e,s)),"evm"===n){if(await ga(`Network (${s}), want a change?`,!1)){const t=St(e);s=await Xt(t,"Select a network")}}let c=await bt(a,e,s);if(!c.status)return void console.log(xe.red(c.output));const l=ht(e,s);console.log(xe.green(` ${l.nativeCurrency.symbol} Balance: ${c.output}`));const u=["> Send Raw Tx","> Send Token",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(u)){case"> Send Raw Tx":"evm"===o&&await(async(e,t,a,r,s)=>{const n=await Rt("to",Zt),o=new Se(t),i=await o.getGasPrice(),c=new k(i.toString()).dividedBy(1e9).toFixed(4,k.ROUND_FLOOR);let l=await Rt(`Gas price (${c}), agree or enter`,Jt)||c;l=new k(l).multipliedBy(1e9).toFixed(0);let u,d=await Y(n,t);if(!d.status)return void console.log(xe.red(d.output));u="42161"===e||"421614"===e?"1700000":"21000";let p,h,g=new k(0);if("8453"===e&&(g=new k(1e-5).multipliedBy(1e18)),"0x"===d.output){p="0x";let e=await H(r,t);if(!e.status)return void console.log(xe.red(e.output));let s=new k(e.output),n=new k(l),o=s.minus(n.multipliedBy(Number(u))).minus(g).toFixed(0,k.ROUND_FLOOR),i=new k(o).dividedBy(1e18).toFixed(4,k.ROUND_FLOOR);if(new k(i)<new k(0))return void console.log(xe.red("Not enough balance"));h=await Pe(i,o,a,18)}else p=await ma("data",fa),h=await Rt("value",Ut);const m=await o.getTransactionCount(r),f=await Rt(`Nonce (${m}), agree or enter`);let y={from:r,to:n,nonce:f||m.toString(),gasPrice:l,data:p,value:h};if("0x"===p)y.gas=u;else{let e=y.gasPrice;delete y.gasPrice;try{y.gas=(await o.estimateTxGas(y)).toString()}catch(e){return void console.log(xe.red("Error: "+e))}y.gasPrice=e}if(y=await _e(y),!y)return;const w=await s.account.signTransaction(r,y,t);w.status?(console.log(xe.green(`Transaction hash: ${w.output.transactionHash}`)),s.account.sendSignedTransaction(r,w.output.rawTransaction,t),ie(e,[r,n],["0"])):console.log(xe.red(w.output))})(l.chainId.toString(),l.rpcUrl,l.nativeCurrency.symbol,a,r),"solana"===o&&await $e(l.chainId.toString(),l.rpcUrl,l.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===o&&await(async(e,t,a,r,s)=>{let n,o,i;switch(await Xt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Rt("token ticker");let s=await Pt(e,a,i);if(0===s.length)return void console.log(xe.red("Token not found"));let c=[];for(let e=0;e<s.length;e++){const a=await X(r,s[e].address,t);if(!a.status)return void console.log(xe.red(a.output));let n=new k(a.output).dividedBy(10**Number(s[e].decimals)).toFixed(4,k.ROUND_FLOOR);if(1===s.length){c.push(`> 1. ${i} Balance: ${n}`);break}c.push(`> ${e+1}. ${i} Balance: ${n}(${s[e].address})`),c.push(s[e].address)}let l=await Xt(c);const u=s[c.indexOf(l)];n=u.address,o=Number(u.decimals);break;case"> Input token contract address":n=await Rt("token contract address",Zt);let d=await V(n,t);if(!d.status)return void console.log(xe.red(d.output));o=Number(d.output.decimals),i=d.output.name}const c=await Rt("Receipt",Zt),l=await X(r,n,t);if(!l.status)return void console.log(xe.red(l.output));const u=new Se(t),d=await u.getGasPrice(),p=new k(d.toString()).dividedBy(1e9).toFixed(4,k.ROUND_FLOOR);let h=await Rt(`Gas price (${p}), agree or enter`,Jt)||p;h=new k(h).multipliedBy(1e9).toFixed(0);let g=await Ae(l.output,i,o);const m=await ee(c,g,t),f=await u.getTransactionCount(r),y=await Rt(`Nonce (${f}), agree or enter`);let w={from:r,to:n,nonce:y||f.toString(),gasPrice:h,data:m,value:"0"};if("0x"===m)w.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=w.gasPrice;delete w.gasPrice;try{w.gas=(await u.estimateTxGas(w)).toString()}catch(e){return void console.log(xe.red("Failed to estimate gas, "+e.message))}w.gasPrice=e}if(w=await _e(w),!w)return;const v=await s.account.signTransaction(r,w,t);v.status?(console.log(xe.green(`Transaction hash: ${v.output.transactionHash}`)),s.account.sendSignedTransaction(r,v.output.rawTransaction,t),ie(a,[r,c],["0",n])):console.log(xe.red(v.output))})(e,l.rpcUrl,l.chainId.toString(),a,r),"solana"===o&&await(async(e,t,a,r,s)=>{let n,o,i;switch(await Xt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Rt("token ticker");let s=await Pt(e,a,i);if(0===s.length)return void console.log(xe.red("Token not found"));let c=[];for(let e=0;e<s.length;e++){const a=await Q(r,s[e].address,t);if(!a.status)return void console.log(xe.red(a.output));let n=new k(a.output).dividedBy(10**Number(s[e].decimals)).toFixed(4,k.ROUND_FLOOR);if(1===s.length){c.push(`> 1. ${i} Balance: ${n}`);break}c.push(`> ${e+1}. ${i} Balance: ${n}(${s[e].address})`),c.push(s[e].address)}let l=await Xt(c);const u=s[c.indexOf(l)];n=u.address,o=Number(u.decimals);break;case"> Input token contract address":n=await Rt("token contract address",Zt);let d=await Z(n,t);if(!d.status)return void console.log(xe.red(d.output));o=Number(d.output.decimals),i=d.output.name}const c=await Rt("Receipt",Zt),l=await Q(r,n,t);if(!l.status)return void console.log(xe.red(l.output));let u=await Ae(l.output,i,o),h=await W(n,t);if(!h.status)return void console.log(xe.red(h.output));const m=new d(h.output);let f=y(new d(n),new d(r),!0,m);const b=await re(f.toString(),t);if(!b.status)return void console.log(xe.red(b.output));if(!b.output||b.output.owner.toString()===d.default)return void console.log(xe.red("From token account not found"));let S=y(new d(n),new d(c),!1,m);const x=await re(S.toString(),t);if(!x.status)return void console.log(xe.red(x.output));let _=new p,$=new p;x.output&&x.output.owner.toString()!==d.default||(_.add(w(new d(r),new d(S),new d(c),new d(n),m)),$.add(w(new d(r),new d(S),new d(c),new d(n),m))),_.add(v(f,S,new d(r),Number(u),[],m)),_.add(g.setComputeUnitLimit({units:2e5})),_.add(g.setComputeUnitPrice({microLamports:1e3})),_.feePayer=new d(r);const P=await s.account.simulateTransaction(r,t,_);if(!P.status)return void console.log(xe.red(P.output));if(!P.output||!P.output.value||0===P.output.value.unitsConsumed||P.output.value.err)return console.log(xe.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(P.output,null,4)),void console.log("==============================================");let A=new k(P.output.value.unitsConsumed.toString());A=new k(Math.ceil(1.2*Number(A)));const I=await te(t);if(!I.status)return void console.log(xe.red(I.output));const C=new k(I.output.toString());$.add(v(f,S,new d(r),Number(u),[],m)),$.add(g.setComputeUnitLimit({units:Number(A)})),$.add(g.setComputeUnitPrice({microLamports:Number(C)})),_.feePayer=new d(r);const N=await s.account.signTransaction(r,$,t);if(!N.status)return void console.log(xe.red(N.output));let O=await s.account.sendSignedTransaction(r,N.output,t);O.status?(ie(a,[r,c],["0",n]),console.log(xe.green(`Transaction hash: ${O.output}`))):console.log(xe.red(O.output))})(e,l.rpcUrl,l.chainId.toString(),a,r);break;case"> Back":return}},Ce=async(e,t,a,r)=>{const s=["> SendTx","> SignMessage",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(s)){case"> SendTx":await Ie(e,t,a,r);break;case"> SignMessage":{const e=await ma("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(xe.red(t.output));break}console.log(xe.green("Signature: "+t.output));break}case"> Back":return}await Ce(e,t,a,r)},Ne=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new i.Separator("----------------------------------"),"> Back"],s=await Xt(r);if("> Back"===s)return;"> Send Tx"===s&&(a=await Rt("Input address to send tx",Zt)),"> Search Accounts"===s&&(a=await Rt("Input part address to send tx",Kt));let n=t.account.getAccountLabel(a);if(null===n)return console.log(xe.red("Account not found")),void await Ne(e,t);let o=n.account_label,c=oa(e,o);if(a=n.account_address,null===o)return console.log(xe.red("Account not found")),void await Ne(e,t);const l=await Mt(e,o,a);if(null===l)return console.log(xe.red("Account not found")),void await Ne(e,t);console.log(xe.green(`Address found!\n address: ${a}\n account name: [${c}]\n account index: #${l}`)),(await Me(e,o,t)).isLoginIn?(await Ce(e,o,a,t),await Ne(e,t)):await Ne(e,t)},Oe=require("chalk");require("dotenv").config();const je=require("cli-progress");require("wative-core");const Te={keystore_slug:"",default_account_index:0},Ee=async e=>{const t=Be(e);let a=[];t.accounts&&(a=t.accounts);let r=await la("Account Name",a);return null===r?null:{account_name:r,password:await ha(`Please set a password for Account [${r}]`),selected_default_network:await dt(e)}},Fe=async(t,a,r,n,o,i,c)=>{let l=await ht(t,o);"evm"!==he(l.chainId.toString())||n.startsWith("0x")||(n="0x"+n);let u=await i.account.generatePKAccount(r,n,a,l.chainId.toString(),c);if(!u.status)return void console.log(Oe.red(u.output));let d,p=s.join(t,`accounts/${r}.json`);if(e.existsSync(p)){let t=JSON.parse(e.readFileSync(p,"utf8"));if("data"in t){if(t.data.map(e=>e.ciphertexts.address).includes(u.output.ciphertexts.address))return void console.log(Oe.red("The account has already been imported"));t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else t.data=[{ciphertexts:t.ciphertexts}],delete t.ciphertexts,t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else u.output.data=[{ciphertexts:u.output.ciphertexts}],delete u.output.ciphertexts,u.output.default_network=o,d=u.output;e.writeFileSync(p,JSON.stringify(d,null,4)),i.account.reloadAccount()},Le=async(t,a)=>{const r=["> Import Passphrase","> Import Private Key",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(r)){case"> Import Passphrase":await(async(t,a)=>{let r=await Ee(t);if(!r)return;let n=await pa("Please enter a mnemonic [split by space]",Ht);n=n.replace(/\s+/g," ");let o=ia(r.account_name);const i=a.account.generatePPAccount(o,n,r.password);if(!i.status)return void console.log(Oe.red(i.output));let c=s.join(t,`accounts/${o}.json`);i.output.default_network=r.selected_default_network,e.writeFileSync(c,JSON.stringify(i.output,null,4));const l=s.resolve(t,"network.json"),u=JSON.parse(e.readFileSync(l,"utf8"));u.accounts.push(r.account_name),e.writeFileSync(l,JSON.stringify(u,null,4))})(t,a);break;case"> Import Private Key":await(async(t,a)=>{let r=await Ee(t);if(!r)return;let n=await ua("Please enter a private key"),o=ia(r.account_name);await Fe(t,r.password,o,n,r.selected_default_network,a,!0);const i=s.resolve(t,"network.json"),c=JSON.parse(e.readFileSync(i,"utf8"));c.accounts.push(r.account_name),e.writeFileSync(i,JSON.stringify(c,null,4))})(t,a);break;case"> Back":return}a.account.reloadAccount()},Be=t=>{const a=s.resolve(t,"network.json");return JSON.parse(e.readFileSync(a,"utf8"))},Re=(t,a)=>{const r=s.join(t,`accounts/${a}.json`);return JSON.parse(e.readFileSync(r,"utf8"))},De=(t,a,r)=>{const n=s.join(t,`accounts/${a}.json`);e.writeFileSync(n,JSON.stringify(r,null,4))},Me=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let r=0;r<3;r++){let r,s=oa(e,t),n="WATIVE_PASSWD_"+t;if(r=process.env[n]&&""!==process.env[n]?process.env[n]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await da(`Please input the password for Account [${s}]`),!r)return console.log(Oe.red("Password can't be empty")),{isLoginIn:!1};const o=await a.account.login(t,r);if(o.status)return{isLoginIn:!0,password:r};const i=["> Try Again","> Back"],c=await Xt(i,o.output);if("> Back"===c)return{isLoginIn:!1}}return{isLoginIn:!1}},qe=async(e,t)=>{const a=Be(e).accounts;let r=["> Back",new i.Separator("----------------------------------")];const s=a.length;if(0===s)return void console.log(Oe.red("No address here yet"));for(let t=0;t<s;t++){const s=a[t],n=ia(s),o=Re(e,n);"data"in o?r.push(`${t+1}) ${s} [${o.account_type}:${o.data.length}]`):r.push(`${t+1}) ${s} [${o.account_type}:1]`)}const n=await Xt(r,"Select an account");if("> Back"===n)return;const o=a[r.indexOf(n)-2],c=ia(o);console.log(Oe.green(`Keystore slug: [${c}]`));let l=await Me(e,c,t);l.isLoginIn&&await Ke(e,c,t,l.password),await qe(e,t)},ze=async(e,t,a)=>{const r=await Re(e,t);let s=["> Disabled Slots","> Add Single","> Add Range",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(s)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(Oe.red("No disabled slots here yet"));break}let s=r.data,n=["> Back",new i.Separator("----------------------------------")],o=r.default_network;for(let t=0;t<a.length;t++){let r=a[t].from,i=a[t].to,c=o,l=o;"default_network"in s[r]&&(c=s[r].default_network),"default_network"in s[i]&&(l=s[i].default_network);let u,d,p=pt(e,c),h=pt(e,l);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==h&&"solana"!==h)throw new Error(`Invalid network type: ${h}`);u="evm"===p?s[r].ciphertexts.evm.address:s[i].ciphertexts.solana.address,d="evm"===h?s[i].ciphertexts.evm.address:s[i].ciphertexts.solana.address,r===i?n.push(`${t+1}. ${u}[${r}]`):n.push(`${t+1}. ${u}[${r}]-${d}[${i}]`)}let c=await Xt(n);if("> Back"===c)break;if(!await ga(`Are you sure to delete the ${c}?`,!0))break;let l=n.indexOf(c)-2;r.disabled_slots.splice(l,1),De(e,t,r);break}case"> Add Single":{let a=await qt(r,"Input address or index");if(null===a){console.log(Oe.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],De(e,t,r);break}case"> Add Range":{let a=await Dt(r);if(!a){console.log(Oe.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],De(e,t,r);break}}await ze(e,t)},Ke=async(t,a,r,n)=>{let o,c=await Re(t,a);o="PP"===c.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${c.default_network}]`,"> Remove",new i.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${c.default_network}]`,"> Remove",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(o)){case"> Address List":await Ue(t,a,r);break;case"> Expand Address":{const e=await Rt("Expand accounts count",Gt);if(Number(e)>2e3){console.log(Oe.red("Too many accounts, please input less than 2000"));break}await He(t,a,Number(e),r);break}case"> Import Private Key":await(async(t,a,r,n)=>{let o=await Rt("Please enter a private key"),i=s.join(t,`accounts/${r}.json`),c=JSON.parse(e.readFileSync(i,"utf8"));await Fe(t,a,r,o,c.default_network,n,!1)})(t,n,a,r);break;case"> Slice Address":{const e=await Rt("Please input last account number",Wt);await Ge(t,a,Number(e),r);break}case"> Remove Address":await We(t,a,r);break;case"> Disable Address":await ze(t,a);break;case"> Reset Account Password":{let e=oa(t,a);const s=await ha(`Please input new password for Account [${e}]`),n=await ha(`Please confirm new password for Account [${e}]`);if(!s||!n||s!==n){console.log(Oe.red("Passwords do not match"));break}return void await r.account.resetPassword(a,s)}case`> Switch Networks [${c.default_network}]`:await wt(t,a,!0);break;case"> Remove":return void await Ve(t,a);case"> Back":return}await Ke(t,a,r,n)},Ue=async(e,t,a)=>{const r=await Re(e,t);let s=["> Back",new i.Separator("----------------------------------")],n=r.disabled_slots,o=xt(e),c=r.default_network,l=ht(e,c),u=he(l.chainId.toString()),d=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,c=r.data[e].tag?`(${r.data[e].tag})`:"",l=a.account.checkIsDisableAddress(n,e);t="PP"===r.account_type?"evm"===u?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,l?s.push(new i.Separator(Oe.yellow(`#${e.toString().padEnd(d)} ${Sa(t,o.fullAddr)} ${c}`))):s.push(`#${e.toString().padEnd(d)} ${Sa(t,o.fullAddr)} ${c}`)}let p,h=Te.keystore_slug===t?s[Te.account_index]:s[0],g=Te.keystore_slug===t&&Te.account_index>0,m=await $t(e,l.chainId.toString());if(g&&Te.account_index>15){let e=s.slice(0,Te.account_index-15);p=s.slice(Te.account_index-15).concat(e)}else p=s.slice(0);let f=await Aa(p,"evm"===u,e,m,l,o.gasToken,o.extendedToken,g,"Select an account",h);"> Back"!==f&&(Te.keystore_slug=t,Te.account_index=s.indexOf(f),await Je(e,t,s.indexOf(f)-2,a),await Ue(e,t,a))},Je=async(e,t,a,r)=>{const s=await Re(e,t);let n=s.default_network,o=gt(e,t,a);const c=await ht(e,n),l=await bt(o,e,n);l.status?console.log(Oe.green(` Address No: #${a}\n Network: ${n}\n ${c.nativeCurrency.symbol} Balance: ${l.output}`)):console.log(Oe.green(` Address No: #${a}\n Network: ${n}\n ${c.nativeCurrency.symbol}`));let u="> Tag";"tag"in s.data[a]&&""!==s.data[a].tag&&(u=`> Tag(${s.data[a].tag})`);let d=["> Tools","> Show address","> Assets",u,"> Reload balances","> Dump private key",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(d)){case"> Tools":await Ce(e,t,o,r);break;case"> Show address":await yt(e,t,a);break;case"> Assets":await At(e,n,o);break;case"> Reload balances":await It(e,n,o);break;case u:{let r="Current tag";"tag"in s.data[a]&&""!==s.data[a].tag&&(r=`Current tag (${s.data[a].tag})`);let n=await Rt(r,zt);s.data[a].tag=n.replace(/\s+/g," ").trim(),De(e,t,s);break}case"> Dump private key":{let s=gt(e,t,a),n=await r.account.showPrivateKey(s);console.log("account: ",s),console.log("private key: ",n);break}case"> Back":return}},He=async(e,t,a,r)=>{const s=await Re(e,t),n=s.data.length,o=new je.SingleBar({},je.Presets.legacy);o.start(a,0);for(let e=n;e<n+a;e++){let a=await r.account.generateSubAccount(t,e);if(!a.status)return void console.log(Oe.red(a.output));s.data.push({ciphertexts:a.output}),o.increment()}o.stop(),De(e,t,s),r.account.reloadAccount()},Ge=async(e,t,a,r)=>{const s=await Re(e,t);s.data=s.data.slice(0,a+1),De(e,t,s),r.account.reloadAccount()},We=async(e,t,a)=>{let r=await Rt("Please input the accountIndex to remove this account",Ut);if("0"===r)return void console.log(Oe.red("Can't remove the first account"));let s=await Re(e,t);await ga(`Are you sure you want to remove this account(${s.data[r].ciphertexts.address})`,!0)&&(s.data.splice(Number(r),1),De(e,t,s),a.account.reloadAccount())},Ve=async(t,a)=>{let r=await Rt("Please input the account name to remove this account"),n=oa(t,a);if(r!==n)return void console.log(Oe.red("Can't remove this account"));if(!await ga(`Are you sure you want to remove this account(${n})`,!0))return;let o=s.join(t,`accounts/${a}.json`);e.rmSync(o);const i=s.resolve(t,"network.json");if(!e.existsSync(i))return;const c=JSON.parse(e.readFileSync(i,"utf8"));let l=c.accounts.indexOf(n);c.accounts.splice(l,1),e.writeFileSync(i,JSON.stringify(c,null,2))},Ze=async(t,a)=>{const r=s.resolve(t,"accounts");e.existsSync(r)||e.mkdirSync(r);let n;switch(n=0===Be(t).accounts.length?["> Create a new account",new i.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new i.Separator("----------------------------------"),"> Back"],await Xt(n)){case"> Select an account":await qe(t,a);break;case"> Create a new account":await Le(t,a);break;case"> Back":return}await Ze(t,a)},Xe=require("chalk"),Qe=async t=>{const a=s.resolve(t,"network.json");if(e.existsSync(a))return;const r={networks:ue,currentNetwork:"Ethereum Mainnet",accounts:[]};e.writeFileSync(a,JSON.stringify(r,null,2))},Ye=async(e,t)=>{let a=["> Edit"];"Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new i.Separator("----------------------------------")),a.push("> Back");switch(await Xt(a)){case"> Edit":await et(e,t);break;case"> Remove":await tt(e,t)}},et=async(t,a)=>{const r=s.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(r,"utf8"));let o=[];for(let e=0;e<n.networks.length;e++){const t=n.networks[e];o.push(t.name)}let i=a.rpcUrl,c=a.chainId.toString(),l=a.nativeCurrency.symbol,u=a.name,d=a.multicallAddress,p=a.color;if("Ethereum Mainnet"===a.name||"Solana Mainnet"===a.name)i=await aa(a.chainId.toString(),`Rpc Url (default: ${a.rpcUrl})`,!0);else{if(u=await Rt(`Chain Name (default: ${a.name})`),u&&u!==a.name&&o.includes(u))return void console.log(Xe.red("Chain Name already exists"));c=await ta(`Chain Id (default: ${a.chainId})`,!0),i=await aa(c||a.chainId,`RPC Url (default: ${a.rpcUrl})`,!0),l=await sa(`Symbol (default: ${a.nativeCurrency.symbol})`),d=await ra(a.multicallAddress?`Multicall Address (Optional) (default: ${a.multicallAddress})`:"Multicall Address (Optional)"),p=await na(a.color?`Color (Optional): (default: ${a.color})`:"Color (Optional)")}i=i||a.rpcUrl,c=c||a.chainId.toString(),l=l||a.nativeCurrency.symbol,u=u||a.name,d=d||a.multicallAddress,p=p||a.color;let h=pe(c.toString()),g={name:u||a.name,chainId:Number(c)||a.chainId,rpcUrl:i||a.rpcUrl,nativeCurrency:{name:l||a.nativeCurrency.symbol,symbol:l||a.nativeCurrency.symbol,decimals:h||a.nativeCurrency.decimals}};(d||a.multicallAddress)&&(g.multicallAddress=d||a.multicallAddress),(p||a.color)&&(g.color=p||a.color);for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===a.name){n.networks[e]=g;break}e.writeFileSync(r,JSON.stringify(n,null,2))},tt=async(t,a)=>{const r=s.resolve(t,"network.json");let n=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===a.name){n.networks.splice(e,1);break}a.name===n.currentNetwork&&(n.currentNetwork="Ethereum Mainnet"),e.writeFileSync(r,JSON.stringify(n,null,2))},at=async t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));let n=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];n.push(t.name)}console.log(Xe.green("Please input someting about network"));const o=await Rt("Chain Name");if(n.includes(o))return void console.log(Xe.red("Chain Name already exists"));const i=await ta("Chain Id");if(!i)return;const c=await aa(i,"RPC Url");if(!c)return;const l=await sa("Symbol");if(!l)return;const u=await ra("Multicall Address (Optional)"),d=await na("Color (Optional)");let p=pe(i.toString()),h={name:o,chainId:Number(i),rpcUrl:c,nativeCurrency:{name:l,symbol:l,decimals:p}};u&&(h.multicallAddress=u),d&&(h.color=d),r.networks.push(h),e.writeFileSync(a,JSON.stringify(r,null,2))},rt=async t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));let n=[],o=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];"solana"===he(t.chainId.toString())?o.push(e):n.push(e)}let c=["> Back","+ Add Network",new i.Separator("----Networks(evm)----")];for(let e=0;e<n.length;e++){const t=n[e];let a=`${e+1}.${r.networks[t].name}`;0===e&&(a+=" 🔒"),c.push(a)}c.push(new i.Separator("----Networks(solana)----"));for(let e=0;e<o.length;e++){const t=o[e];let a=`${e+1}.${r.networks[t].name}`;0===e&&(a+=" 🔒"),c.push(a)}const l=await Xt(c);if("> Back"===l)return;if("+ Add Network"===l)return void await at(t);let u,d=c.indexOf(l);u=d<n.length+3?r.networks[n[d-3]]:r.networks[o[d-n.length-4]],await Ye(t,u),await rt(t)},st=async e=>{let t=["> Enhanced Balance Display",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(t)){case"> Enhanced Balance Display":await lt(e);break;case"> Back":return}await st(e)},nt=async t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));"status"in r||(r.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let n=[`> Show Full Address [${r.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${r.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${r.status.extendedToken?"ON":"OFF"}]`,new i.Separator("----------------------------------"),"> Back"];const o=await Xt(n);"> Back"!==o&&(o.includes("Full Address")?r.status.fullAddr=await ot():o.includes("Gas Token")?r.status.gasToken=await ot():o.includes("Extended Token")&&(r.status.extendedToken=await ot()),e.writeFileSync(a,JSON.stringify(r,null,2)))},ot=async()=>{switch(await Xt(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},it=(t,a)=>{const r=s.resolve(t,"network.json");let n=JSON.parse(e.readFileSync(r,"utf8")).showTokens;return a in n?n[a]:[]},ct=async t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));let n={};for(let e of r.networks)n[e.chainId.toString()]=e.name;const o=s.resolve(t,"assets.json");if(!va(o))return void console.log(Xe.red("No asset here yet"));const c=JSON.parse(e.readFileSync(o,"utf8"));let l=[],u=[],d={};for(let e in c){d[l.length]={name:n[e],address:null},l.push(new i.Separator(`----- Networks (${n[e]}) -------`));let a=it(t,n[e]),r=c[e].length;for(let t=0;t<r;t++){let r=c[e][t];a.includes(r.address)&&u.push(`${t+1}.${r.symbol.padEnd(6)} CA: ${Xe.green(`${Sa(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`),d[l.length]={name:n[e],address:r.address},l.push(`${t+1}.${r.symbol.padEnd(6)} CA: ${Xe.green(`${Sa(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`)}}let p=await Qt(l,"Choose Tokens",u),h={};for(let e=0;e<p.length;e++){let t=p[e],a=d[l.indexOf(t)];a.name in h?h[a.name].push(a.address):h[a.name]=[a.address]}r.showTokens=h,e.writeFileSync(a,JSON.stringify(r,null,2))},lt=async e=>{const t=["> Status","> Token List","> Add Token",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(t)){case"> Status":await nt(e);break;case"> Token List":await ct(e);break;case"> Add Token":await Nt(e);break;case"> Back":return}await lt(e)},ut=async e=>{let t=["> Networks","> Dataview",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(t)){case"> Networks":await rt(e);break;case"> Dataview":await st(e);break;case"> Back":return}await ut(e)},dt=async t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8")).networks.map(e=>`> ${e.name}`);return(await Xt(r,"Please select a default network")).slice(2)},pt=(t,a)=>{const r=s.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<n.networks.length;e++){const t=n.networks[e];if(t.name===a)return he(t.chainId.toString())}return"unknown"},ht=(t,a)=>{const r=s.resolve(t,"network.json"),n=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<n.networks.length;e++){const t=n.networks[e];if(t.name===a)return t}return null},gt=(e,t,a)=>{const r=Re(e,t);if("PK"===r.account_type)return r.data[a].ciphertexts.address;let s=r.default_network,n=pt(e,s);return"solana"===n?r.data[a].ciphertexts.solana.address:"evm"===n?r.data[a].ciphertexts.evm.address:null},mt=(e,t)=>Re(e,t).ciphertexts.address,ft=async(t,a,r)=>{const n=s.resolve(t,"network.json"),o=JSON.parse(e.readFileSync(n,"utf8")).networks,c=o.length;let l=Re(t,a),u=["> Back",new i.Separator("----------------------------------")],d=l.data[r].default_network;d&&""!==d?u.push("○ Same as the account setting"):u.push("● Same as the account setting");for(let e=0;e<c;e++){const t=o[e];let a;a=he(t.chainId.toString())?l.data[r].ciphertexts.solana.address:l.data[r].ciphertexts.evm.address,t.name===d?u.push(`● ${a} [${t.name}]`):u.push(`○ ${a} [${t.name}]`)}const p=await Xt(u);if("> Back"===p)return;let h=u.indexOf(p);2===h?delete l.data[r].default_network:l.data[r].default_network=o[h-3].name,De(t,a,l);let g=l.default_network;"default_network"in l.data[r]&&""!==l.data[r].default_network&&(g=l.data[r].default_network);let m=ht(t,g);console.log(Xe.green(` Address No: #${r}\n Network: ${g}\n ${m.nativeCurrency.symbol} Balance: 0`))},yt=async(t,a,r)=>{const n=s.resolve(t,"network.json"),o=JSON.parse(e.readFileSync(n,"utf8")).networks,i=o.length;let c=Re(t,a),l=c.default_network;const u=pt(t,l);for(let e=0;e<i;e++){const a=o[e],s=pt(t,a.name);if("PK"===c.account_type&&u!==s)continue;let n;n="PK"===c.account_type?c.data[r].ciphertexts.address:"evm"===s?c.data[r].ciphertexts.evm.address:c.data[r].ciphertexts.solana.address,a.name===l?console.log(`● ${n} [${a.name}]`):console.log(`○ ${n} [${a.name}]`)}},wt=async(t,a,r)=>{const n=s.resolve(t,"network.json"),o=JSON.parse(e.readFileSync(n,"utf8")).networks,c=o.length;let l=Re(t,a),u=["> Back",new i.Separator("----------------------------------")],d=l.default_network,p="";r||(p=l.ciphertexts.address);let h=[];const g=pt(t,d);for(let e=0;e<c;e++){const a=o[e],s=pt(t,a.name);"PK"===l.account_type&&g!==s||(a.name===d?r?u.push(`● ${a.name}`):u.push(`● ${p} [${a.name}]`):r?u.push(`○ ${a.name}`):u.push(`○ ${p} [${a.name}]`),h.push(a.name))}const m=await Xt(u);if("> Back"===m)return;let f=u.indexOf(m);if(l.default_network=h[f-2],De(t,a,l),!r){let e=l.default_network,a=ht(t,e);console.log(Xe.green(` Address No: #0\n Network: ${e}\n ${a.nativeCurrency.symbol} Balance: 0`))}},vt=async(e,t,a,r)=>{let s;s="PK"===Re(a,e).account_type?gt(a,e,t):mt(a,e);const n=await bt(s,a,r);n.status,console.log(Xe.green(` Address No: #${t}\n Network: ${r}\n ${n.output}`))},bt=async(e,t,a)=>{const r=ht(t,a),s=r.rpcUrl,n=r.nativeCurrency.decimals;let o;if(o="solana"===he(r.chainId.toString())?await G(e,s):await H(e,s),o.status){let e=new k(o.output.toString());o.output=e.dividedBy(Math.pow(10,n)).toFixed(4,k.ROUND_FLOOR)}return ie(r.chainId.toString(),[e],["0"]),o},kt=(e,t,a)=>{const r=Re(e,t);if("PK"===r.account_type)return r.default_network;for(let e=0;e<r.data.length;e++)if(r.data[e].ciphertexts.solana.address===a||r.data[e].ciphertexts.evm.address===a)return"default_network"in r.data[e]?r.data[e].default_network:r.default_network;return null},St=t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8")).networks,n=r.length;let o=[];for(let e=0;e<n;e++)"evm"===he(r[e].chainId.toString())&&o.push(r[e].name);return o},xt=t=>{const a=s.resolve(t,"network.json");return JSON.parse(e.readFileSync(a,"utf8")).status},_t=require("chalk"),$t=async(t,a)=>{let r=s.join(t,"assets.json");if(!va(r))return[];const n=e.readFileSync(r).toString(),o=JSON.parse(n);return a in o?o[a]:[]},Pt=async(e,t,a)=>{const r=await $t(e,t);let s=[];for(let e=0;e<r.length;e++)r[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&s.push(r[e]);return s},At=async(e,t,a)=>{const r=ht(e,t),s=he(r.chainId.toString()),n=await $t(e,r.chainId.toString());if(!n)return void console.log(_t.red("No asset found"));const o=await Tt(a,n,r.rpcUrl,s,r.chainId.toString());let i=1;for(let e=0;e<o.length;e++)"0"!==o[e].balance&&"0.0000"!==o[e].balance&&(console.log(_t.green(`${i}. ${o[e].symbol} Balance: ${o[e].balance}`)),i+=1);1===i&&console.log(_t.red("No asset found"))},It=async(e,t,a)=>{const r=ht(e,t);let s=(await $t(e,r.chainId.toString())).map(e=>e.address);s.push("0"),ie(r.chainId.toString(),[a],s)},Ct=async(t,a,r,n,o,i,c)=>{let l=s.join(t,"assets.json"),u={};if(va(l)){const t=e.readFileSync(l).toString();u=JSON.parse(t)}void 0===u[a]&&(u[a]=[]);for(let t=0;t<u[a].length;t++)if(u[a][t].address.toLocaleLowerCase()===r.toLocaleLowerCase()||u[a][t].symbol.toLocaleLowerCase()===n.toLocaleLowerCase())return u[a][t]={address:r,symbol:n,name:o,decimals:i,display_decimals:c},void e.writeFileSync(l,JSON.stringify(u,null,4));u[a].push({address:r,symbol:n,name:o,decimals:i,display_decimals:c}),e.writeFileSync(l,JSON.stringify(u,null,4))},Nt=async t=>{const a=s.resolve(t,"network.json");let r=[],n=JSON.parse(e.readFileSync(a,"utf8")).networks;for(let e=0;e<n.length;e++)r.push(`${e+1}. ${n[e].name}`);let o=(await Xt(r)).split(".")[1].trim();const i=pt(t,o),c=ht(t,o),l=await Rt("Enter contract address",Zt);let u;if("evm"===i){if(!me(l))return void console.log(_t.red("evm address format error"));u=await V(l,c.rpcUrl)}else{if(!ge(l))return void console.log(_t.red("solana address format error"));u=await Z(l,c.rpcUrl)}if(!u.status)return void console.log(_t.red(u.output));u.output.name||(u.output.name=await Rt("Please input token name")),u.output.symbol||(u.output.symbol=await Rt("Please input token symbol")),console.log(_t.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let d=await Rt("Enter decimals for display",Ut);d=parseInt(d),await Ct(t,c.chainId.toString(),l,u.output.symbol,u.output.name,u.output.decimals,d)},Ot=async(e,t)=>{const a=pt(e,t),r=ht(e,t),s=await Rt("Enter contract address",Zt);let n;if("evm"===a){if(!me(s))return void console.log(_t.red("evm address format error"));n=await V(s,r.rpcUrl)}else{if(!ge(s))return void console.log(_t.red("solana address format error"));n=await Z(s,r.rpcUrl)}if(!n.status)return void console.log(_t.red(n.output));n.output.name||(n.output.name=await Rt("Please input token name")),n.output.symbol||(n.output.symbol=await Rt("Please input token symbol")),console.log(_t.green(`Token ${n.output.symbol}(${n.output.name}) loaded successfully.`));let o=await Rt("Enter decimals for display",Ut);o=parseInt(o),await Ct(e,r.chainId.toString(),s,n.output.symbol,n.output.name,n.output.decimals,o)},jt=async(e,t,a)=>{const r=["> Show Assets","> Add Asset",new i.Separator("----------------------------------"),"> Back"];switch(await Xt(r)){case"> Show Assets":await At(e,a,t);break;case"> Add Asset":await Ot(e,a);break;case"> Back":return}await jt(e,t,a)},Tt=async(e,t,a,r,s)=>{let n=t.length,o=[];for(let s=0;s<n;s++){let n=t[s];"evm"===r?o.push(X(e,n.address,a)):"solana"===r&&o.push(Q(e,n.address,a))}let i=await Promise.all(o),c=[];for(let a=0;a<n;a++){let r=t[a],n=r.decimals;if(!i[a].status)return console.log(_t.red(i[a].output)),null;let o=new k(i[a].output).dividedBy(Math.pow(10,n)).toFixed(4,k.ROUND_FLOOR);c.push({address:r.address,symbol:r.symbol,balance:o}),ie(s,[e],[r.address])}return ie(s,[e],["0"]),c},Et=async(e,t,a,r,s,n,o)=>{let i=a.length,c=ht(e,s),l="evm"===he(c.chainId.toString());n&&await ne(t,"0",c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"");let u=[];if(o){u=it(e,s);for(let e=0;e<i;e++){let s=a[e].address;u.includes(s)&&await ne(t,s,c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"")}}return oe(c.chainId.toString(),t,a,c,n,u)},Ft=require("chalk"),Lt=process.env.HOME||process.env.USERPROFILE,Bt=`${Lt}/.wative`,Rt=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await i.prompt(a);return r.trim().toString()},Dt=async e=>{for(let t=0;t<5;t++){let t=await qt(e,"Input start address or index");if(!t)return console.log(Ft.red("Invalid start account index")),null;let a=await qt(e,"Input end address or index");if(!a)return console.log(Ft.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(Ft.red("Invalid address range"))}return null},Mt=async(t,a,r)=>{let n=s.join(t,`accounts/${a}.json`);if(!e.existsSync(n))return null;let o=JSON.parse(e.readFileSync(n,"utf8")),i=o.data,c=o.account_type,l=i.length;if(0===l)return null;for(let e=0;e<l;e++){if("PK"===c&&i[e].ciphertexts.address.toLocaleLowerCase()===r.toLocaleLowerCase())return e.toString();if("PP"===c&&(i[e].ciphertexts.evm.address.toLocaleLowerCase()===r.toLocaleLowerCase()||i[e].ciphertexts.solana.address.toLocaleLowerCase()===r.toLocaleLowerCase()))return e.toString()}return null},qt=async(e,t)=>{let a=e.data,r=a.length;if(0===r)return null;let s=[],n=[];for(let e=0;e<r;e++)s.push(a[e].ciphertexts.evm.address.toLocaleLowerCase()),n.push(a[e].ciphertexts.solana.address.toLocaleLowerCase());let o=r-1;for(let e=0;e<5;e++){let e=await Rt(t,Vt),a=wa(e);if("unknown"===a){if(Number(e)>o){console.log(Ft.red("Invalid account index"));continue}return Number(e)}if("evm"===a&&-1!==s.indexOf(e.toLocaleLowerCase()))return s.indexOf(e.toLocaleLowerCase());if("solana"===a&&-1!==n.indexOf(e.toLocaleLowerCase()))return n.indexOf(e.toLocaleLowerCase())}return null},zt=e=>""===e||((e=e.replace(/\s+/g," ").trim()).length>40?"Tag length should be less than 10":!1!==/^[0-9a-zA-Z\s]*$/g.test(e)||"Tag should be alphanumeric"),Kt=e=>!(e.length<6)||"Address length should be greater than 6",Ut=e=>!isNaN(Number(e))||"Value should be a number",Jt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",Ht=e=>{const t=(e=e.replace(/\s+/g," ")).split(/\s+/g);if(12!==t.length&&24!==t.length)return"Passphrase should be equal to 12 or 24 words";for(let e=0;e<t.length;e++)if(!1===le.includes(t[e]))return"Passphrase word should be valid";return!0},Gt=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},Wt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},Vt=e=>!1===isNaN(Number(e))||Zt(e),Zt=e=>"unknown"!=wa(e)||"Address should be valid",Xt=async(e,t,a)=>{const r=[{type:"list",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:s}=await i.prompt(r);return s.toString()},Qt=async(e,t,a)=>{const r=[{type:"checkbox",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:s}=await i.prompt(r);return s},Yt=()=>{console.log(Ft.green(o.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})))},ea=async()=>{let t=await Rt(`Keystore storage located in (default: ${Bt})`);return t||(t=Bt),t=t.trim(),t=t.replace("~",Lt),e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),t},ta=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Rt(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},aa=async(e,t,a=!1)=>{for(let r=0;r<5;r++){let r=await Rt(t);try{if(""===r&&a)return null;if("solana"===he(e.toString()))return r;const t=await J(r);if(!t.status){console.log(Ft.red(t.output));continue}if(t.output.toString()===e.toString())return r;console.log(Ft.red("Rpc url not match chain id"))}catch(e){console.log(Ft.red(e.message))}}return null},ra=async e=>{for(let t=0;t<5;t++){let t=await Rt(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(Ft.red("Multicall address length must be 42"))}return null},sa=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Rt(e);if(""===a)return null;if(t.test(a))return a}return null},na=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Rt(e);if(""===a)return null;if(t.test(a))return a}return null},oa=(e,t)=>{const a=Be(e).accounts,r=ca(a).indexOf(t);return-1!==r?a[r]:t},ia=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),ca=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(ia(e[a]));return t},la=async(e,t)=>{let a=ca(t),r=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Rt(e);t=t.trim();let s=ia(t);if(r.test(s)){if(a.includes(s)){console.log(Ft.red("Account name already exists"));continue}return t}}return null},ua=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await i.prompt(a);return r.trim().toString()},da=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await i.prompt(t);return a},pa=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t,transformer:e=>{const t=e.split(" "),a=t.map((e,a)=>a<t.length-1?"#".repeat(e.length):e);return a.join(" ")}}],{inputText:r}=await i.prompt(a);return r.trim().toString()},ha=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`,validate:e=>function(e){let t,a="Password must contain at least: \n",r=!0,s=" ",n=Ft.green("✔"),o=Ft.red("✖");return e.length>=8?a+=s+n+" 8 characters\n":(a+=s+o+" 8 characters\n",r=!1),t=/[0-9]/,t.test(e)?a+=s+n+" One numerical character\n":(a+=s+o+" One numerical character\n",r=!1),t=/[A-Z]/,t.test(e)?a+=s+n+" One uppercase letter\n":(a+=s+o+" One uppercase letter\n",r=!1),t=/[!@#$%]/,t.test(e)?a+=s+n+" One sepcial character (i.e. !@#$%)\n":(a+=s+o+" One sepcial character (i.e. !@#$%)\n",r=!1),!!r||a}(e)}];let{password:a}=await i.prompt(t);return a},ga=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await i.prompt(a);return r},ma=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await i.prompt(a);return r.trim().toString()},fa=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},ya=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},wa=e=>e.startsWith("0x")&&42===e.length?"evm":/^[A-HJ-NP-Za-km-z1-9]*$/.test(e)&&e.length<=44&&e.length>=32?"solana":"unknown",va=t=>(t=t.trim(),e.existsSync(t)),ba=(e,t)=>{let a=[];for(let r=0;r<e.length;r+=t)a.push(e.slice(r,r+t));return a},ka=e=>new Promise(t=>setTimeout(t,e)),Sa=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),xa=(e,t)=>{if(!e.name)return null;let a=null;if(t)a=/0x[0-9a-fA-f]{40}/.exec(e.name),a=a?a[0]:null;else{let t=/\s+([0-9a-zA-Z]*)/.exec(e.name);a=t?t[1]:null,"Back"===a&&(a=null)}return a},_a=(e,t,a)=>{let r,s;return e<t/2?a/2<=t?(r=0,s=a/2):(r=0,s=t):a/2<=t?(r=0,s=a/2):(r=e-t/2+1,s=e+t/2+1),{fromIndex:r,toIndex:s}},$a=(e,t)=>{const a=[];for(let r=0;r<e.length;r++){const s=xa(e[r],t);a.push(s)}return a.concat(a)},Pa=(e,t,a,r,s,n,o,i,c)=>{for(let l=i;l<c;l++){let i=l>=t.length/2?l-t.length/2:l,c=e[i];if(!c.name)continue;let u=c.name,d=t[l],p="";if(!d)continue;for(let e in a[d])(n||e!==s)&&(o||e===s)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(r[e])} `));let h=u.split("(");if(h.length>1){let t=h[1];e[i].name=h[0]+` ${p}`+`(${t}`}else e[i].name=h[0]+` ${p}`}},Aa=async(e,t,a,r,s,n,o,c,l,u)=>{const d=[{type:"list",name:"inputText",message:l||"Choose an option",choices:e,pageSize:30,default:u,loop:!0,filter:e=>e}],p=i.prompt(d);let h,g=0,m=0;for(;!p.ui.activePrompt.answers[p.ui.activePrompt.opt.name];){if(c||await ka(1e3),h===p.ui.activePrompt.selected)continue;if(g===p.ui.activePrompt.selected?m+=1:(m=0,g=p.ui.activePrompt.selected),c){m=6,c=!1;const e=p.ui.activePrompt.opt.pageSize,a=$a(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:r,toIndex:n}=_a(g,e,a.length),o=a.slice(r,n);if(!ce(s.chainId.toString(),o)){m=0;continue}}if(m<5)continue;m=0;const e=p.ui.activePrompt.opt.pageSize,i=$a(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:l,toIndex:u}=_a(g,e,i.length),d=i.slice(l,u);let f=await Et(a,d,r,s.rpcUrl,s.name,n,o),y={};for(let e in f)for(let t in f[e]){let a=f[e][t].length+1;y[t]?y[t]<a&&(y[t]=a):y[t]=a}const w=s.nativeCurrency.symbol;Pa(p.ui.activePrompt.opt.choices.choices,i,f,y,w,n,o,l,u),p.ui.activePrompt.screen.render(""),p.ui.activePrompt.render(),h=g}return p.ui.activePrompt.answers[p.ui.activePrompt.opt.name]},Ia=t=>{const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));r.status||(r.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),r.showTokens||(r.showTokens={});let n=r.accounts.length;for(let a=0;a<n;a++){let o=r.accounts[n-1-a],i=ia(o),c=s.resolve(t,`accounts/${i}.json`);e.existsSync(c)||r.accounts.splice(n-1-a,1)}e.writeFileSync(a,JSON.stringify(r,null,4));let o=r.accounts,i=ca(o);for(let a=0;a<i.length;a++){let r=s.resolve(t,`accounts/${i[a]}.json`),n=JSON.parse(e.readFileSync(r,"utf8"));"PP"!==n.account_type&&("data"in n||(n.data=[{ciphertexts:n.ciphertexts}],delete n.ciphertexts,e.writeFileSync(r,JSON.stringify(n,null,4))))}};require("wative-core");const Ca=async(e,t)=>{switch(await Xt(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await ut(e);break;case"> Accounts":await Ze(e,t);break;case"> Tools":await Ne(e,t);break;case"> Exit":return}await Ca(e,t)};class Na{constructor(t,a){this.configDir=t||s.join(require("os").homedir(),".wative/ssh"),this.keystorePath=a||s.join(require("os").homedir(),".wative"),e.existsSync(this.configDir)||e.mkdirSync(this.configDir,{recursive:!0});const r=s.join(this.configDir,"conf.d");e.existsSync(r)||e.mkdirSync(r,{recursive:!0})}getKeystorePath(){return this.keystorePath}getConfigDir(){return this.configDir}async createServiceConfig(e,t,a,r="default_client",s){if(!this.isValidServiceName(e))throw new Error("Invalid service name. Use only alphanumeric characters, hyphens, and underscores.");if(this.isPortInUse(t))throw new Error(`Port ${t} is already in use by another service.`);const n=await this.generateServiceKeyPair(e),o=await this.generateClientKeyPair(e,r),i={name:e,description:s||`Wative SSH Service - ${e}`,ssh:{listen:"127.0.0.1",port:t,log:{size:10485760,backups:3}},keystore:{path:this.keystorePath,allowed_keystores:a},clients:[{name:r,public_key_path:o.publicKey,allowed_keystores:a}],server_keys:{private_key_path:n.privateKey,passphrase:n.passphrase}};return this.saveServiceConfig(e,i),i}loadServiceConfig(t){const a=this.getServiceConfigPath(t);if(!e.existsSync(a))throw new Error(`Service configuration '${t}' not found.`);const r=S.parse(e.readFileSync(a,"utf-8"));return this.parseConfigData(r)}serviceIsExist(t){const a=this.getServiceConfigPath(t);return e.existsSync(s.dirname(a))}listServiceConfigs(){const t=s.join(this.configDir,"conf.d");if(!e.existsSync(t))return[];return e.readdirSync(t).filter(a=>{const r=s.join(t,a);return e.statSync(r).isDirectory()&&e.existsSync(s.join(r,"config.ini"))})}removeServiceConfig(t){const a=this.getServiceConfigPath(t),r=s.dirname(a);e.existsSync(r)&&e.rmSync(r,{recursive:!0})}updateServiceConfig(e,t){const a={...this.loadServiceConfig(e),...t};this.saveServiceConfig(e,a)}async validateKeystorePasswords(e,t){const a={},{WativeCore:r}=require("wative-core");for(const s of e)try{const e=t[s];if(!e){a[s]=!1;continue}const n=new r(this.keystorePath,[s],[e]);a[s]=n.account.isLogin(s)}catch(e){a[s]=!1}return a}isValidServiceName(e){return/^[a-zA-Z0-9_-]+$/.test(e)&&e.length>0&&e.length<=50}isPortInUse(e){const t=this.listServiceConfigs();for(const a of t)try{if(this.loadServiceConfig(a).ssh.port===e)return!0}catch(e){}return!1}async generateServiceKeyPair(t){const a=this.generateSecurePassphrase(),r=s.join(this.configDir,"conf.d",t);e.existsSync(r)||e.mkdirSync(r,{recursive:!0});const n=s.join(r,"server_private_key"),o=s.join(r,"server_public_key.pub");return e.existsSync(n)||(console.log(`Generating SSH server key pair for service '${t}'...`),$(`ssh-keygen -t rsa -b 4096 -f ${n} -N '${a}' -C 'wative_${t}_server'`,{stdio:"inherit"})),{privateKey:n,publicKey:o,passphrase:a}}async generateClientKeyPair(t,a){const r=s.join(this.configDir,"conf.d",t);e.existsSync(r)||e.mkdirSync(r,{recursive:!0});return{privateKey:"",publicKey:s.join(r,`${a}.pub`),passphrase:""}}generateSecurePassphrase(){return x.randomBytes(32).toString("hex")}getServiceConfigPath(e){return s.join(this.configDir,"conf.d",e,"config.ini")}saveServiceConfig(t,a){const r=this.getServiceConfigPath(t),n=s.dirname(r);e.existsSync(n)||e.mkdirSync(n,{recursive:!0});const o=S.stringify(a);e.writeFileSync(r,o)}parseConfigData(e){return{name:e.name,description:e.description,ssh:{listen:e.ssh.listen,port:parseInt(e.ssh.port),log:{size:parseInt(e.ssh.log.size),backups:parseInt(e.ssh.log.backups)}},keystore:{path:e.keystore.path,allowed_keystores:Array.isArray(e.keystore.allowed_keystores)?e.keystore.allowed_keystores:e.keystore.allowed_keystores.split(",")},clients:Array.isArray(e.clients)?e.clients:[e.clients],server_keys:{private_key_path:e.server_keys.private_key_path,passphrase:e.server_keys.passphrase}}}}const Oa=t=>{if(t=t.trim(),!e.existsSync(t))throw new Error("File not exists")};const{WativeCore:ja}=require("wative-core"),{Connection:Ta,PublicKey:Ea,VersionedTransaction:Fa,VersionedMessage:La}=require("@solana/web3.js"),Ba=require("bs58"),{Keypair:Ra,TransactionMessage:Da,ComputeBudgetInstruction:Ma,TransactionInstruction:qa,ComputeBudgetProgram:za}=require("@solana/web3.js"),{Wallet:Ka}=require("@coral-xyz/anchor");N.configure({appenders:{file:{type:"file",filename:process.env.HOME+"/.wative/logs/wative.log",maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"}},categories:{default:{appenders:["file","console"],level:"info"}}});const Ua=N.getLogger("file");Ua.level="info";class Ja{constructor(e,t,r,s,n,o,i,c){if(this._allowedAppIds=[],this._allowedPubKeys=[],this._allowedKeystoreIds=[],this._sessionIdAppIdMap={},Oa(e),0===r.length||0===s.length||0===n.length||r.length!==s.length||r.length!==n.length)throw new Error("WativeWielderServer:: constructor: Invaild AllowedApp");for(let e=0;e<n.length;e++)for(let t=0;t<n[e].length;t++){const a=n[e][t];if(!i.includes(a))throw new Error("WativeWielderServer:: constructor: Invaild AllowedKeystoreIds")}for(let e of r)this._allowedAppIds.push(Buffer.from(e));for(let e of s){let t=A.parseKey(a(e));this._allowedPubKeys.push(t)}this.wativeCore=new ja(o,i,c),this._idRsaPrivatePath=e,this._idRsaPassphrase=t,this._allowedKeystoreIds=n,this._keystoreDirectoryPath=o}listen(e,t){new I({hostKeys:[{key:a(this._idRsaPrivatePath),passphrase:this._idRsaPassphrase}]},e=>{e.on("authentication",t=>{let a=!0;if(this&&(this.checkValue(Buffer.from(t.username),"appId")||(a=!1)),"publickey"!==t.method||!a)return t.reject();{let e=this.getBytesIndex(Buffer.from(t.username),this._allowedAppIds),a=this._allowedPubKeys[e];if(t.key.algo!==a.type||!this.checkValue(t.key.data,"publicKey")||t.signature&&!0!==a.verify(t.blob,t.signature,t.hashAlgo))return t.reject()}if(a){const a=e._protocol._kex.sessionID.toString("hex");this._sessionIdAppIdMap[a]=Buffer.from(t.username),t.accept()}else t.reject()}).on("ready",()=>{e.on("session",(t,a)=>{t().once("exec",async(t,a,r)=>{const s=e._protocol._kex.sessionID.toString("hex"),n=await this.web3Request(s,r.command),o=t();o&&(JSON.stringify(n)?(o.write(JSON.stringify(n)),o.exit(0),o.end()):(o.write("ssh2 connect error"),o.exit(0),o.end()))})})}).on("close",()=>{Ua.info("Client disconnected")}).on("error",e=>{Ua.error("err: ",e.message)})}).listen(t,e,function(){Ua.info("Listening on port "+t)})}async web3Request(e,t){try{const a=this._sessionIdAppIdMap[e],r=this.getBytesIndex(a,this._allowedAppIds);if(r<0)return{status:!1,msg:"app not found"};let s=JSON.parse(t);Ua.info("sign message: ",t);let n=s.method,o=s.keystoreId||s.params.keystoreId,i=s.chainId||s.params.chainId;if(!this._allowedKeystoreIds[r].includes(o))return{status:!1,msg:"keystore not allowed"};let c;if("get_root_account"===n)c=this.getRootAccount(o,i);else if("get_sub_account"===n){let e=s.params;c=this.getSubAccount(o,e.chainId,null==e?void 0:e.startIndex,null==e?void 0:e.endIndex)}else if("sign"===n){let e=s.params;try{c=await this.wativeCore.account.signTransaction(e.txParams.from,e.txParams,e.rpcUrl)}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}}else if("sign_and_send"===n){let e=s.params;try{c={transactionHash:await this.wativeCore.account.signAndSendTx(e.txParams,e.rpcUrl)}}catch(e){return{status:!1,msg:e.msg}}}else if("solana_sign"===n)try{let e=s.params;c=await this.signSolanaTransaction(e.txParams.from,e.txParams.data,e.txParams.lookup_tables,e.rpcUrl,e.priority_fee)}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("solana_send"===n)try{let e=s.params;c=await this.sendSignedSolanaTransaction(e.txParams.from,e.txParams.signature,e.txParams.data,e.rpcUrl)}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("sign_message"===n)try{let e=s.params;Ua.debug("sign message: ",e),c=await this.signMessage(e.account,e.message)}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("sign_typed_data"===n)try{let e=s.params;Ua.debug("sign message: ",e),c=await this.signTypedData(e.account,e.domain,e.types_name,e.types,e.message)}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}else if("get_disabled_slots"===n)try{c=await this.getDisabledSlots(o)}catch(e){return Ua.error("get disabled slots error: ",e.message),{status:!1,msg:e.msg}}else{if("update_disabled_slots"!==n)return{status:!1,msg:"message method not find"};try{let e=s.params;Ua.debug("update disabled slots: ",e),c=await this.updateDisabledSlots(o,e.disabled_slots)}catch(e){return Ua.error("update disabled slots error: ",e.message),{status:!1,msg:e.msg}}}return{status:!0,data:c}}catch(e){return Ua.error("sign error: ",e.message),{status:!1,msg:e.msg}}}checkValue(e,t){if("appId"!==t&&"publicKey"!==t)return!1;let a=this._allowedAppIds.length;for(let r=0;r<a;r++){let a;a="appId"===t?this._allowedAppIds[r]:this._allowedPubKeys[r].getPublicSSH();const s=e.length!==a.length;s&&(a=e);const n=_(e,a);if(!s&&n)return!0}}getBytesIndex(e,t){let a=t.length;for(let r=0;r<a;r++)if(e.length===t[r].length&&_(e,t[r]))return r;return-1}getRootAccount(e,t){const r=s.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let n,o=a(r);return o=JSON.parse(o.toString()),n="SOLANA"===this.getChainType(t)?o.data[0].ciphertexts.solana.address:o.data[0].ciphertexts.evm.address,[{id:0,address:n,children:o.data.length,type:"M"}]}getChainType(e){return"901"===e||"902"===e||"903"===e?"SOLANA":"EVM"}getSubAccount(e,t,r,n){const o=s.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let i=a(o);i=JSON.parse(i.toString());let c=i.data.length-1;n&&n<c&&(c=n);let l=0;if(r&&r>0&&(l=r),l>c)return[];let u=this.getChainType(t),d=[];for(let e=l;e<=c;e++)d.push(i.data[e].ciphertexts[u.toLocaleLowerCase()].address);return d}async getDisabledSlots(e){const t=s.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let r=a(t);return r=JSON.parse(r.toString()),r.disabled_slots||[]}async updateDisabledSlots(e,t){const n=s.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let o=a(n);return o=JSON.parse(o.toString()),o.disabled_slots=t,r(n,JSON.stringify(o)),!0}async signMessage(e,t){let a=await this.wativeCore.account.signMessage(e,t);return console.log(a),a}async signTypedData(e,t,a,r,s){let n=JSON.parse(t),o=JSON.parse(r),i=JSON.parse(s);console.log(n),console.log(o),console.log(i);let c=this.wativeCore.account.showPrivateKey(e),l=new O.Wallet(c),u=await l.signTypedData(n,{[a]:o},i);return console.log(u),{status:!0,output:u}}async signSolanaTransaction(e,t,a,r,s){let n=new Ta(r),o=[];if(a)for(let e of a){let t=(await n.getAddressLookupTable(new Ea(e))).value;o.push(t),await Ha(1e3)}let i=La.deserialize(Uint8Array.from(Buffer.from(t,"hex"))),c=Da.decompile(i);c.instructions.push(za.setComputeUnitLimit({units:2e6})),c.instructions.push(za.setComputeUnitPrice({microLamports:1e3})),i=c.compileToV0Message(o),i.recentBlockhash=(await n.getLatestBlockhash()).blockhash,await Ha(3e3);let l=new Fa(i),u=this.wativeCore.account.showPrivateKey(e);const d=Ra.fromSecretKey(new Uint8Array(Ba.decode(u))),p=new Ka(d);let h=await n.simulateTransaction(l);if(!h||!h.value||0===h.value.unitsConsumed||h.value.err)return{status:!1,output:h.value.err};let g=c.instructions.length,m=Math.trunc(1.2*h.value.unitsConsumed);if(c.instructions[g-2]=za.setComputeUnitLimit({units:m}),!s||"null"==s)try{s=await this.getPrioritizationFee(r)}catch(e){s=2e5}s<1e4&&(s=1e4),s>5e5&&(s=5e5),c.instructions[g-1]=za.setComputeUnitPrice({microLamports:s}),i=c.compileToV0Message(o),await Ha(1e3),i.recentBlockhash=(await n.getLatestBlockhash()).blockhash,l=new Fa(i),l.feePayer=p.publicKey,await Ha(3e3);let f=await this.wativeCore.account.signTransaction(e,l,r),y=new Fa(f.output.message,f.output.signatures).message.serialize();return y=Buffer.from(y).toString("hex"),{status:!0,output:{transactionHash:Ba.encode(f.output.signatures[0]),message:y,compute_units:h.value.unitsConsumed.toString()}}}async sendSignedSolanaTransaction(e,t,a,r){let s=[Ba.decode(t)],n=La.deserialize(Uint8Array.from(Buffer.from(a,"hex"))),o=new Fa(n,s);return await this.wativeCore.account.sendSignedTransaction(e,o,r)}async getPrioritizationFee(e){let t=new Ea("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4");const a=new Ta(e,"confirmed");let r=await a.getSignaturesForAddress(t,{limit:5});await Ha(2e3);let s=[];for(let e=0;e<r.length;e++)s.push(r[e].signature);let n=await a.getParsedTransactions(s,{maxSupportedTransactionVersion:0}),o=0;for(let e=0;e<n.length;e++){let t=n[e].transaction.message.instructions;for(let e=0;e<t.length;e++)if("ComputeBudget111111111111111111111111111111"===t[e].programId.toBase58()){let a=t[e].data;try{let e=new qa({keys:[],programId:new Ea("ComputeBudget111111111111111111111111111111"),data:Buffer.from(Ba.decode(a))}),{microLamports:t}=Ma.decodeSetComputeUnitPrice(e);o+=Number(t);continue}catch(e){}}}return Math.ceil(o/5)}}const Ha=e=>new Promise(t=>setTimeout(t,e));"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ga={exports:{}},Wa={name:"wative-core",version:"1.0.21",description:"An agile keystore management toolkit",main:"lib/index.umd.js",module:"lib/index.esm.js",types:"lib/index.d.ts",scripts:{test:"jest",compile:"tsc",build:"rollup --config"},repository:{type:"git",url:""},bugs:{url:"https://github.com"},homepage:"https://github.com",keywords:["keystore","wallet"],author:"",license:"ISC",files:["src/","lib/"],dependencies:{"@babel/plugin-transform-modules-commonjs":"7.24.1","@rollup/plugin-commonjs":"21.0.1","@solana/web3.js":"1.91.8","@types/bs58":"4.0.4","crypto-js":"4.2.0","ethereumjs-wallet":"1.0.2",jest:"27.5.1","micro-ed25519-hdkey":"0.1.2",rollup:"2.79.1","rollup-plugin-terser":"7.0.2","rollup-plugin-typescript2":"0.31.2",tslib:"2.6.2",typescript:"4.9.5",web3:"1.7.3","web3-core":"4.3.2","@coral-xyz/anchor":"0.30.1","@types/crypto-js":"4.2.2","nodejs-threadpool":"1.0.1",tweetnacl:"1.0.3","rpc-websockets":"7.10.0"}};!function(e,t,a,r,s,n,o,i,c,l,u,d){function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function h(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var g=h(t),m=h(a),f=p(r),y=h(s),w=h(n),v=h(o),b=h(l),k=function(){return k=Object.assign||function(e){for(var t,a=1,r=arguments.length;a<r;a++)for(var s in t=arguments[a])Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);return e},k.apply(this,arguments)};function S(e,t,a,r){return new(a||(a=Promise))(function(s,n){function o(e){try{c(r.next(e))}catch(e){n(e)}}function i(e){try{c(r.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a(function(e){e(t)})).then(o,i)}c((r=r.apply(e,t||[])).next())})}function x(e,t){var a,r,s,n={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return o.next=i(0),o.throw=i(1),o.return=i(2),"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(i){return function(c){return function(i){if(a)throw new TypeError("Generator is already executing.");for(;o&&(o=0,i[0]&&(n=0)),n;)try{if(a=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return n.label++,{value:i[1],done:!1};case 5:n.label++,r=i[1],i=[0];continue;case 7:i=n.ops.pop(),n.trys.pop();continue;default:if(!((s=(s=n.trys).length>0&&s[s.length-1])||6!==i[0]&&2!==i[0])){n=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){n.label=i[1];break}if(6===i[0]&&n.label<s[1]){n.label=s[1],s=i;break}if(s&&n.label<s[2]){n.label=s[2],n.ops.push(i);break}s[2]&&n.ops.pop(),n.trys.pop();continue}i=t.call(e,n)}catch(e){i=[6,e],r=0}finally{a=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}"function"==typeof SuppressedError&&SuppressedError;var _=function(e,t){return S(void 0,void 0,void 0,function(){var a,r,s;return x(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,e.apply(void 0,t)];case 1:return r=n.sent(),a={status:!0,output:r},[3,3];case 2:return s=n.sent(),a={status:!1,output:s.toString()},[3,3];case 3:return[2,a]}})})},$=function(){function e(e){this.web3=new f.default(e)}return e.prototype.getEvmGasPrice=function(){return S(this,void 0,void 0,function(){return x(this,function(e){switch(e.label){case 0:return[4,_(this.web3.eth.getGasPrice,[])];case 1:return[2,e.sent()]}})})},e.prototype.getEvmGasLimit=function(e,t){return S(this,void 0,void 0,function(){return x(this,function(a){switch(a.label){case 0:return[4,_(this.web3.eth.estimateGas,[e,t])];case 1:return[2,a.sent()]}})})},e}(),P=function(e){return e=e.trim(),g.existsSync(e)},A=function(e,t){var a=t.length;if(0===a)return!0;for(var r=0;r<a;r++){var s=m.join(e,"accounts/".concat(t[r],".json"));if(!P(s))return!1}return!0},I=function(e){return(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim()},C=function(e,t){var a=[],r=m.join(e,"network.json");if(!P(r))throw new Error("network.json not found");for(var s=function(e){for(var t=[],a=0;a<e.length;a++)t.push(I(e[a]));return t}(N(r).accounts),n=0;n<t.length;n++)s.includes(t[n])&&a.push(t[n]);return a},N=function(e){var t=g.readFileSync(e).toString();return JSON.parse(t)},O=function(e,t){var a=JSON.stringify(e);g.writeFileSync(t,a)},j=function(e,t){return b.AES.encrypt(e,t).toString()},T=function(e,t){return b.AES.decrypt(e,t).toString(b.enc.Utf8)},E=["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"],F=new f.default(f.default.givenProvider),L=function(){function e(e,t,a,r){if(this.account_passwords={},this.account_ciphertexts={},this.disable_address=!1,this.account_signatures="",this.setting_path=e,this.account_labels=t,0!==t.length){if(a){if(t.length!==a.length)throw new Error("account_labels should have same length for account_passwords");for(var s=0;s<t.length;s++){if(!this.checkPassword(t[s],a[s].trim()))throw new Error("account_passwords is not correct");this.account_passwords[t[s]]=a[s].trim()}}r&&(this.disable_address=r),this.reload()}}return e.prototype.isLogin=function(e){return e in this.account_passwords},e.prototype.reloadAccount=function(){this.reload()},e.prototype.getAccountLabel=function(e){var t=null;for(var a in this.account_ciphertexts)a.toLocaleLowerCase().includes(e.toLocaleLowerCase())&&(t=a);return null===t?null:{account_address:t,account_label:this.account_ciphertexts[t].account_label}},e.prototype.login=function(e,t){return this.checkPassword(e,t)?(this.account_passwords[e]=t,this.account_labels.push(e),this.reload(),{status:!0,output:"Login success"}):{status:!1,output:"Password is not correct"}},e.prototype.getAccounts=function(e){var t=this.getAccountSignature();t!==this.account_signatures&&(this.account_signatures=t,this.reload());for(var a=Object.keys(this.account_ciphertexts),r=[],s=0;s<a.length;s++)this.getAccountChainType(a[s])===e&&r.push(a[s]);return r},e.prototype.checkAccountLabelIsExist=function(e){return A(this.setting_path,[e])},e.prototype.checkAccountIsExist=function(e){return(e=this.getAccountChecksumAddress(e))in this.account_ciphertexts||(this.reload(),e in this.account_ciphertexts)},e.prototype.checkPassword=function(e,t){var a=m.join(this.setting_path,"accounts/".concat(e,".json"));if(!P(a))return!1;var r,s=N(a);r="PK"===s.account_type?k({salt:t},s.data[0].ciphertexts):{slat:t,data:s.pp_ciphertexts};var n=b.SHA256(JSON.stringify(r)).toString();return s.signature===n},e.prototype.showPrivateKey=function(e){if(!this.checkAccountIsExist(e))throw new Error("Account is not exist");e=this.getAccountChecksumAddress(e);var t=this.account_ciphertexts[e],a=this.account_passwords[t.account_label];return T(t.data,a)},e.prototype.getAccountChainType=function(e){return e.startsWith("0x")&&42===e.length?"evm":/^[A-HJ-NP-Za-km-z1-9]*$/.test(e)?"solana":"unknown"},e.prototype.generatePKAccount=function(e,t,a,r,s){if(s&&this.checkAccountLabelIsExist(e))throw new Error("Account labels already exist");if(!s&&!this.account_passwords[e])throw new Error("Password is not correct");s||(a=this.account_passwords[e]);var n,o=j(t,a);try{n=this.getAccountAddressByPrivateKey(t,r)}catch(e){return{status:!1,output:e.message}}var i={address:n,data:o},c=k({salt:a},i),l={signature:b.SHA256(JSON.stringify(c)).toString(),account_type:"PK",tag:"",ciphertexts:i};return s||(this.account_passwords[e]=a,this.account_labels.push(e)),{status:!0,output:l}},e.prototype.generatePPAccount=function(e,t,a){if(this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels already exist"};var r=j(t,a),s={slat:a,data:r},n=b.SHA256(JSON.stringify(s)).toString(),o=this.getSubAccount("evm",t,0);if(!1===o.status)return{status:!1,output:o.output};var i=this.getSubAccount("solana",t,0);if(!1===i.status)return{status:!1,output:i.output};var c={signature:n,account_type:"PP",pp_ciphertexts:r,tag:"",data:[{ciphertexts:{evm:{address:o.output.address,data:j(o.output.pk,a)},solana:{address:i.output.address,data:j(i.output.pk,a)}}}]};return this.account_passwords[e]=a,this.account_labels.push(e),{status:!0,output:c}},e.prototype.generateSubAccount=function(e,t){if(!this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels not exist"};var a=m.join(this.setting_path,"accounts/".concat(e,".json")),r=N(a).pp_ciphertexts,s=T(r,this.account_passwords[e]),n=this.getSubAccount("evm",s,t);if(!1===n.status)return{status:!1,output:n.output};var o=this.getSubAccount("solana",s,t);return!1===o.status?{status:!1,output:o.output}:{status:!0,output:{evm:{address:n.output.address,data:j(n.output.pk,this.account_passwords[e])},solana:{address:o.output.address,data:j(o.output.pk,this.account_passwords[e])}}}},e.prototype.resetPassword=function(e,t){if(!this.checkAccountLabelIsExist(e))return{status:!1,output:"Account labels not exist"};if(!this.checkPassword(e,this.account_passwords[e]))return{status:!1,output:"account passwords is not correct"};var a=m.join(this.setting_path,"accounts/".concat(e,".json")),r=N(a);if("PK"===r.account_type){for(var s=r.data,n=0;n<s.length;n++){var o=s[n].ciphertexts.data,i=T(o,this.account_passwords[e]);s[n].ciphertexts.data=j(i,t)}var c=k({salt:t},r.data[0].ciphertexts);return r.signature=b.SHA256(JSON.stringify(c)).toString(),O(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}}var l=T(r.pp_ciphertexts,this.account_passwords[e]);r.pp_ciphertexts=j(l,t);var u={slat:t,data:r.pp_ciphertexts};r.signature=b.SHA256(JSON.stringify(u)).toString();var d=r.data;for(n=0;n<d.length;n++){var p=T(d[n].ciphertexts.evm.data,this.account_passwords[e]);d[n].ciphertexts.evm.data=j(p,t);var h=T(d[n].ciphertexts.solana.data,this.account_passwords[e]);d[n].ciphertexts.solana.data=j(h,t)}return O(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}},e.prototype.signTransaction=function(e,t,a){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?this.signEvmTransaction(t,a):this.signSolanaTransaction(e,a,t):{status:!1,output:"Account is not exist"}},e.prototype.sendSignedTransaction=function(e,t,a){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?this.sendEvmTransaction(t,a):this.sendSolanaTransaction(t,a):{status:!1,output:"Account is not exist"}},e.prototype.signMessage=function(e,t){return e=this.getAccountChecksumAddress(e),this.checkAccountIsExist(e)?"unknown"===this.getAccountChainType(e)?{status:!1,output:"Chain type unknown"}:"evm"===this.getAccountChainType(e)?{status:!0,output:this.signEvmMessage(t,e)}:{status:!0,output:this.signSolanaMessage(t,e)}:{status:!1,output:"Account is not exist"}},e.prototype.simulateTransaction=function(e,t,a){return S(this,void 0,void 0,function(){var r,s,n;return x(this,function(o){switch(o.label){case 0:return r=new i.Connection(t),s=this.showPrivateKey(e),n=i.Keypair.fromSecretKey(w.decode(s)),[4,_(r.simulateTransaction.bind(r),[a,[n]])];case 1:return[2,o.sent()]}})})},e.prototype.signEvmTransaction=function(e,t){return S(this,void 0,void 0,function(){var a,r,s,n;return x(this,function(o){switch(o.label){case 0:return this.account_passwords?(a=e.from,e.gas?[3,2]:[4,new $(t).getEvmGasLimit(e,t)]):[2,{status:!1,output:"Please set password first"}];case 1:if(!(r=o.sent()).status)return[2,r];e.gas=r.output,o.label=2;case 2:return e.gasPrice?[3,4]:[4,new $(t).getEvmGasPrice()];case 3:if(!(r=o.sent()).status)return[2,r];e.gasPrice=r.output,o.label=4;case 4:return s=this.showPrivateKey(a),n=new f.default(t),[4,_(n.eth.accounts.signTransaction.bind(n.eth.accounts),[e,s])];case 5:return[2,o.sent()]}})})},e.prototype.sendEvmTransaction=function(e,t){return S(this,void 0,void 0,function(){var a;return x(this,function(r){switch(r.label){case 0:return a=new f.default(t),[4,_(a.eth.sendSignedTransaction.bind(a.eth),[e])];case 1:return[2,r.sent()]}})})},e.prototype.signSolanaTransaction=function(e,t,a){return S(this,void 0,void 0,function(){var r,s,n,o,l;return x(this,function(u){switch(u.label){case 0:return r=this.showPrivateKey(e),s=i.Keypair.fromSecretKey(w.decode(r)),n=new c.Wallet(s),"recentBlockhash"in a&&a.recentBlockhash?[3,2]:(o=new i.Connection(t),[4,_(o.getLatestBlockhash.bind(o),[])]);case 1:if(!(l=u.sent()).status)return[2,{status:!1,output:"Failed to get latest blockhash"}];a.recentBlockhash=l.output.blockhash,u.label=2;case 2:return a.feePayer=n.publicKey,[4,_(n.signTransaction.bind(n),[a])];case 3:return[2,u.sent()]}})})},e.prototype.sendSolanaTransaction=function(e,t){return S(this,void 0,void 0,function(){var a;return x(this,function(r){switch(r.label){case 0:return a=new i.Connection(t),[4,_(a.sendRawTransaction.bind(a),[e.serialize()])];case 1:return[2,r.sent()]}})})},e.prototype.signEvmMessage=function(e,t){var a=this.showPrivateKey(t);return F.eth.accounts.sign(e,a).signature},e.prototype.signSolanaMessage=function(e,t){var a=this.showPrivateKey(t),r=y.sign.detached(new Uint8Array(e.match(/.{1,2}/g).map(function(e){return parseInt(e,16)})),w.decode(a));return w.encode(r)},e.prototype.checkIsDisableAddress=function(e,t){if(!e||!this.disable_address)return!1;for(var a=e.length,r=0;r<a;r++){var s=e[r].from,n=e[r].to;if(t>=s&&t<=n)return!0}return!1},e.prototype.reload=function(){if(this.account_labels=C(this.setting_path,this.account_labels),!A(this.setting_path,this.account_labels))throw new Error("Account labels not exist");for(var e={},t=this.account_labels.length,a=0;a<t;a++){var r=m.join(this.setting_path,"accounts/".concat(this.account_labels[a],".json"));if(g.existsSync(r)){var s=JSON.parse(g.readFileSync(r,"utf8"));if("PK"!==s.account_type){var n=s.data.length,o=s.disabled_slots;for(l=0;l<n;l++)this.checkIsDisableAddress(o,l)||(e[s.data[l].ciphertexts.evm.address]={account_label:this.account_labels[a],data:s.data[l].ciphertexts.evm.data},e[s.data[l].ciphertexts.solana.address]={account_label:this.account_labels[a],data:s.data[l].ciphertexts.solana.data})}else{var i=s.data;if(!i)continue;for(var c=i.length,l=0;l<c;l++)e[i[l].ciphertexts.address]={account_label:this.account_labels[a],data:i[l].ciphertexts.data}}}}this.account_ciphertexts=e},e.prototype.getAccountChecksumAddress=function(e){return"evm"===this.getAccountChainType(e)&&(e=F.utils.toChecksumAddress(e)),e},e.prototype.getAccountAddressByPrivateKey=function(e,t){return"evm"===this.getNetworkTypeByChainId(t)?F.eth.accounts.privateKeyToAccount(e).address:i.Keypair.fromSecretKey(w.decode(e)).publicKey.toBase58()},e.prototype.getNetworkTypeByChainId=function(e){return"901"===e||"902"===e||"903"===e?"solana":"evm"},e.prototype.getSubAccount=function(e,t,a){if(!function(e){var t=e.split(/\s+/g),a=t.length;if(12!==a&&24!==a)return!1;for(var r=0;r<a;r++)if(!E.includes(t[r]))return!1;return!0}(t))return{status:!1,output:"Please set correct mnemonic"};if("solana"===e){var r=v.mnemonicToSeedSync(t),s=d.HDKey.fromMasterSeed(r),n=i.Keypair.fromSeed(s.derive("m/44'/501'/".concat(a,"'/0'")).privateKey);return{status:!0,output:{address:n.publicKey.toBase58(),pk:w.encode(n.secretKey)}}}if("evm"===e){r=v.mnemonicToSeedSync(t);var o=(s=u.hdkey.fromMasterSeed(r)).derivePath("m/44'/60'/0'/0").deriveChild(a).getWallet();return{status:!0,output:{address:F.utils.toChecksumAddress(o.getAddressString()),pk:o.getPrivateKeyString()}}}return{status:!1,output:"Unknown chain type"}},e.prototype.getAccountSignature=function(){for(var e=this.account_labels.length,t=[],a=0;a<e;a++){var r=m.join(this.setting_path,"accounts/".concat(this.account_labels[a],".json")),s=g.readFileSync(r,"utf8");t.push(s)}return b.MD5(JSON.stringify(t)).toString()},e}(),B=Wa,R=function(){function e(e,t,a,r){this.account=new L(e,t,a,r)}return e.version=B.version,e}();e.WativeCore=R,Object.defineProperty(e,"__esModule",{value:!0})}(Ga.exports,t,n,c,j,T,E,l,F,L,B,R);class Va{constructor(e,t){this.runningServices=new Map,this.configManager=new Na(e,t),this.pidDir=s.join(this.configManager.getKeystorePath(),"ssh","pids"),this.ensurePidDir(),this.setupLogger()}ensurePidDir(){e.existsSync(this.pidDir)||e.mkdirSync(this.pidDir,{recursive:!0})}async isPortInUse(e,t="127.0.0.1"){return new Promise(a=>{const r=D.createServer();r.listen(e,t,()=>{r.once("close",()=>{a(!1)}),r.close()}),r.on("error",e=>{"EADDRINUSE"===e.code?a(!0):a(!1)})})}getPidFilePath(e){return s.join(this.pidDir,`${e}.pid`)}writePidFile(t,a){const r=this.getPidFilePath(t);e.writeFileSync(r,a.toString())}readPidFile(t){const a=this.getPidFilePath(t);if(!e.existsSync(a))return null;try{const t=e.readFileSync(a,"utf8").trim();return parseInt(t,10)}catch(e){return null}}removePidFile(t){const a=this.getPidFilePath(t);e.existsSync(a)&&e.unlinkSync(a)}isProcessRunning(e){try{return process.kill(e,0),!0}catch(e){return!1}}async startService(e,t){if(this.runningServices.has(e))throw new Error(`Service '${e}' is already running.`);const a=this.configManager.loadServiceConfig(e);if(await this.isPortInUse(a.ssh.port,a.ssh.listen)){const t=`Port ${a.ssh.port} on ${a.ssh.listen} is already in use. Cannot start SSH service '${e}'.`;throw this.logger.error(t),console.error(`Error: ${t}`),new Error(t)}this.logger.info(`Port ${a.ssh.port} on ${a.ssh.listen} is available for service '${e}'`);const r=t||await this.promptForPasswords(a.keystore.allowed_keystores),s=await this.configManager.validateKeystorePasswords(a.keystore.allowed_keystores,r),n=Object.entries(s).filter(([e,t])=>!t).map(([e,t])=>e);if(n.length>0)throw new Error(`Invalid passwords for keystores: ${n.join(", ")}`);const o=this.createServerInstance(a,r);o.listen(a.ssh.listen,a.ssh.port),this.writePidFile(e,process.pid),this.logger.info(`SSH service '${e}' started on ${a.ssh.listen}:${a.ssh.port}`),console.log(`SSH service '${e}' is now running in the background on ${a.ssh.listen}:${a.ssh.port}`);const i={config:a,passwords:r,server:o};this.runningServices.set(e,i),this.setupServiceLogger(e)}async stopService(t){const a=this.runningServices.get(t),r=this.readPidFile(t),n=s.join(this.pidDir,`${t}-daemon.pid`),o=s.join(this.pidDir,`${t}-watcher.pid`);let i=null,c=null;if(e.existsSync(n)){const t=e.readFileSync(n,"utf8").trim();t&&(i=parseInt(t))}if(e.existsSync(o)){const t=e.readFileSync(o,"utf8").trim();t&&(c=parseInt(t))}if(a)a.server&&a.server.close&&a.server.close(),this.runningServices.delete(t);else if(c&&this.isProcessRunning(c))try{process.kill(c,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(c)&&process.kill(c,"SIGKILL");try{e.existsSync(o)&&e.unlinkSync(o),e.existsSync(n)&&e.unlinkSync(n)}catch(e){}},5e3)}catch(t){if(i&&this.isProcessRunning(i))try{process.kill(i,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(i)&&process.kill(i,"SIGKILL")},5e3)}catch(e){}try{e.existsSync(o)&&e.unlinkSync(o),e.existsSync(n)&&e.unlinkSync(n)}catch(e){}}else if(i&&this.isProcessRunning(i))try{process.kill(i,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(i)&&process.kill(i,"SIGKILL")},5e3),e.existsSync(n)&&e.unlinkSync(n)}catch(e){}else{if(!r||!this.isProcessRunning(r))throw new Error(`Service '${t}' is not running.`);try{process.kill(r,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(r)&&process.kill(r,"SIGKILL")},5e3)}catch(e){}}this.removePidFile(t),this.logger.info(`SSH service '${t}' stopped.`)}async restartService(e,t){this.runningServices.has(e)&&await this.stopService(e),await this.startService(e,t)}getRunningServices(){return Array.from(this.runningServices.keys())}getServiceConfig(e){return this.configManager.loadServiceConfig(e)}getServiceStatus(t){if(this.runningServices.has(t))return"running";try{this.configManager.loadServiceConfig(t);const a=s.join(this.pidDir,`${t}-daemon.pid`);if(e.existsSync(a)){const t=e.readFileSync(a,"utf8").trim();if(t){const r=parseInt(t);if(this.isProcessRunning(r))return"running";e.unlinkSync(a)}}const r=this.readPidFile(t);return r&&this.isProcessRunning(r)?"running":(r&&this.removePidFile(t),"stopped")}catch(e){return"not_found"}}async stopAllServices(){const e=Array.from(this.runningServices.keys());for(const t of e)await this.stopService(t)}async createService(e,t,a,r,s){return this.configManager.createServiceConfig(e,t,a,r,s)}async removeService(e){this.runningServices.has(e)&&await this.stopService(e),console.log("serviceName:",e),this.configManager.removeServiceConfig(e),this.logger.info(`Service '${e}' removed.`)}listServices(){return this.configManager.listServiceConfigs().map(e=>{const t=this.getServiceStatus(e);let a,r;try{const t=this.configManager.loadServiceConfig(e);a=t.ssh.port,r=t.description}catch(e){}return{name:e,status:t,port:a,description:r}})}updateServiceKeystores(e,t){this.configManager.updateServiceConfig(e,{keystore:{path:this.configManager.loadServiceConfig(e).keystore.path,allowed_keystores:t}})}async promptForPasswords(e){const t={};for(const a of e){let e,r=!1,s=0;const n=3;for(;!r&&s<n;){e=await da(`Enter password for keystore [${a}]`);try{const o=this.configManager.getKeystorePath();if(r=new Ga.exports.WativeCore(o,[a]).account.checkPassword(a,e),r){t[a]=e;break}if(s++,!(s<n))throw new Error(`Failed to authenticate keystore [${a}] after ${n} attempts.`);console.log(`Invalid password for ${a}`)}catch(e){if(s++,!(s<n))throw new Error(`Failed to authenticate keystore [${a}] after ${n} attempts: ${e.message}`);console.log("Error validating password for keystore")}}}return t}createServerInstance(e,t){const a=e.clients;if(0===a.length)throw new Error("No clients configured for service");if(a.length>1)throw new Error("Only one client is supported for this service");const r=JSON.parse(a[0]),s=[r.name],n=[r.public_key_path],o=[r.allowed_keystores],i=e.keystore.allowed_keystores;if(0===i.length)throw new Error("No keystores configured for service");let c=[];for(const e of i)c.push(t[e]);return new Ja(e.server_keys.private_key_path,e.server_keys.passphrase,s,n,o,e.keystore.path,i,c)}async showLogs(t,a=50,r=!1){const n=process.env.HOME+"/.wative/logs";let o;if(o=t?s.join(n,`${t}.log`):s.join(n,"service_manager.log"),!e.existsSync(o))throw new Error(`Log file not found: ${o}`);const i=P("tail",r?["-f",`-n${a}`,o]:[`-n${a}`,o],{stdio:["ignore","inherit","inherit"]});return r?(process.on("SIGINT",()=>{i.kill("SIGTERM"),process.exit(0)}),new Promise((e,t)=>{i.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})):new Promise((e,t)=>{i.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})}setupLogger(){const t=process.env.HOME+"/.wative/logs";e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),N.configure({appenders:{file:{type:"file",filename:s.join(t,"service_manager.log"),maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"}},categories:{default:{appenders:["file","console"],level:"info"}}}),this.logger=N.getLogger("service_manager"),this.logger.level="info"}setupServiceLogger(t){const a=process.env.HOME+"/.wative/logs";e.existsSync(a)||e.mkdirSync(a,{recursive:!0});const r=s.join(a,`${t}.log`);this.cleanupOldLogs(a),N.configure({appenders:{file:{type:"file",filename:s.join(a,"service_manager.log"),maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"},console:{type:"console"},[`${t}_file`]:{type:"file",filename:r,maxLogSize:10485760,backups:3,compress:!0,keepFileExt:!0,layout:{type:"pattern",pattern:"%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m"},encoding:"utf-8"}},categories:{default:{appenders:["file","console"],level:"info"},[t]:{appenders:[`${t}_file`],level:"info"}}})}cleanupOldLogs(t){try{const a=e.readdirSync(t),r=new Date;r.setDate(r.getDate()-3),a.forEach(a=>{const n=s.join(t,a);e.statSync(n).mtime<r&&a.endsWith(".log")&&(e.unlinkSync(n),this.logger.info(`Deleted old log file: ${a}`))})}catch(e){this.logger.warn(`Failed to cleanup old logs: ${e}`)}}}class Za{constructor(e){this.config=e}async executeCommand(e){return this.config.useRemoteServer?this.executeCommandThroughRemoteServer(e):new Promise((t,r)=>{const s=new C;s.on("ready",()=>{s.exec(e,(e,a)=>{if(e)return s.end(),r(e);let n="",o="";a.on("close",(e,a)=>{s.end(),0===e?t(n):r(new Error(`Command failed with code ${e}: ${o||n}`))}).on("data",e=>{n+=e.toString()}).stderr.on("data",e=>{o+=e.toString()})})}).on("error",e=>{r(e)});const n=this.config.clientAuth,o={host:this.config.host,port:this.config.port,username:n.username,privateKey:a(n.privateKeyPath),passphrase:n.passphrase};s.connect(o)})}async executeCommandThroughRemoteServer(e){return new Promise((t,r)=>{const s=new C;s.on("ready",()=>{s.forwardOut("127.0.0.1",0,this.config.host,this.config.port,(n,o)=>{if(n)return s.end(),r(n);const i=new C;i.on("ready",()=>{i.exec(e,(e,a)=>{if(e)return i.end(),s.end(),r(e);let n="",o="";a.on("close",(e,a)=>{i.end(),s.end(),0===e?t(n):r(new Error(`Command failed with code ${e}: ${o||n}`))}).on("data",e=>{n+=e.toString()}).stderr.on("data",e=>{o+=e.toString()})})}).on("error",e=>{s.end(),r(e)});const c=this.config.clientAuth,l={sock:o,username:c.username,privateKey:a(c.privateKeyPath),passphrase:c.passphrase};i.connect(l)})}).on("error",e=>{r(e)});const n={host:this.config.remoteServer.host,port:this.config.remoteServer.port||22,username:this.config.remoteServer.auth.username,privateKey:a(this.config.remoteServer.auth.privateKeyPath),passphrase:this.config.remoteServer.auth.passphrase};s.connect(n)})}async sendRequest(e){try{const t=JSON.stringify(e),a=await this.executeCommand(t),r=JSON.parse(a);if(!r.status)throw new Error(r.msg||"Request failed");return r}catch(e){if(e instanceof Error)throw new Error(`SSH request failed: ${e.message}`);throw e}}async getRootAccount(e,t){const a={method:"get_root_account",keystoreId:e,chainId:t};return(await this.sendRequest(a)).data}async getSubAccount(e,t,a,r){const s={method:"get_sub_account",params:{keystoreId:e,chainId:t,startIndex:a,endIndex:r}};return(await this.sendRequest(s)).data}async signTransaction(e,t){const a={method:"sign",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signAndSendTransaction(e,t){const a={method:"sign_and_send",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signSolanaTransaction(e,t,a){const r={method:"solana_sign",params:{txParams:e,rpcUrl:t,priority_fee:a}};return(await this.sendRequest(r)).data}async sendSignedSolanaTransaction(e,t){const a={method:"solana_send",params:{txParams:e,rpcUrl:t}};return(await this.sendRequest(a)).data}async signMessage(e,t){const a={method:"sign_message",params:{account:e,message:t}};return(await this.sendRequest(a)).data}async signTypedData(e,t,a,r,s){const n={method:"sign_typed_data",params:{account:e,domain:t,types_name:a,types:r,message:s}};return(await this.sendRequest(n)).data}}require("dotenv").config();const Xa=async e=>{const t=new Va;try{if(!e)throw new Error("Configuration name is required. Please specify a configuration name.");console.log(`Starting SSH service with configuration: ${e}`),await t.startService(e),console.log("SSH service started successfully."),process.on("SIGINT",async()=>{console.log("\nShutting down SSH services..."),await t.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nShutting down SSH services..."),await t.stopAllServices(),process.exit(0)})}catch(e){console.error(`Failed to start SSH service: ${e.message}`),process.exit(1)}},Qa=process.argv.slice(2),Ya=Qa.includes("--daemon"),er=Qa.indexOf("--config"),tr=-1!==er&&Qa[er+1]?Qa[er+1]:void 0;(Ya||tr)&&Xa(tr).catch(e=>{console.error("Failed to start SSH service:",e),process.exit(1)}),process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)});var ar=Object.freeze({__proto__:null,mainWithConfig:Xa,WativeSSHClient:Za,createWativeSSHClient:function(e){return new Za(e)},WativeWielderServer:Ja,SSHConfigManager:Na,checkFileExistence:Oa,sleep:function(e=0){return new Promise((t,a)=>{setTimeout(()=>{t(!0)},e)})},getAndGenerateConfig:async t=>{const a="/etc/wative";e.existsSync(a)||e.mkdirSync(a),await(async()=>{const t="/etc/wative",a=s.join(t,"id_rsa_server.pub"),r=s.join(t,"id_rsa_server");e.existsSync(a)&&e.existsSync(r)||(console.log("Generating SSH key pair..."),$(`ssh-keygen -t rsa -f ${r} -N 'wative_server'`,{stdio:"inherit"}));const n=s.join(t,"id_rsa_detake.pub"),o=s.join(t,"id_rsa_detake");e.existsSync(n)&&e.existsSync(o)||(console.log("Generating SSH key pair..."),$(`ssh-keygen -t rsa -f ${o} -N 'wative_detake'`,{stdio:"inherit"}))})();const r=s.join(a,"config.ini");if(!e.existsSync(r)){const a=Be(t).accounts,s={keystore:{path:t,allowed_keystores:ca(a)},ssh:{listen:"127.0.0.1",port:5678,log:{size:10485760,backups:3}}};let n=S.stringify(s);e.writeFileSync(r,n)}return S.parse(e.readFileSync(r,"utf-8"))}});const rr=new M,sr=require("../package.json");let nr;rr.version(sr.version).description("Wative CLI Tool"),rr.command("version").description("Show the version of wative").action(()=>{console.log(`Wative CLI Tool v${sr.version}`)});const or=()=>{if(!nr){const e=s.join(process.env.HOME||"",".wative","ssh");nr=new Va(e)}return nr},ir=rr.command("ssh").description("Manage SSH services");ir.command("start").description("Start SSH service").option("-c, --config <name>","Specify service configuration name").option("-d, --daemon","Run service in daemon mode").action(async t=>{const a=or();try{t.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1));const r=t.config,n=a.getServiceConfig(r),o=require("net"),i=async(e,t="127.0.0.1")=>new Promise(a=>{const r=o.createServer();r.listen(e,t,()=>{r.once("close",()=>{a(!1)}),r.close()}),r.on("error",e=>{"EADDRINUSE"===e.code?a(!0):a(!1)})});if(await i(n.ssh.port,n.ssh.listen)){const e=`Port ${n.ssh.port} on ${n.ssh.listen} is already in use. Cannot start SSH service '${r}'.`;console.error(`Error: ${e}`),process.exit(1)}if(console.log(`Port ${n.ssh.port} on ${n.ssh.listen} is available for service '${r}'`),t.daemon){console.log(`Starting SSH service '${r}' in daemon mode...`);const t=await a.promptForPasswords(n.keystore.allowed_keystores),o=require("crypto"),i=o.randomBytes(32),c=o.randomBytes(16),l=o.createCipheriv("aes-256-cbc",i,c);let u=l.update(JSON.stringify(t),"utf8","hex");u+=l.final("hex");const d=c.toString("hex")+":"+i.toString("hex")+":"+u;return void((t,a)=>{const r=s.join(process.env.HOME||"",".wative","logs"),n=s.join(process.env.HOME||"",".wative","ssh","pids");e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),e.existsSync(n)||e.mkdirSync(n,{recursive:!0});const o=s.join(r,`${t}-daemon.log`),i=s.join(n,`${t}-daemon.pid`),c=s.join(n,`${t}-watcher.pid`),l=P("node",[s.resolve(__dirname,"daemon-watcher.js"),t,o,i,c,s.resolve(__dirname,"..")],{detached:!0,stdio:"ignore",env:{...process.env,WATIVE_ENCRYPTED_PASSWORDS:a}});e.writeFileSync(c,l.pid.toString()),l.unref(),console.log(`SSH service '${t}' daemon watcher started with PID: ${l.pid}`),console.log(`Daemon log file: ${o}`),console.log(`Watcher PID file: ${c}`)})(r,d)}if(process.env.WATIVE_DAEMON_PASSWORDS&&process.env.WATIVE_WORKER_MODE){const e=require("crypto"),t=process.env.WATIVE_DAEMON_PASSWORDS;delete process.env.WATIVE_DAEMON_PASSWORDS,delete process.env.WATIVE_WORKER_MODE;try{const a=t.split(":"),s=Buffer.from(a[0],"hex"),n=Buffer.from(a[1],"hex"),o=a[2],i=e.createDecipheriv("aes-256-cbc",n,s);let c=i.update(o,"hex","utf8");c+=i.final("utf8");const l=JSON.parse(c);console.log(`[${(new Date).toISOString()}] Worker process starting SSH service '${r}'...`);const u=or();await u.startService(r,l);for(const e in l)l[e]=null,delete l[e];console.log(`[${(new Date).toISOString()}] SSH service '${r}' started successfully`);const d=async e=>{console.log(`[${(new Date).toISOString()}] Worker received ${e}, stopping service...`);try{await u.stopService(r),console.log(`[${(new Date).toISOString()}] Service stopped successfully`)}catch(e){console.error(`[${(new Date).toISOString()}] Error stopping service:`,e)}process.exit(0)};process.on("SIGTERM",()=>d("SIGTERM")),process.on("SIGINT",()=>d("SIGINT"));const p=setInterval(async()=>{try{const e=await u.getServiceStatus(r);"running"!==e&&(console.log(`[${(new Date).toISOString()}] Service status changed to: ${e}`),"stopped"===e&&(console.log(`[${(new Date).toISOString()}] Service stopped unexpectedly, exiting worker...`),clearInterval(p),process.exit(1)))}catch(e){console.error(`[${(new Date).toISOString()}] Error checking service status:`,e)}},3e4),h=setInterval(()=>{},6e4),g=()=>{clearInterval(p),clearInterval(h)};process.on("exit",g)}catch(e){console.error(`[${(new Date).toISOString()}] Worker process error:`,e),process.exit(1)}return}{await a.startService(r),console.log(`SSH service '${r}' started successfully`),process.on("SIGINT",async()=>{console.log("\nReceived SIGINT, stopping services..."),await a.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nReceived SIGTERM, stopping services..."),await a.stopAllServices(),process.exit(0)});const e=setInterval(()=>{"running"!==a.getServiceStatus(r)&&(console.log(`Service ${r} is no longer running, exiting...`),clearInterval(e),process.exit(1))},5e3);process.stdin.resume()}}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),ir.command("stop").description("Stop SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=or();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1)),await t.stopService(e.config),console.log(`SSH service '${e.config}' stopped successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),ir.command("restart").description("Restart SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=or();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1)),await t.restartService(e.config),console.log(`SSH service '${e.config}' restarted successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),ir.command("create").description("Create new SSH service configuration interactively").action(async()=>{const e=require("readline"),t=require("fs"),a=require("path"),r=e.createInterface({input:process.stdin,output:process.stdout}),s=e=>new Promise(t=>{r.question(e,t)});try{console.log("SSH create command started...");const e=a.join(process.env.HOME||"",".wative/ssh"),r=(await s(`SSH storage located in (default: ${e}): `)).trim()||e,n=a.join(process.env.HOME||"",".wative"),o=(await s(`Keystore storage located in (default: ${n}): `)).trim()||n,i=new Na(r,o);let c,l,u,d;for(;;)if(c=await s("Enter service name: "),c=ia(c),c.trim()){if(!i.serviceIsExist(c)){console.log(`Service name: ${c}`);break}console.log("Service name already exists, please enter a different name")}else console.log("Service name cannot be empty");for(;;){const e=await s("Enter port number: ");if(l=parseInt(e),isNaN(l)||l<1024||l>65535){console.log("Port number must be between 1024-65535");continue}const t=i.listServiceConfigs();let a=!1;for(const e of t)try{if(i.loadServiceConfig(e).ssh.port===l){a=!0;break}}catch(e){}if(!a)break;console.log(`Port ${l} is already in use by another service, please enter a different port`)}for(;;){const e=await s("Enter open keystore slugs (comma separated): ");if(!e.trim()){console.log("Keystore list cannot be empty");continue}if(u=e.split(",").map(e=>e.trim()).filter(e=>e),0===u.length){console.log("At least one valid keystore is required");continue}const r=a.join(o,"accounts");let n=!0;for(const e of u){const s=a.join(r,`${e}.json`);if(!t.existsSync(s)){console.log(`Keystore '${e}' does not exist`),n=!1;break}}if(n){console.log("All keystores verified to exist");break}console.log("Please re-enter valid keystore list")}for(;;){if(d=await s("Enter remote client name: "),d=ia(d),d.trim()){console.log(`Client name: ${d}`);break}console.log("Client name cannot be empty")}const p=a.join(r,"conf.d",c);t.existsSync(p)||t.mkdirSync(p,{recursive:!0});const h=a.join(p,`${d}.pub`);for(console.log("\nPlease place the remote client's public key file at the following path:"),console.log(`${h}`),console.log("\nPress Enter to continue after placing the file...");;){if(await s(""),t.existsSync(h)){console.log("Client public key file found");break}console.log("Client public key file not found, please confirm the file is correctly placed and press Enter again")}const g=await s("Enter service description (optional): ");console.log("\nCreating SSH service configuration...");const m=await i.createServiceConfig(c,l,u,d,g||void 0);console.log("\nNote: Passwords will be requested when starting the service."),console.log(`\nSSH service configuration '${c}' created successfully!`),console.log(`Port: ${l}`),console.log(`Allowed keystores: ${u.join(", ")}`),console.log(`Client name: ${d}`),console.log(`Server private key: ${m.server_keys.private_key_path}`),console.log(`Client public key: ${h}`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}finally{r.close()}}),ir.command("remove").description("Remove SSH service configuration").option("-c, --config <name>","Service configuration name").action(async e=>{const t=or();try{e.config||(console.error("Error: Configuration name is required for remove command"),process.exit(1)),await t.removeService(e.config),console.log(`SSH service configuration '${e.config}' removed successfully`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),ir.command("list").description("List all SSH service configurations").action(async()=>{const e=new Na,t=new Va,a=e.listServiceConfigs();if(0!==a.length){console.log("SSH Service Configurations:");for(const r of a)try{const a=e.loadServiceConfig(r),s=t.getServiceStatus(r);console.log(` - ${r}: ${a.description||"No description"} (${s})`)}catch(e){const a=t.getServiceStatus(r);console.log(` - ${r}: Configuration error (${a})`)}}else console.log("No SSH service configurations found.")}),ir.command("status").description("Show SSH service status").option("-c, --config <name>","Service configuration name").action(async e=>{const t=or();try{if(e.config){const a=t.getServiceStatus(e.config);console.log(`SSH service '${e.config}' status: ${a}`)}else{const e=t.listServices();if(0===e.length)return void console.log("No SSH service configurations found");console.log("SSH Service Status:"),e.forEach(e=>{const a=t.getServiceStatus(e.name);console.log(` - ${e.name}: ${a}`)})}}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),ir.command("log").description("Show SSH service logs").option("-c, --config <name>","Service configuration name").option("-n, --lines <number>","Number of lines to show (default: 50)","50").option("-f, --follow","Follow log output").action(async e=>{const t=or();try{const a=parseInt(e.lines)||50;await t.showLogs(e.config,a,e.follow)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}),rr.command("cmd").description("Start wallet-cli shell").action(async()=>{try{$("wallet-cli",{stdio:"inherit"})}catch(e){}}),(require.main===module||process.argv[1]&&(process.argv[1].includes("bin/wative.js")||process.argv[1].includes("wative")||process.argv[1].includes("ssh")))&&rr.parse(process.argv);const{WativeCore:cr}=require("wative-core"),lr=require("../package.json");require("events").EventEmitter.defaultMaxListeners=0;process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)}),require.main===module&&(async()=>{console.log("version:",lr.version),Yt();const t=await ea();await Qe(t),Ia(t);const a=s.resolve(t,"network.json"),r=JSON.parse(e.readFileSync(a,"utf8"));let n=ca(r.accounts);const o=new cr(t,n,null,!0);await Ca(t,o)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)});export{ue as DEFAULT_NETWORK,Se as GasUtil,le as MNEMONIC_WORDS,de as SOLANA_CHAIN_IDS,ar as SSH,vt as accountBalanceLog,Vt as accountIndexOrAddressValidator,Ze as accountSetting,Ot as addAsset,at as addNetwork,Nt as addToken,Kt as addrValidator,ca as batchGetKeystoreSlugByAccountName,Tt as batchGetTokenBalance,se as batchGetTokenBalanceViaMulticall,ce as batchHasTokenBalance,Zt as chainAddressValidator,va as checkFileExistence,ba as chunkArray,ga as confirmSomething,Qe as createNetwork,ie as deleteTokenBalance,ma as editorSomething,lt as enhancedBalanceDisplay,ya as excutePromiseFunction,Gt as expandAmountValidator,Sa as formatAddr,Jt as gasValidator,gt as getAccountAddress,bt as getAccountBalance,H as getAccountBalanceInEvm,G as getAccountBalanceInSolana,wa as getAccountChainType,qt as getAccountIndex,Mt as getAccountIndexByKeystoreSlug,Re as getAccountInfo,re as getAccountInfoInSolana,la as getAccountName,oa as getAccountNameByKeystoreSlug,Dt as getAccountRange,$t as getAssetList,Pt as getAssetListByTokenName,Et as getBatchAccountBalance,ta as getChainId,J as getChainIdByEvm,he as getChainType,Y as getCodeInEvm,na as getColor,kt as getDefaultNetworkByAddress,St as getEvmNetworks,ea as getKeystorePath,ia as getKeystoreSlugByAccountName,ae as getLatestBlockhash,ra as getMulticallAddress,pe as getNativeTokenDecimals,Be as getNetworkInfo,ht as getNetworkInfoByName,pt as getNetworkTypeByName,mt as getPKAccountAddress,te as getPrioritizationFee,aa as getRpcUrl,it as getShowTokenList,xt as getStatus,sa as getSymbol,oe as getTokenBalance,X as getTokenBalanceInEvm,Q as getTokenBalanceInSolana,V as getTokenInfoInEvm,Z as getTokenInfoInSolana,W as getTokenProgramId,ee as getTransferTokenData,fa as hexValidator,pa as importMaskedPassphrase,ua as inputMaskedPassword,ha as inputPassword,da as inputPasswordWithoutValidator,Rt as inputSomething,me as isEvmAddress,ge as isSolanaAddress,Wt as lastAccountNoValidator,Aa as listWithLazyBalanceLoading,Me as loginIn,Ut as numberValidator,Ht as passphraseValidator,rr as program,tt as removeNetwork,De as saveAccountInfo,Ct as saveAsset,Qt as selectCheckboxSomething,dt as selectDefaultNetwork,ot as selectFlag,Ye as selectOrEditNetwork,Xt as selectSomething,Ce as selectToolsOptions,$e as sendSolanaRawTransaction,yt as showAllAccounts,jt as showAssets,At as showAssetsDetail,rt as showAvailableNetworks,st as showDataview,Yt as showIntroduction,ut as showNetwork,ct as showTokenList,Ne as showTools,ka as sleep,wt as switchNetworkByAccountName,ft as switchPPNetwork,zt as tagValidator,ne as updateBalance,et as updateNetwork,nt as updateStatus,Ia as updateStorage,It as updateTokenBalanceOption};