wative 1.2.19 → 1.2.21

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.umd.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs"),require("path"),require("figlet"),require("inquirer"),require("web3"),require("@solana/web3.js"),require("@solana/spl-token"),require("@metaplex-foundation/js"),require("bignumber.js"),require("ini"),require("crypto"),require("child_process"),require("ssh2"),require("log4js"),require("ethers"),require("tweetnacl"),require("bs58"),require("bip39"),require("@coral-xyz/anchor"),require("crypto-js"),require("ethereumjs-wallet"),require("micro-ed25519-hdkey"),require("net"),require("commander")):"function"==typeof define&&define.amd?define(["exports","fs","path","figlet","inquirer","web3","@solana/web3.js","@solana/spl-token","@metaplex-foundation/js","bignumber.js","ini","crypto","child_process","ssh2","log4js","ethers","tweetnacl","bs58","bip39","@coral-xyz/anchor","crypto-js","ethereumjs-wallet","micro-ed25519-hdkey","net","commander"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).demo={},e.fs,e.path,e.figlet,e.inquirer,e.Web3,e.require$$6,e.splToken,e.js,e.bignumber_js,e.ini,e.crypto,e.child_process,e.ssh2,e.log4js,e.ethers,e.require$$3,e.require$$4,e.require$$5,e.require$$7,e.require$$8,e.require$$9,e.require$$10,e.net,e.commander)}(this,function(e,t,a,r,n,s,o,i,c,l,u,d,p,g,h,m,f,y,w,v,b,k,S,x,_){"use strict";function P(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function $(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 A=$(t),N=P(t),I=$(a),C=P(a),T=$(r),j=P(n),O=P(s),B=P(o),E=$(u),F=$(d),L=$(h),q=P(f),K=P(y),R=P(w),D=P(v),M=P(b),z=P(k),U=P(S),H=$(x);const J=console.error;console.error=(...e)=>{((new Error).stack||"").toLowerCase().includes("@solana/web3.js")||J.apply(console,e)};const G={},W=[{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"}],V=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],Z=async e=>{let t=new O.default(e);return await ba(t.eth.getChainId,[])},X=async(e,t)=>{const a=new O.default(t);return await ba(a.eth.getBalance,[e])},Q=async(e,t)=>{const a=new o.Connection(t);return await ba(a.getBalance.bind(a),[new o.PublicKey(e)])},Y=async(e,t)=>{const a=new o.Connection(t),r=new o.PublicKey(e);let n=await ba(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()}},ee=async(e,t)=>{const a=new(new O.default(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 ba(a.methods.symbol().call.bind(a),[]),n=await ba(a.methods.name().call.bind(a),[]),s=await ba(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"}},te=async(e,t)=>{let a=await Y(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const r=a.output,n=new o.Connection(t),s=c.Metaplex.make(n),l=new o.PublicKey(e);let u=await ba(i.getMint,[n,l,"finalized",new o.PublicKey(r)]),d={status:!0,output:{symbol:"",name:"",decimals:""}};if(!u.status)return{status:!1,output:"Failed to get token decimals"};d.output.decimals=u.output.decimals;try{const e=s.nfts().pdas().metadata({mint:l});if(await n.getAccountInfo(e)){const e=await s.nfts().findByMint({mintAddress:l});d.output.name=e.name,d.output.symbol=e.symbol}else try{const e=await i.getTokenMetadata(n,l);e&&(e.name&&(d.output.name=e.name),e.symbol&&(d.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return d},ae=async(e,t,a)=>{const r=new(new O.default(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 ba(r.methods.balanceOf(e).call.bind(r),[]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get token balance"}},re=async(e,t,a)=>{let r=await Y(t,a);if(!r.status)return{status:!1,output:"Failed to get token program id"};const n=r.output,s=new o.Connection(a),c=i.getAssociatedTokenAddressSync(new o.PublicKey(t),new o.PublicKey(e),!1,new o.PublicKey(n));let l=await ba(s.getTokenAccountBalance.bind(s),[c]);return l.status?{status:!0,output:l.output.value.amount}:l.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},ne=async(e,t)=>{const a=new O.default(t);let r=await ba(a.eth.getCode.bind(a),[e]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get code"}},se=async(e,t,a)=>new O.default(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]),oe=async e=>{const t=new o.Connection(e);let a=await ba(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}},ie=async e=>{const t=new o.Connection(e);let a=await ba(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}},ce=async(e,t)=>{const a=new o.Connection(t);let r=await ba(a.getAccountInfo.bind(a),[new o.PublicKey(e.toString())]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get account info"}},le=async(e,t,a,r)=>{let n=[];try{let s=[];const o=new O.default(a),i=new o.eth.Contract(W,r);for(const a of e)if("0"===t){const e=i.methods.getEthBalance(a).encodeABI();s.push({target:r,callData:e})}else{const e=new o.eth.Contract(V,t).methods.balanceOf(a).encodeABI();s.push({target:t,callData:e})}const{returnData:c}=await i.methods.aggregate(s).call();for(let e=0;e<c.length;e++){const t=o.eth.abi.decodeParameter("uint256",c[e]);n.push(t)}}catch(e){console.log("Multicall aggregate failed")}return n},ue=async(e,t,a,r,n,s)=>{let o;if(e=e.filter(e=>e&&e.length>30),a in G?o=G[a][t]||{}:(G[a]={},o={}),s&&s.length>0&&n){let a=await le(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 X(a,r):await Q(a,r):n?await ae(a,t,r):await re(a,t,r),e.status&&(o[a]=e.output),await xa(1e3)}return G[a][t]=o,G},de=(e,t,a,r,n,s)=>{let o={};if(!(e in G))return o;n&&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||s.includes(r.address))&&((n||"0"!==r.address)&&G[e][r.address])){if(i in G[e][r.address]){c=new l.BigNumber(G[e][r.address][i]).dividedBy(10**r.decimals).toFixed(r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:4,l.BigNumber.ROUND_FLOOR)}o[i]||(o[i]={}),o[i][r.symbol]=c}}}return o},pe=(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 G[e][r][n]}catch(e){}}}},ge=(e,t)=>{let a=0;if(e in G&&"0"in G[e])for(let r=0;r<t.length;r++)t[r]in G[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},he=["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"],me=[{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}}],fe=["901","902","903"],ye=e=>fe.includes(e)?9:18,we=e=>fe.includes(e)?"solana":"evm",ve=e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e),be=e=>e.startsWith("0x")&&42===e.length,{BN:ke}=require("bn.js"),{stripHexPrefix:Se}=require("ethereumjs-util"),{BigNumber:xe}=require("bignumber.js");function _e(e){return new ke(Se(e.toString("hex")),16)}const Pe=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function $e(e){return Pe(e.toString(16))}class Ae{constructor(e){this.query=new O.default(O.default.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,r=$e(function(e,t,a){const r=new ke(t),n=new ke(a);return e.mul(r).div(n)}(_e(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 xe(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const r=_e(e),n=_e(t).muln(.9),s=r.muln(a);return r.gt(n)?$e(r):s.lt(n)?$e(s):$e(n)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:r,simulationFails:n}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(Pe(r),a,t),simulationFails:n}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const Ne=require("chalk");require("wative-core");const Ie=async e=>{let t=[new j.default.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 j.default.Separator("——————————————-"),"Send it now","Back"],a=await ea(t),r=t.indexOf(a);return 1===r&&(e.from=await Dt("from",Yt)),2===r&&(e.to=await Dt("to",Yt)),3===r&&(e.nonce=await Dt("nonce")),4===r&&(e.gasPrice=await Dt("gasPrice")),5===r&&(e.data=await wa("data")),6===r&&(e.value=await Dt("value")),7===r&&(e.gas=await Dt("gas")),9===r?e:10===r?null:await Ie(e)},Ce=async(e,t,a,r,n)=>{const s=await Dt("to",Yt);let i=(new o.Transaction).add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(r),toPubkey:new o.PublicKey(s),lamports:1e6}));i.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),i.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),i.feePayer=new o.PublicKey(r);let c=await ie(t);if(!c.status)return void console.log(Ne.red(c.output));i.recentBlockhash=c.output.blockhash;const u=await n.account.simulateTransaction(r,t,i);if(!u.status)return void console.log(Ne.red(u.output));if(!u.output||!u.output.value||0===u.output.value.unitsConsumed||u.output.value.err)return console.log(Ne.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(u.output,null,4)),void console.log("==============================================");let d=new l.BigNumber(u.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,l.BigNumber.ROUND_CEIL),p=new l.BigNumber(d);const g=await oe(t);if(!g.status)return void console.log(Ne.red(g.output));const h=new l.BigNumber(g.output.toString()),m=p.multipliedBy(h).dividedBy(1e6).toFixed(0,l.BigNumber.ROUND_CEIL),f=await Q(r,t);if(!f.status)return void console.log(Ne.red(f.output));const y=new l.BigNumber(f.output).minus(5e3).minus(m);let w=new l.BigNumber(y).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(w)<new l.BigNumber(0))return void console.log(Ne.red("Not enough balance"));let v=await Te(w,y.toString(),a,9),b=new o.Transaction;b.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(p)})),b.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(h)})),b.add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(r),toPubkey:new o.PublicKey(s),lamports:Number(v)})),b.feePayer=new o.PublicKey(r),b.recentBlockhash=c.output.blockhash;const k=await n.account.signTransaction(r,b,t);if(!k.status)return void console.log(Ne.red(k.output));let S=await n.account.sendSignedTransaction(r,k.output,t);S.status?(pe(e,[r,s],["0"]),console.log(Ne.green(`Transaction hash: ${S.output}`))):console.log(Ne.red(S.output))},Te=async(e,t,a,r)=>{let n=["> Input value",`> Total Balance (${e} ${a})`],s=await ea(n),o=n.indexOf(s),i="0";if(0===o){let e=await Dt("value",Gt);i=new l.BigNumber(e).multipliedBy(10**r).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===o&&(i=t);return new l.BigNumber(i).isLessThanOrEqualTo(new l.BigNumber(t))?i:(console.log(Ne.red("Not enough balance")),Te(e,t,a,r))},je=async(e,t,a)=>{let r=["> Input amount",`> Total Balance (${new l.BigNumber(e).dividedBy(10**a).toFixed(4,l.BigNumber.ROUND_FLOOR)} ${t})`],n=await ea(r),s=r.indexOf(n),o="0";if(0===s){let e=await Dt("amount",Gt);o=new l.BigNumber(e).multipliedBy(10**a).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===s&&(o=e);return new l.BigNumber(o).isLessThanOrEqualTo(new l.BigNumber(e))?o:(console.log(Ne.red("Not enough balance")),je(e,t,a))},Oe=async(e,t,a,r)=>{let n=_t(e,t,a),s=yt(e,n),c=ka(a);if(s!==c&&("evm"===c&&(n="Ethereum Mainnet"),"solana"===c&&(n="Solana Mainnet"),s=yt(e,n)),"evm"===s){if(await ya(`Network (${n}), want a change?`,!1)){const t=Pt(e);n=await ea(t,"Select a network")}}let u=await xt(a,e,n);if(!u.status)return void console.log(Ne.red(u.output));const d=wt(e,n);console.log(Ne.green(` ${d.nativeCurrency.symbol} Balance: ${u.output}`));const p=["> Send Raw Tx","> Send Token",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(p)){case"> Send Raw Tx":"evm"===c&&await(async(e,t,a,r,n)=>{const s=await Dt("to",Yt),o=new Ae(t),i=await o.getGasPrice(),c=new l.BigNumber(i.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);let u=await Dt(`Gas price (${c}), agree or enter`,Wt)||c;u=new l.BigNumber(u).multipliedBy(1e9).toFixed(0);let d,p=await ne(s,t);if(!p.status)return void console.log(Ne.red(p.output));d="42161"===e||"421614"===e?"1700000":"21000";let g,h,m=new l.BigNumber(0);if("8453"===e&&(m=new l.BigNumber(1e-5).multipliedBy(1e18)),"0x"===p.output){g="0x";let e=await X(r,t);if(!e.status)return void console.log(Ne.red(e.output));let n=new l.BigNumber(e.output),s=new l.BigNumber(u),o=n.minus(s.multipliedBy(Number(d))).minus(m).toFixed(0,l.BigNumber.ROUND_FLOOR),i=new l.BigNumber(o).dividedBy(1e18).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(i)<new l.BigNumber(0))return void console.log(Ne.red("Not enough balance"));h=await Te(i,o,a,18)}else g=await wa("data",va),h=await Dt("value",Gt);const f=await o.getTransactionCount(r),y=await Dt(`Nonce (${f}), agree or enter`);let w={from:r,to:s,nonce:y||f.toString(),gasPrice:u,data:g,value:h};if("0x"===g)w.gas=d;else{let e=w.gasPrice;delete w.gasPrice;try{w.gas=(await o.estimateTxGas(w)).toString()}catch(e){return void console.log(Ne.red("Error: "+e))}w.gasPrice=e}if(w=await Ie(w),!w)return;const v=await n.account.signTransaction(r,w,t);v.status?(console.log(Ne.green(`Transaction hash: ${v.output.transactionHash}`)),n.account.sendSignedTransaction(r,v.output.rawTransaction,t),pe(e,[r,s],["0"])):console.log(Ne.red(v.output))})(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,r),"solana"===c&&await Ce(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===c&&await(async(e,t,a,r,n)=>{let s,o,i;switch(await ea(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Dt("token ticker");let n=await It(e,a,i);if(0===n.length)return void console.log(Ne.red("Token not found"));let c=[];for(let e=0;e<n.length;e++){const a=await ae(r,n[e].address,t);if(!a.status)return void console.log(Ne.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,l.BigNumber.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 u=await ea(c);const d=n[c.indexOf(u)];s=d.address,o=Number(d.decimals);break;case"> Input token contract address":s=await Dt("token contract address",Yt);let p=await ee(s,t);if(!p.status)return void console.log(Ne.red(p.output));o=Number(p.output.decimals),i=p.output.name}const c=await Dt("Receipt",Yt),u=await ae(r,s,t);if(!u.status)return void console.log(Ne.red(u.output));const d=new Ae(t),p=await d.getGasPrice(),g=new l.BigNumber(p.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);let h=await Dt(`Gas price (${g}), agree or enter`,Wt)||g;h=new l.BigNumber(h).multipliedBy(1e9).toFixed(0);let m=await je(u.output,i,o);const f=await se(c,m,t),y=await d.getTransactionCount(r),w=await Dt(`Nonce (${y}), agree or enter`);let v={from:r,to:s,nonce:w||y.toString(),gasPrice:h,data:f,value:"0"};if("0x"===f)v.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=v.gasPrice;delete v.gasPrice;try{v.gas=(await d.estimateTxGas(v)).toString()}catch(e){return void console.log(Ne.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await Ie(v),!v)return;const b=await n.account.signTransaction(r,v,t);b.status?(console.log(Ne.green(`Transaction hash: ${b.output.transactionHash}`)),n.account.sendSignedTransaction(r,b.output.rawTransaction,t),pe(a,[r,c],["0",s])):console.log(Ne.red(b.output))})(e,d.rpcUrl,d.chainId.toString(),a,r),"solana"===c&&await(async(e,t,a,r,n)=>{let s,c,u;switch(await ea(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Dt("token ticker");let n=await It(e,a,u);if(0===n.length)return void console.log(Ne.red("Token not found"));let o=[];for(let e=0;e<n.length;e++){const a=await re(r,n[e].address,t);if(!a.status)return void console.log(Ne.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===n.length){o.push(`> 1. ${u} Balance: ${s}`);break}o.push(`> ${e+1}. ${u} Balance: ${s}(${n[e].address})`),o.push(n[e].address)}let i=await ea(o);const d=n[o.indexOf(i)];s=d.address,c=Number(d.decimals);break;case"> Input token contract address":s=await Dt("token contract address",Yt);let p=await te(s,t);if(!p.status)return void console.log(Ne.red(p.output));c=Number(p.output.decimals),u=p.output.name}const d=await Dt("Receipt",Yt),p=await re(r,s,t);if(!p.status)return void console.log(Ne.red(p.output));let g=await je(p.output,u,c),h=await Y(s,t);if(!h.status)return void console.log(Ne.red(h.output));const m=new o.PublicKey(h.output);let f=i.getAssociatedTokenAddressSync(new o.PublicKey(s),new o.PublicKey(r),!0,m);const y=await ce(f.toString(),t);if(!y.status)return void console.log(Ne.red(y.output));if(!y.output||y.output.owner.toString()===o.PublicKey.default)return void console.log(Ne.red("From token account not found"));let w=i.getAssociatedTokenAddressSync(new o.PublicKey(s),new o.PublicKey(d),!1,m);const v=await ce(w.toString(),t);if(!v.status)return void console.log(Ne.red(v.output));let b=new o.Transaction,k=new o.Transaction;v.output&&v.output.owner.toString()!==o.PublicKey.default||(b.add(i.createAssociatedTokenAccountInstruction(new o.PublicKey(r),new o.PublicKey(w),new o.PublicKey(d),new o.PublicKey(s),m)),k.add(i.createAssociatedTokenAccountInstruction(new o.PublicKey(r),new o.PublicKey(w),new o.PublicKey(d),new o.PublicKey(s),m))),b.add(i.createTransferInstruction(f,w,new o.PublicKey(r),Number(g),[],m)),b.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),b.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),b.feePayer=new o.PublicKey(r);const S=await n.account.simulateTransaction(r,t,b);if(!S.status)return void console.log(Ne.red(S.output));if(!S.output||!S.output.value||0===S.output.value.unitsConsumed||S.output.value.err)return console.log(Ne.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(S.output,null,4)),void console.log("==============================================");let x=new l.BigNumber(S.output.value.unitsConsumed.toString());x=new l.BigNumber(Math.ceil(1.2*Number(x)));const _=await oe(t);if(!_.status)return void console.log(Ne.red(_.output));const P=new l.BigNumber(_.output.toString());k.add(i.createTransferInstruction(f,w,new o.PublicKey(r),Number(g),[],m)),k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(x)})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(P)})),b.feePayer=new o.PublicKey(r);const $=await n.account.signTransaction(r,k,t);if(!$.status)return void console.log(Ne.red($.output));let A=await n.account.sendSignedTransaction(r,$.output,t);A.status?(pe(a,[r,d],["0",s]),console.log(Ne.green(`Transaction hash: ${A.output}`))):console.log(Ne.red(A.output))})(e,d.rpcUrl,d.chainId.toString(),a,r);break;case"> Back":return}},Be=async(e,t,a,r)=>{const n=["> SendTx","> SignMessage",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> SendTx":await Oe(e,t,a,r);break;case"> SignMessage":{const e=await wa("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(Ne.red(t.output));break}console.log(Ne.green("Signature: "+t.output));break}case"> Back":return}await Be(e,t,a,r)},Ee=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new j.default.Separator("----------------------------------"),"> Back"],n=await ea(r);if("> Back"===n)return;"> Send Tx"===n&&(a=await Dt("Input address to send tx",Yt)),"> Search Accounts"===n&&(a=await Dt("Input part address to send tx",Jt));let s=t.account.getAccountLabel(a);if(null===s)return console.log(Ne.red("Account not found")),void await Ee(e,t);let o=s.account_label,i=la(e,o);if(a=s.account_address,null===o)return console.log(Ne.red("Account not found")),void await Ee(e,t);const c=await zt(e,o,a);if(null===c)return console.log(Ne.red("Account not found")),void await Ee(e,t);console.log(Ne.green(`Address found!\n address: ${a}\n account name: [${i}]\n account index: #${c}`)),(await He(e,o,t)).isLoginIn?(await Be(e,o,a,t),await Ee(e,t)):await Ee(e,t)},Fe=require("chalk");require("dotenv").config();const Le=require("cli-progress");require("wative-core");const qe={keystore_slug:"",default_account_index:0},Ke=async e=>{const t=Me(e);let a=[];t.accounts&&(a=t.accounts);let r=await pa("Account Name",a);return null===r?null:{account_name:r,password:await fa(`Please set a password for Account [${r}]`),selected_default_network:await ft(e)}},Re=async(e,t,a,r,n,s,o)=>{let i=await wt(e,n);"evm"!==we(i.chainId.toString())||r.startsWith("0x")||(r="0x"+r);let c=await s.account.generatePKAccount(a,r,t,i.chainId.toString(),o);if(!c.status)return void console.log(Fe.red(c.output));let l,u=I.join(e,`accounts/${a}.json`);if(A.existsSync(u)){let e=JSON.parse(A.readFileSync(u,"utf8"));if("data"in e){if(e.data.map(e=>e.ciphertexts.address).includes(c.output.ciphertexts.address))return void console.log(Fe.red("The account has already been imported"));e.data.push({ciphertexts:c.output.ciphertexts}),l=e}else e.data=[{ciphertexts:e.ciphertexts}],delete e.ciphertexts,e.data.push({ciphertexts:c.output.ciphertexts}),l=e}else c.output.data=[{ciphertexts:c.output.ciphertexts}],delete c.output.ciphertexts,c.output.default_network=n,l=c.output;A.writeFileSync(u,JSON.stringify(l,null,4)),s.account.reloadAccount()},De=async(e,t)=>{const a=["> Import Passphrase","> Import Private Key",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(a)){case"> Import Passphrase":await(async(e,t)=>{let a=await Ke(e);if(!a)return;let r=await ma("Please enter a mnemonic [split by space]",Vt);r=r.replace(/\s+/g," ");let n=ua(a.account_name);const s=t.account.generatePPAccount(n,r,a.password);if(!s.status)return void console.log(Fe.red(s.output));let o=I.join(e,`accounts/${n}.json`);s.output.default_network=a.selected_default_network,A.writeFileSync(o,JSON.stringify(s.output,null,4));const i=I.resolve(e,"network.json"),c=JSON.parse(A.readFileSync(i,"utf8"));c.accounts.push(a.account_name),A.writeFileSync(i,JSON.stringify(c,null,4))})(e,t);break;case"> Import Private Key":await(async(e,t)=>{let a=await Ke(e);if(!a)return;let r=await ga("Please enter a private key"),n=ua(a.account_name);await Re(e,a.password,n,r,a.selected_default_network,t,!0);const s=I.resolve(e,"network.json"),o=JSON.parse(A.readFileSync(s,"utf8"));o.accounts.push(a.account_name),A.writeFileSync(s,JSON.stringify(o,null,4))})(e,t);break;case"> Back":return}t.account.reloadAccount()},Me=e=>{const t=I.resolve(e,"network.json");return JSON.parse(A.readFileSync(t,"utf8"))},ze=(e,t)=>{const a=I.join(e,`accounts/${t}.json`);return JSON.parse(A.readFileSync(a,"utf8"))},Ue=(e,t,a)=>{const r=I.join(e,`accounts/${t}.json`);A.writeFileSync(r,JSON.stringify(a,null,4))},He=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let r=0;r<3;r++){let r,n=la(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 ha(`Please input the password for Account [${n}]`),!r)return console.log(Fe.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 ea(i,o.output);if("> Back"===c)return{isLoginIn:!1}}return{isLoginIn:!1}},Je=async(e,t)=>{const a=Me(e).accounts;let r=["> Back",new j.default.Separator("----------------------------------")];const n=a.length;if(0===n)return void console.log(Fe.red("No address here yet"));for(let t=0;t<n;t++){const n=a[t],s=ua(n),o=ze(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 ea(r,"Select an account");if("> Back"===s)return;const o=a[r.indexOf(s)-2],i=ua(o);console.log(Fe.green(`Keystore slug: [${i}]`));let c=await He(e,i,t);c.isLoginIn&&await We(e,i,t,c.password),await Je(e,t)},Ge=async(e,t,a)=>{const r=await ze(e,t);let n=["> Disabled Slots","> Add Single","> Add Range",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(Fe.red("No disabled slots here yet"));break}let n=r.data,s=["> Back",new j.default.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 n[r]&&(c=n[r].default_network),"default_network"in n[i]&&(l=n[i].default_network);let u,d,p=yt(e,c),g=yt(e,l);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==g&&"solana"!==g)throw new Error(`Invalid network type: ${g}`);u="evm"===p?n[r].ciphertexts.evm.address:n[i].ciphertexts.solana.address,d="evm"===g?n[i].ciphertexts.evm.address:n[i].ciphertexts.solana.address,r===i?s.push(`${t+1}. ${u}[${r}]`):s.push(`${t+1}. ${u}[${r}]-${d}[${i}]`)}let i=await ea(s);if("> Back"===i)break;if(!await ya(`Are you sure to delete the ${i}?`,!0))break;let c=s.indexOf(i)-2;r.disabled_slots.splice(c,1),Ue(e,t,r);break}case"> Add Single":{let a=await Ut(r,"Input address or index");if(null===a){console.log(Fe.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],Ue(e,t,r);break}case"> Add Range":{let a=await Mt(r);if(!a){console.log(Fe.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],Ue(e,t,r);break}}await Ge(e,t)},We=async(e,t,a,r)=>{let n,s=await ze(e,t);n="PP"===s.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${s.default_network}]`,"> Remove",new j.default.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${s.default_network}]`,"> Remove",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> Address List":await Ve(e,t,a);break;case"> Expand Address":{const r=await Dt("Expand accounts count",Zt);if(Number(r)>2e3){console.log(Fe.red("Too many accounts, please input less than 2000"));break}await Xe(e,t,Number(r),a);break}case"> Import Private Key":await(async(e,t,a,r)=>{let n=await Dt("Please enter a private key"),s=I.join(e,`accounts/${a}.json`),o=JSON.parse(A.readFileSync(s,"utf8"));await Re(e,t,a,n,o.default_network,r,!1)})(e,r,t,a);break;case"> Slice Address":{const r=await Dt("Please input last account number",Xt);await Qe(e,t,Number(r),a);break}case"> Remove Address":await Ye(e,t,a);break;case"> Disable Address":await Ge(e,t);break;case"> Reset Account Password":{let r=la(e,t);const n=await fa(`Please input new password for Account [${r}]`),s=await fa(`Please confirm new password for Account [${r}]`);if(!n||!s||n!==s){console.log(Fe.red("Passwords do not match"));break}return void await a.account.resetPassword(t,n)}case`> Switch Networks [${s.default_network}]`:await St(e,t,!0);break;case"> Remove":return void await et(e,t);case"> Back":return}await We(e,t,a,r)},Ve=async(e,t,a)=>{const r=await ze(e,t);let n=["> Back",new j.default.Separator("----------------------------------")],s=r.disabled_slots,o=$t(e),i=r.default_network,c=wt(e,i),l=we(c.chainId.toString()),u=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,i=r.data[e].tag?`(${r.data[e].tag})`:"",c=a.account.checkIsDisableAddress(s,e);t="PP"===r.account_type?"evm"===l?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,c?n.push(new j.default.Separator(Fe.yellow(`#${e.toString().padEnd(u)} ${_a(t,o.fullAddr)} ${i}`))):n.push(`#${e.toString().padEnd(u)} ${_a(t,o.fullAddr)} ${i}`)}let d,p=qe.keystore_slug===t?n[qe.account_index]:n[0],g=qe.keystore_slug===t&&qe.account_index>0,h=await Nt(e,c.chainId.toString());if(g&&qe.account_index>15){let e=n.slice(0,qe.account_index-15);d=n.slice(qe.account_index-15).concat(e)}else d=n.slice(0);let m=await Ia(d,"evm"===l,e,h,c,o.gasToken,o.extendedToken,g,"Select an account",p);"> Back"!==m&&(qe.keystore_slug=t,qe.account_index=n.indexOf(m),await Ze(e,t,n.indexOf(m)-2,a),await Ve(e,t,a))},Ze=async(e,t,a,r)=>{const n=await ze(e,t);let s=n.default_network,o=vt(e,t,a);const i=await wt(e,s),c=await xt(o,e,s);c.status?console.log(Fe.green(` Address No: #${a}\n Network: ${s}\n ${i.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(Fe.green(` Address No: #${a}\n Network: ${s}\n ${i.nativeCurrency.symbol}`));let l="> Tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(l=`> Tag(${n.data[a].tag})`);let u=["> Tools","> Show address","> Assets",l,"> Reload balances","> Dump private key",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(u)){case"> Tools":await Be(e,t,o,r);break;case"> Show address":await kt(e,t,a);break;case"> Assets":await Ct(e,s,o);break;case"> Reload balances":await Tt(e,s,o);break;case l:{let r="Current tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(r=`Current tag (${n.data[a].tag})`);let s=await Dt(r,Ht);n.data[a].tag=s.replace(/\s+/g," ").trim(),Ue(e,t,n);break}case"> Dump private key":{let n=vt(e,t,a),s=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",s);break}case"> Back":return}},Xe=async(e,t,a,r)=>{const n=await ze(e,t),s=n.data.length,o=new Le.SingleBar({},Le.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(Fe.red(a.output));n.data.push({ciphertexts:a.output}),o.increment()}o.stop(),Ue(e,t,n),r.account.reloadAccount()},Qe=async(e,t,a,r)=>{const n=await ze(e,t);n.data=n.data.slice(0,a+1),Ue(e,t,n),r.account.reloadAccount()},Ye=async(e,t,a)=>{let r=await Dt("Please input the accountIndex to remove this account",Gt);if("0"===r)return void console.log(Fe.red("Can't remove the first account"));let n=await ze(e,t);await ya(`Are you sure you want to remove this account(${n.data[r].ciphertexts.address})`,!0)&&(n.data.splice(Number(r),1),Ue(e,t,n),a.account.reloadAccount())},et=async(e,t)=>{let a=await Dt("Please input the account name to remove this account"),r=la(e,t);if(a!==r)return void console.log(Fe.red("Can't remove this account"));if(!await ya(`Are you sure you want to remove this account(${r})`,!0))return;let n=I.join(e,`accounts/${t}.json`);A.rmSync(n);const s=I.resolve(e,"network.json");if(!A.existsSync(s))return;const o=JSON.parse(A.readFileSync(s,"utf8"));let i=o.accounts.indexOf(r);o.accounts.splice(i,1),A.writeFileSync(s,JSON.stringify(o,null,2))},tt=async(e,t)=>{const a=I.resolve(e,"accounts");A.existsSync(a)||A.mkdirSync(a);let r;switch(r=0===Me(e).accounts.length?["> Create a new account",new j.default.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new j.default.Separator("----------------------------------"),"> Back"],await ea(r)){case"> Select an account":await Je(e,t);break;case"> Create a new account":await De(e,t);break;case"> Back":return}await tt(e,t)},at=require("chalk"),rt=async e=>{const t=I.resolve(e,"network.json");if(A.existsSync(t))return;const a={networks:me,currentNetwork:"Ethereum Mainnet",accounts:[]};A.writeFileSync(t,JSON.stringify(a,null,2))},nt=async(e,t)=>{let a=["> Edit"];"Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new j.default.Separator("----------------------------------")),a.push("> Back");switch(await ea(a)){case"> Edit":await st(e,t);break;case"> Remove":await ot(e,t)}},st=async(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));let n=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];n.push(t.name)}let s=t.rpcUrl,o=t.chainId.toString(),i=t.nativeCurrency.symbol,c=t.name,l=t.multicallAddress,u=t.color;if("Ethereum Mainnet"===t.name||"Solana Mainnet"===t.name)s=await sa(t.chainId.toString(),`Rpc Url (default: ${t.rpcUrl})`,!0);else{if(c=await Dt(`Chain Name (default: ${t.name})`),c&&c!==t.name&&n.includes(c))return void console.log(at.red("Chain Name already exists"));o=await na(`Chain Id (default: ${t.chainId})`,!0),s=await sa(o||t.chainId,`RPC Url (default: ${t.rpcUrl})`,!0),i=await ia(`Symbol (default: ${t.nativeCurrency.symbol})`),l=await oa(t.multicallAddress?`Multicall Address (Optional) (default: ${t.multicallAddress})`:"Multicall Address (Optional)"),u=await ca(t.color?`Color (Optional): (default: ${t.color})`:"Color (Optional)")}s=s||t.rpcUrl,o=o||t.chainId.toString(),i=i||t.nativeCurrency.symbol,c=c||t.name,l=l||t.multicallAddress,u=u||t.color;let d=ye(o.toString()),p={name:c||t.name,chainId:Number(o)||t.chainId,rpcUrl:s||t.rpcUrl,nativeCurrency:{name:i||t.nativeCurrency.symbol,symbol:i||t.nativeCurrency.symbol,decimals:d||t.nativeCurrency.decimals}};(l||t.multicallAddress)&&(p.multicallAddress=l||t.multicallAddress),(u||t.color)&&(p.color=u||t.color);for(let e=0;e<r.networks.length;e++)if(r.networks[e].name===t.name){r.networks[e]=p;break}A.writeFileSync(a,JSON.stringify(r,null,2))},ot=async(e,t)=>{const a=I.resolve(e,"network.json");let r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++)if(r.networks[e].name===t.name){r.networks.splice(e,1);break}t.name===r.currentNetwork&&(r.currentNetwork="Ethereum Mainnet"),A.writeFileSync(a,JSON.stringify(r,null,2))},it=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];r.push(t.name)}console.log(at.green("Please input someting about network"));const n=await Dt("Chain Name");if(r.includes(n))return void console.log(at.red("Chain Name already exists"));const s=await na("Chain Id");if(!s)return;const o=await sa(s,"RPC Url");if(!o)return;const i=await ia("Symbol");if(!i)return;const c=await oa("Multicall Address (Optional)"),l=await ca("Color (Optional)");let u=ye(s.toString()),d={name:n,chainId:Number(s),rpcUrl:o,nativeCurrency:{name:i,symbol:i,decimals:u}};c&&(d.multicallAddress=c),l&&(d.color=l),a.networks.push(d),A.writeFileSync(t,JSON.stringify(a,null,2))},ct=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=[],n=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];"solana"===we(t.chainId.toString())?n.push(e):r.push(e)}let s=["> Back","+ Add Network",new j.default.Separator("----Networks(evm)----")];for(let e=0;e<r.length;e++){const t=r[e];let n=`${e+1}.${a.networks[t].name}`;0===e&&(n+=" 🔒"),s.push(n)}s.push(new j.default.Separator("----Networks(solana)----"));for(let e=0;e<n.length;e++){const t=n[e];let r=`${e+1}.${a.networks[t].name}`;0===e&&(r+=" 🔒"),s.push(r)}const o=await ea(s);if("> Back"===o)return;if("+ Add Network"===o)return void await it(e);let i,c=s.indexOf(o);i=c<r.length+3?a.networks[r[c-3]]:a.networks[n[c-r.length-4]],await nt(e,i),await ct(e)},lt=async e=>{let t=["> Enhanced Balance Display",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Enhanced Balance Display":await ht(e);break;case"> Back":return}await lt(e)},ut=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));"status"in a||(a.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let r=[`> Show Full Address [${a.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${a.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${a.status.extendedToken?"ON":"OFF"}]`,new j.default.Separator("----------------------------------"),"> Back"];const n=await ea(r);"> Back"!==n&&(n.includes("Full Address")?a.status.fullAddr=await dt():n.includes("Gas Token")?a.status.gasToken=await dt():n.includes("Extended Token")&&(a.status.extendedToken=await dt()),A.writeFileSync(t,JSON.stringify(a,null,2)))},dt=async()=>{switch(await ea(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},pt=(e,t)=>{const a=I.resolve(e,"network.json");let r=JSON.parse(A.readFileSync(a,"utf8")).showTokens;return t in r?r[t]:[]},gt=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r={};for(let e of a.networks)r[e.chainId.toString()]=e.name;const n=I.resolve(e,"assets.json");if(!Sa(n))return void console.log(at.red("No asset here yet"));const s=JSON.parse(A.readFileSync(n,"utf8"));let o=[],i=[],c={};for(let t in s){c[o.length]={name:r[t],address:null},o.push(new j.default.Separator(`----- Networks (${r[t]}) -------`));let a=pt(e,r[t]),n=s[t].length;for(let e=0;e<n;e++){let n=s[t][e];a.includes(n.address)&&i.push(`${e+1}.${n.symbol.padEnd(6)} CA: ${at.green(`${_a(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`),c[o.length]={name:r[t],address:n.address},o.push(`${e+1}.${n.symbol.padEnd(6)} CA: ${at.green(`${_a(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`)}}let l=await ta(o,"Choose Tokens",i),u={};for(let e=0;e<l.length;e++){let t=l[e],a=c[o.indexOf(t)];a.name in u?u[a.name].push(a.address):u[a.name]=[a.address]}a.showTokens=u,A.writeFileSync(t,JSON.stringify(a,null,2))},ht=async e=>{const t=["> Status","> Token List","> Add Token",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Status":await ut(e);break;case"> Token List":await gt(e);break;case"> Add Token":await Ot(e);break;case"> Back":return}await ht(e)},mt=async e=>{let t=["> Networks","> Dataview",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Networks":await ct(e);break;case"> Dataview":await lt(e);break;case"> Back":return}await mt(e)},ft=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8")).networks.map(e=>`> ${e.name}`);return(await ea(a,"Please select a default network")).slice(2)},yt=(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++){const a=r.networks[e];if(a.name===t)return we(a.chainId.toString())}return"unknown"},wt=(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++){const a=r.networks[e];if(a.name===t)return a}return null},vt=(e,t,a)=>{const r=ze(e,t);if("PK"===r.account_type)return r.data[a].ciphertexts.address;let n=r.default_network,s=yt(e,n);return"solana"===s?r.data[a].ciphertexts.solana.address:"evm"===s?r.data[a].ciphertexts.evm.address:null},bt=(e,t)=>ze(e,t).ciphertexts.address,kt=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=o.default_network;const c=yt(e,i);for(let t=0;t<s;t++){const r=n[t],s=yt(e,r.name);if("PK"===o.account_type&&c!==s)continue;let l;l="PK"===o.account_type?o.data[a].ciphertexts.address:"evm"===s?o.data[a].ciphertexts.evm.address:o.data[a].ciphertexts.solana.address,r.name===i?console.log(`● ${l} [${r.name}]`):console.log(`○ ${l} [${r.name}]`)}},St=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=["> Back",new j.default.Separator("----------------------------------")],c=o.default_network,l="";a||(l=o.ciphertexts.address);let u=[];const d=yt(e,c);for(let t=0;t<s;t++){const r=n[t],s=yt(e,r.name);"PK"===o.account_type&&d!==s||(r.name===c?a?i.push(`● ${r.name}`):i.push(`● ${l} [${r.name}]`):a?i.push(`○ ${r.name}`):i.push(`○ ${l} [${r.name}]`),u.push(r.name))}const p=await ea(i);if("> Back"===p)return;let g=i.indexOf(p);if(o.default_network=u[g-2],Ue(e,t,o),!a){let t=o.default_network,a=wt(e,t);console.log(at.green(` Address No: #0\n Network: ${t}\n ${a.nativeCurrency.symbol} Balance: 0`))}},xt=async(e,t,a)=>{const r=wt(t,a),n=r.rpcUrl,s=r.nativeCurrency.decimals;let o;if(o="solana"===we(r.chainId.toString())?await Q(e,n):await X(e,n),o.status){let e=new l.BigNumber(o.output.toString());o.output=e.dividedBy(Math.pow(10,s)).toFixed(4,l.BigNumber.ROUND_FLOOR)}return pe(r.chainId.toString(),[e],["0"]),o},_t=(e,t,a)=>{const r=ze(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},Pt=e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8")).networks,r=a.length;let n=[];for(let e=0;e<r;e++)"evm"===we(a[e].chainId.toString())&&n.push(a[e].name);return n},$t=e=>{const t=I.resolve(e,"network.json");return JSON.parse(A.readFileSync(t,"utf8")).status},At=require("chalk"),Nt=async(e,t)=>{let a=I.join(e,"assets.json");if(!Sa(a))return[];const r=A.readFileSync(a).toString(),n=JSON.parse(r);return t in n?n[t]:[]},It=async(e,t,a)=>{const r=await Nt(e,t);let n=[];for(let e=0;e<r.length;e++)r[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&n.push(r[e]);return n},Ct=async(e,t,a)=>{const r=wt(e,t),n=we(r.chainId.toString()),s=await Nt(e,r.chainId.toString());if(!s)return void console.log(At.red("No asset found"));const o=await Ft(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(At.green(`${i}. ${o[e].symbol} Balance: ${o[e].balance}`)),i+=1);1===i&&console.log(At.red("No asset found"))},Tt=async(e,t,a)=>{const r=wt(e,t);let n=(await Nt(e,r.chainId.toString())).map(e=>e.address);n.push("0"),pe(r.chainId.toString(),[a],n)},jt=async(e,t,a,r,n,s,o)=>{let i=I.join(e,"assets.json"),c={};if(Sa(i)){const e=A.readFileSync(i).toString();c=JSON.parse(e)}void 0===c[t]&&(c[t]=[]);for(let e=0;e<c[t].length;e++)if(c[t][e].address.toLocaleLowerCase()===a.toLocaleLowerCase()||c[t][e].symbol.toLocaleLowerCase()===r.toLocaleLowerCase())return c[t][e]={address:a,symbol:r,name:n,decimals:s,display_decimals:o},void A.writeFileSync(i,JSON.stringify(c,null,4));c[t].push({address:a,symbol:r,name:n,decimals:s,display_decimals:o}),A.writeFileSync(i,JSON.stringify(c,null,4))},Ot=async e=>{const t=I.resolve(e,"network.json");let a=[],r=JSON.parse(A.readFileSync(t,"utf8")).networks;for(let e=0;e<r.length;e++)a.push(`${e+1}. ${r[e].name}`);let n=(await ea(a)).split(".")[1].trim();const s=yt(e,n),o=wt(e,n),i=await Dt("Enter contract address",Yt);let c;if("evm"===s){if(!be(i))return void console.log(At.red("evm address format error"));c=await ee(i,o.rpcUrl)}else{if(!ve(i))return void console.log(At.red("solana address format error"));c=await te(i,o.rpcUrl)}if(!c.status)return void console.log(At.red(c.output));c.output.name||(c.output.name=await Dt("Please input token name")),c.output.symbol||(c.output.symbol=await Dt("Please input token symbol")),console.log(At.green(`Token ${c.output.symbol}(${c.output.name}) loaded successfully.`));let l=await Dt("Enter decimals for display",Gt);l=parseInt(l),await jt(e,o.chainId.toString(),i,c.output.symbol,c.output.name,c.output.decimals,l)},Bt=async(e,t)=>{const a=yt(e,t),r=wt(e,t),n=await Dt("Enter contract address",Yt);let s;if("evm"===a){if(!be(n))return void console.log(At.red("evm address format error"));s=await ee(n,r.rpcUrl)}else{if(!ve(n))return void console.log(At.red("solana address format error"));s=await te(n,r.rpcUrl)}if(!s.status)return void console.log(At.red(s.output));s.output.name||(s.output.name=await Dt("Please input token name")),s.output.symbol||(s.output.symbol=await Dt("Please input token symbol")),console.log(At.green(`Token ${s.output.symbol}(${s.output.name}) loaded successfully.`));let o=await Dt("Enter decimals for display",Gt);o=parseInt(o),await jt(e,r.chainId.toString(),n,s.output.symbol,s.output.name,s.output.decimals,o)},Et=async(e,t,a)=>{const r=["> Show Assets","> Add Asset",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(r)){case"> Show Assets":await Ct(e,a,t);break;case"> Add Asset":await Bt(e,a);break;case"> Back":return}await Et(e,t,a)},Ft=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(ae(e,s.address,a)):"solana"===r&&o.push(re(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(At.red(i[a].output)),null;let o=new l.BigNumber(i[a].output).dividedBy(Math.pow(10,s)).toFixed(4,l.BigNumber.ROUND_FLOOR);c.push({address:r.address,symbol:r.symbol,balance:o}),pe(n,[e],[r.address])}return pe(n,[e],["0"]),c},Lt=async(e,t,a,r,n,s,o)=>{let i=a.length,c=wt(e,n),l="evm"===we(c.chainId.toString());s&&await ue(t,"0",c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"");let u=[];if(o){u=pt(e,n);for(let e=0;e<i;e++){let n=a[e].address;u.includes(n)&&await ue(t,n,c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"")}}return de(c.chainId.toString(),t,a,c,s,u)},qt=require("chalk"),Kt=process.env.HOME||process.env.USERPROFILE,Rt=`${Kt}/.wative`,Dt=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await j.default.prompt(a);return r.trim().toString()},Mt=async e=>{for(let t=0;t<5;t++){let t=await Ut(e,"Input start address or index");if(!t)return console.log(qt.red("Invalid start account index")),null;let a=await Ut(e,"Input end address or index");if(!a)return console.log(qt.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(qt.red("Invalid address range"))}return null},zt=async(e,t,a)=>{let r=I.join(e,`accounts/${t}.json`);if(!A.existsSync(r))return null;let n=JSON.parse(A.readFileSync(r,"utf8")),s=n.data,o=n.account_type,i=s.length;if(0===i)return null;for(let e=0;e<i;e++){if("PK"===o&&s[e].ciphertexts.address.toLocaleLowerCase()===a.toLocaleLowerCase())return e.toString();if("PP"===o&&(s[e].ciphertexts.evm.address.toLocaleLowerCase()===a.toLocaleLowerCase()||s[e].ciphertexts.solana.address.toLocaleLowerCase()===a.toLocaleLowerCase()))return e.toString()}return null},Ut=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 Dt(t,Qt),a=ka(e);if("unknown"===a){if(Number(e)>o){console.log(qt.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},Ht=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"),Jt=e=>!(e.length<6)||"Address length should be greater than 6",Gt=e=>!isNaN(Number(e))||"Value should be a number",Wt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",Vt=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===he.includes(t[e]))return"Passphrase word should be valid";return!0},Zt=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},Xt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},Qt=e=>!1===isNaN(Number(e))||Yt(e),Yt=e=>"unknown"!=ka(e)||"Address should be valid",ea=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 j.default.prompt(r);return n.toString()},ta=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 j.default.prompt(r);return n},aa=()=>{console.log(qt.green(T.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})))},ra=async()=>{let e=await Dt(`Keystore storage located in (default: ${Rt})`);return e||(e=Rt),e=e.trim(),e=e.replace("~",Kt),A.existsSync(e)||A.mkdirSync(e,{recursive:!0}),e},na=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Dt(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},sa=async(e,t,a=!1)=>{for(let r=0;r<5;r++){let r=await Dt(t);try{if(""===r&&a)return null;if("solana"===we(e.toString()))return r;const t=await Z(r);if(!t.status){console.log(qt.red(t.output));continue}if(t.output.toString()===e.toString())return r;console.log(qt.red("Rpc url not match chain id"))}catch(e){console.log(qt.red(e.message))}}return null},oa=async e=>{for(let t=0;t<5;t++){let t=await Dt(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(qt.red("Multicall address length must be 42"))}return null},ia=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Dt(e);if(""===a)return null;if(t.test(a))return a}return null},ca=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Dt(e);if(""===a)return null;if(t.test(a))return a}return null},la=(e,t)=>{const a=Me(e).accounts,r=da(a).indexOf(t);return-1!==r?a[r]:t},ua=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),da=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(ua(e[a]));return t},pa=async(e,t)=>{let a=da(t),r=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Dt(e);t=t.trim();let n=ua(t);if(r.test(n)){if(a.includes(n)){console.log(qt.red("Account name already exists"));continue}return t}}return null},ga=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await j.default.prompt(a);return r.trim().toString()},ha=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await j.default.prompt(t);return a},ma=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 j.default.prompt(a);return r.trim().toString()},fa=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=qt.green("✔"),o=qt.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 j.default.prompt(t);return a},ya=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await j.default.prompt(a);return r},wa=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await j.default.prompt(a);return r.trim().toString()},va=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},ba=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},ka=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",Sa=e=>(e=e.trim(),A.existsSync(e)),xa=e=>new Promise(t=>setTimeout(t,e)),_a=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),Pa=(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,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}},Aa=(e,t)=>{const a=[];for(let r=0;r<e.length;r++){const n=Pa(e[r],t);a.push(n)}return a.concat(a)},Na=(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 g=u.split("(");if(g.length>1){let t=g[1];e[i].name=g[0]+` ${p}`+`(${t}`}else e[i].name=g[0]+` ${p}`}},Ia=async(e,t,a,r,n,s,o,i,c,l)=>{const u=[{type:"list",name:"inputText",message:c||"Choose an option",choices:e,pageSize:30,default:l,loop:!0,filter:e=>e}],d=j.default.prompt(u);let p,g=0,h=0;for(;!d.ui.activePrompt.answers[d.ui.activePrompt.opt.name];){if(i||await xa(1e3),p===d.ui.activePrompt.selected)continue;if(g===d.ui.activePrompt.selected?h+=1:(h=0,g=d.ui.activePrompt.selected),i){h=6,i=!1;const e=d.ui.activePrompt.opt.pageSize,a=Aa(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:r,toIndex:s}=$a(g,e,a.length),o=a.slice(r,s);if(!ge(n.chainId.toString(),o)){h=0;continue}}if(h<5)continue;h=0;const e=d.ui.activePrompt.opt.pageSize,c=Aa(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:l,toIndex:u}=$a(g,e,c.length),m=c.slice(l,u);let f=await Lt(a,m,r,n.rpcUrl,n.name,s,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=n.nativeCurrency.symbol;Na(d.ui.activePrompt.opt.choices.choices,c,f,y,w,s,o,l,u),d.ui.activePrompt.screen.render(""),d.ui.activePrompt.render(),p=g}return d.ui.activePrompt.answers[d.ui.activePrompt.opt.name]},Ca=e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));a.status||(a.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),a.showTokens||(a.showTokens={});let r=a.accounts.length;for(let t=0;t<r;t++){let n=a.accounts[r-1-t],s=ua(n),o=I.resolve(e,`accounts/${s}.json`);A.existsSync(o)||a.accounts.splice(r-1-t,1)}A.writeFileSync(t,JSON.stringify(a,null,4));let n=a.accounts,s=da(n);for(let t=0;t<s.length;t++){let a=I.resolve(e,`accounts/${s[t]}.json`),r=JSON.parse(A.readFileSync(a,"utf8"));"PP"!==r.account_type&&("data"in r||(r.data=[{ciphertexts:r.ciphertexts}],delete r.ciphertexts,A.writeFileSync(a,JSON.stringify(r,null,4))))}};require("wative-core");const Ta=async(e,t)=>{switch(await ea(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await mt(e);break;case"> Accounts":await tt(e,t);break;case"> Tools":await Ee(e,t);break;case"> Exit":return}await Ta(e,t)};class ja{constructor(e,t){this.configDir=e||I.join(require("os").homedir(),".wative/ssh"),this.keystorePath=t||I.join(require("os").homedir(),".wative"),A.existsSync(this.configDir)||A.mkdirSync(this.configDir,{recursive:!0});const a=I.join(this.configDir,"conf.d");A.existsSync(a)||A.mkdirSync(a,{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(e){const t=this.getServiceConfigPath(e);if(!A.existsSync(t))throw new Error(`Service configuration '${e}' not found.`);const a=E.parse(A.readFileSync(t,"utf-8"));return this.parseConfigData(a)}serviceIsExist(e){const t=this.getServiceConfigPath(e);return A.existsSync(I.dirname(t))}listServiceConfigs(){const e=I.join(this.configDir,"conf.d");if(!A.existsSync(e))return[];return A.readdirSync(e).filter(t=>{const a=I.join(e,t);return A.statSync(a).isDirectory()&&A.existsSync(I.join(a,"config.ini"))})}removeServiceConfig(e){const t=this.getServiceConfigPath(e),a=I.dirname(t);A.existsSync(a)&&A.rmSync(a,{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(e){const t=this.generateSecurePassphrase(),a=I.join(this.configDir,"conf.d",e);A.existsSync(a)||A.mkdirSync(a,{recursive:!0});const r=I.join(a,"server_private_key"),n=I.join(a,"server_public_key.pub");return A.existsSync(r)||(console.log(`Generating SSH server key pair for service '${e}'...`),p.execSync(`ssh-keygen -t rsa -b 4096 -f ${r} -N '${t}' -C 'wative_${e}_server'`,{stdio:"inherit"})),{privateKey:r,publicKey:n,passphrase:t}}async generateClientKeyPair(e,t){const a=I.join(this.configDir,"conf.d",e);A.existsSync(a)||A.mkdirSync(a,{recursive:!0});return{privateKey:"",publicKey:I.join(a,`${t}.pub`),passphrase:""}}generateSecurePassphrase(){return F.randomBytes(32).toString("hex")}getServiceConfigPath(e){return I.join(this.configDir,"conf.d",e,"config.ini")}saveServiceConfig(e,t){const a=this.getServiceConfigPath(e),r=I.dirname(a);A.existsSync(r)||A.mkdirSync(r,{recursive:!0});const n=E.stringify(t);A.writeFileSync(a,n)}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=e=>{if(e=e.trim(),!A.existsSync(e))throw new Error("File not exists")};const{WativeCore:Ba}=require("wative-core"),{Connection:Ea,PublicKey:Fa,VersionedTransaction:La,VersionedMessage:qa}=require("@solana/web3.js"),Ka=require("bs58"),{Keypair:Ra,TransactionMessage:Da,ComputeBudgetInstruction:Ma,TransactionInstruction:za,ComputeBudgetProgram:Ua}=require("@solana/web3.js"),{Wallet:Ha}=require("@coral-xyz/anchor");L.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 Ja=L.getLogger("file");Ja.level="info";class Ga{constructor(e,a,r,n,s,o,i,c){if(this._allowedAppIds=[],this._allowedPubKeys=[],this._allowedKeystoreIds=[],this._sessionIdAppIdMap={},Oa(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 a=g.utils.parseKey(t.readFileSync(e));this._allowedPubKeys.push(a)}this.wativeCore=new Ba(o,i,c),this._idRsaPrivatePath=e,this._idRsaPassphrase=a,this._allowedKeystoreIds=s,this._keystoreDirectoryPath=o}listen(e,a){new g.Server({hostKeys:[{key:t.readFileSync(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",()=>{Ja.info("Client disconnected")}).on("error",e=>{Ja.error("err: ",e.message)})}).listen(a,e,function(){Ja.info("Listening on port "+a)})}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);Ja.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)&&"get_keystore_slug_list"!==s)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 Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}}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.message}}}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 Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}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 Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("sign_message"===s)try{let e=n.params;Ja.debug("sign message: ",e),c=await this.signMessage(e.account,e.message)}catch(e){return Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("sign_typed_data"===s)try{let e=n.params;Ja.debug("sign message: ",e),c=await this.signTypedData(e.account,e.domain,e.types_name,e.types,e.message)}catch(e){return Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("get_disabled_slots"===s)try{c=await this.getDisabledSlots(o)}catch(e){return Ja.error("get disabled slots error: ",e.message),{status:!1,msg:e.message}}else if("update_disabled_slots"===s)try{let e=n.params;Ja.debug("update disabled slots: ",e),c=await this.updateDisabledSlots(o,e.disabled_slots)}catch(e){return Ja.error("update disabled slots error: ",e.message),{status:!1,msg:e.message}}else{if("get_keystore_slug_list"!==s)return{status:!1,msg:"message method not find"};try{let e=n.params;c=await this.getKeystoreSlugList(e.appId)}catch(e){return Ja.error("get keystore slug list error: ",e.message),{status:!1,msg:e.message}}}return{status:!0,data:c}}catch(e){return Ja.error("sign error: ",e.message),{status:!1,msg:e.message}}}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=d.timingSafeEqual(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&&d.timingSafeEqual(e,t[r]))return r;return-1}getRootAccount(e,a){const r=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let n,s=t.readFileSync(r);return s=JSON.parse(s.toString()),n="SOLANA"===this.getChainType(a)?s.data[0].ciphertexts.solana.address:s.data[0].ciphertexts.evm.address,[{id:0,address:n,children:s.data.length,type:"M"}]}getChainType(e){return"901"===e||"902"===e||"903"===e?"SOLANA":"EVM"}getSubAccount(e,a,r,n){const s=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let o=t.readFileSync(s);o=JSON.parse(o.toString());let i=o.data.length-1;n&&n<i&&(i=n);let c=0;if(r&&r>0&&(c=r),c>i)return[];let l=this.getChainType(a),u=[];for(let e=c;e<=i;e++)u.push(o.data[e].ciphertexts[l.toLocaleLowerCase()].address);return u}async getDisabledSlots(e){const a=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let r=t.readFileSync(a);return r=JSON.parse(r.toString()),r.disabled_slots||[]}async updateDisabledSlots(e,a){const r=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let n=t.readFileSync(r);return n=JSON.parse(n.toString()),n.disabled_slots=a,t.writeFileSync(r,JSON.stringify(n)),!0}async getKeystoreSlugList(e){console.log("appId: ",e),console.log("allowedAppIds: ",this._allowedAppIds);let a=this._allowedAppIds.indexOf(Buffer.from(e));if(-1===a)throw new Error("appId not find");let r=this._allowedKeystoreIds[a],n=[];for(let e of r){const a=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let r=t.readFileSync(a);r=JSON.parse(r.toString()),n.push({keystore_slug:e,last_account_index:r.data.length-1})}return n}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 m.ethers.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 Ea(r),o=[];if(a)for(let e of a){let t=(await s.getAddressLookupTable(new Fa(e))).value;o.push(t),await Wa(1e3)}let i=qa.deserialize(Uint8Array.from(Buffer.from(t,"hex"))),c=Da.decompile(i);c.instructions.push(Ua.setComputeUnitLimit({units:2e6})),c.instructions.push(Ua.setComputeUnitPrice({microLamports:1e3})),i=c.compileToV0Message(o),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,await Wa(3e3);let l=new La(i),u=this.wativeCore.account.showPrivateKey(e);const d=Ra.fromSecretKey(new Uint8Array(Ka.decode(u))),p=new Ha(d);let g=await s.simulateTransaction(l);if(!g||!g.value||0===g.value.unitsConsumed||g.value.err)return{status:!1,output:g.value.err};let h=c.instructions.length,m=Math.trunc(1.2*g.value.unitsConsumed);if(c.instructions[h-2]=Ua.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[h-1]=Ua.setComputeUnitPrice({microLamports:n}),i=c.compileToV0Message(o),await Wa(1e3),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,l=new La(i),l.feePayer=p.publicKey,await Wa(3e3);let f=await this.wativeCore.account.signTransaction(e,l,r),y=new La(f.output.message,f.output.signatures).message.serialize();return y=Buffer.from(y).toString("hex"),{status:!0,output:{transactionHash:Ka.encode(f.output.signatures[0]),message:y,compute_units:g.value.unitsConsumed.toString()}}}async sendSignedSolanaTransaction(e,t,a,r){let n=[Ka.decode(t)],s=qa.deserialize(Uint8Array.from(Buffer.from(a,"hex"))),o=new La(s,n);return await this.wativeCore.account.sendSignedTransaction(e,o,r)}async getPrioritizationFee(e){let t=new Fa("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4");const a=new Ea(e,"confirmed");let r=await a.getSignaturesForAddress(t,{limit:5});await Wa(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 za({keys:[],programId:new Fa("ComputeBudget111111111111111111111111111111"),data:Buffer.from(Ka.decode(a))}),{microLamports:t}=Ma.decodeSetComputeUnitPrice(e);o+=Number(t);continue}catch(e){}}}return Math.ceil(o/5)}}const Wa=e=>new Promise(t=>setTimeout(t,e));"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Va={exports:{}},Za={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){!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 g(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 h=g(t),m=g(a),f=p(r),y=g(n),w=g(s),v=g(o),b=g(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]}})})},P=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}(),$=function(e){return e=e.trim(),h.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(!$(n))return!1}return!0},N=function(e){return(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim()},I=function(e,t){var a=[],r=m.join(e,"network.json");if(!$(r))throw new Error("network.json not found");for(var n=function(e){for(var t=[],a=0;a<e.length;a++)t.push(N(e[a]));return t}(C(r).accounts),s=0;s<t.length;s++)n.includes(t[s])&&a.push(t[s]);return a},C=function(e){var t=h.readFileSync(e).toString();return JSON.parse(t)},T=function(e,t){var a=JSON.stringify(e);h.writeFileSync(t,a)},j=function(e,t){return b.AES.encrypt(e,t).toString()},O=function(e,t){return b.AES.decrypt(e,t).toString(b.enc.Utf8)},B=["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"],E=new f.default(f.default.givenProvider),F=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(!$(a))return!1;var r,n=C(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 O(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=C(a).pp_ciphertexts,n=O(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=C(a);if("PK"===r.account_type){for(var n=r.data,s=0;s<n.length;s++){var o=n[s].ciphertexts.data,i=O(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(),T(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}}var l=O(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=O(d[s].ciphertexts.evm.data,this.account_passwords[e]);d[s].ciphertexts.evm.data=j(p,t);var g=O(d[s].ciphertexts.solana.data,this.account_passwords[e]);d[s].ciphertexts.solana.data=j(g,t)}return T(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 P(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 P(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 E.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=I(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(h.existsSync(r)){var n=JSON.parse(h.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=E.utils.toChecksumAddress(e)),e},e.prototype.getAccountAddressByPrivateKey=function(e,t){return"evm"===this.getNetworkTypeByChainId(t)?E.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(!B.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:E.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=h.readFileSync(r,"utf8");t.push(n)}return b.MD5(JSON.stringify(t)).toString()},e}(),L=Za,q=function(){function e(e,t,a,r){this.account=new F(e,t,a,r)}return e.version=L.version,e}();e.WativeCore=q,Object.defineProperty(e,"__esModule",{value:!0})}(t,N.default,C.default,O.default,q.default,K.default,R.default,B.default,D.default,M.default,z.default,U.default)}(0,Va.exports);class Xa{constructor(e,t){this.runningServices=new Map,this.configManager=new ja(e,t),this.pidDir=I.join(this.configManager.getKeystorePath(),"ssh","pids"),this.ensurePidDir(),this.setupLogger()}ensurePidDir(){A.existsSync(this.pidDir)||A.mkdirSync(this.pidDir,{recursive:!0})}async isPortInUse(e,t="127.0.0.1"){return new Promise(a=>{const r=H.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 I.join(this.pidDir,`${e}.pid`)}writePidFile(e,t){const a=this.getPidFilePath(e);A.writeFileSync(a,t.toString())}readPidFile(e){const t=this.getPidFilePath(e);if(!A.existsSync(t))return null;try{const e=A.readFileSync(t,"utf8").trim();return parseInt(e,10)}catch(e){return null}}removePidFile(e){const t=this.getPidFilePath(e);A.existsSync(t)&&A.unlinkSync(t)}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(e){const t=this.runningServices.get(e),a=this.readPidFile(e),r=I.join(this.pidDir,`${e}-daemon.pid`),n=I.join(this.pidDir,`${e}-watcher.pid`);let s=null,o=null;if(A.existsSync(r)){const e=A.readFileSync(r,"utf8").trim();e&&(s=parseInt(e))}if(A.existsSync(n)){const e=A.readFileSync(n,"utf8").trim();e&&(o=parseInt(e))}if(t)t.server&&t.server.close&&t.server.close(),this.runningServices.delete(e);else if(o&&this.isProcessRunning(o))try{process.kill(o,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(o)&&process.kill(o,"SIGKILL");try{A.existsSync(n)&&A.unlinkSync(n),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}},5e3)}catch(e){if(s&&this.isProcessRunning(s))try{process.kill(s,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(s)&&process.kill(s,"SIGKILL")},5e3)}catch(e){}try{A.existsSync(n)&&A.unlinkSync(n),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}}else if(s&&this.isProcessRunning(s))try{process.kill(s,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(s)&&process.kill(s,"SIGKILL")},5e3),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}else{if(!a||!this.isProcessRunning(a))throw new Error(`Service '${e}' is not running.`);try{process.kill(a,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(a)&&process.kill(a,"SIGKILL")},5e3)}catch(e){}}this.removePidFile(e),this.logger.info(`SSH service '${e}' 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(e){if(this.runningServices.has(e))return"running";try{this.configManager.loadServiceConfig(e);const t=I.join(this.pidDir,`${e}-daemon.pid`);if(A.existsSync(t)){const e=A.readFileSync(t,"utf8").trim();if(e){const a=parseInt(e);if(this.isProcessRunning(a))return"running";A.unlinkSync(t)}}const a=this.readPidFile(e);return a&&this.isProcessRunning(a)?"running":(a&&this.removePidFile(e),"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 ha(`Enter password for keystore [${a}]`);try{const o=this.configManager.getKeystorePath();if(r=new Va.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 Ga(e.server_keys.private_key_path,e.server_keys.passphrase,n,s,o,e.keystore.path,i,c)}async showLogs(e,t=50,a=!1){const r=process.env.HOME+"/.wative/logs";let n;if(n=e?I.join(r,`${e}.log`):I.join(r,"service_manager.log"),!A.existsSync(n))throw new Error(`Log file not found: ${n}`);const s=a?["-f",`-n${t}`,n]:[`-n${t}`,n],o=p.spawn("tail",s,{stdio:["ignore","inherit","inherit"]});return a?(process.on("SIGINT",()=>{o.kill("SIGTERM"),process.exit(0)}),new Promise((e,t)=>{o.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})):new Promise((e,t)=>{o.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})}setupLogger(){const e=process.env.HOME+"/.wative/logs";A.existsSync(e)||A.mkdirSync(e,{recursive:!0}),L.configure({appenders:{file:{type:"file",filename:I.join(e,"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=L.getLogger("service_manager"),this.logger.level="info"}setupServiceLogger(e){const t=process.env.HOME+"/.wative/logs";A.existsSync(t)||A.mkdirSync(t,{recursive:!0});const a=I.join(t,`${e}.log`);this.cleanupOldLogs(t),L.configure({appenders:{file:{type:"file",filename:I.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"},[`${e}_file`]:{type:"file",filename:a,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"},[e]:{appenders:[`${e}_file`],level:"info"}}})}cleanupOldLogs(e){try{const t=A.readdirSync(e),a=new Date;a.setDate(a.getDate()-3),t.forEach(t=>{const r=I.join(e,t);A.statSync(r).mtime<a&&t.endsWith(".log")&&(A.unlinkSync(r),this.logger.info(`Deleted old log file: ${t}`))})}catch(e){this.logger.warn(`Failed to cleanup old logs: ${e}`)}}}class Qa{constructor(e){this.config=e}async executeCommand(e){return this.config.useRemoteServer?this.executeCommandThroughRemoteServer(e):new Promise((a,r)=>{const n=new g.Client;n.on("ready",()=>{n.exec(e,(e,t)=>{if(e)return n.end(),r(e);let s="",o="";t.on("close",(e,t)=>{n.end(),0===e?a(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:t.readFileSync(s.privateKeyPath),passphrase:s.passphrase};n.connect(o)})}async executeCommandThroughRemoteServer(e){return new Promise((a,r)=>{const n=new g.Client;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 g.Client;i.on("ready",()=>{i.exec(e,(e,t)=>{if(e)return i.end(),n.end(),r(e);let s="",o="";t.on("close",(e,t)=>{i.end(),n.end(),0===e?a(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:t.readFileSync(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:t.readFileSync(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 Ya=async e=>{const t=new Xa;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)}},er=process.argv.slice(2),tr=er.includes("--daemon"),ar=er.indexOf("--config"),rr=-1!==ar&&er[ar+1]?er[ar+1]:void 0;(tr||rr)&&Ya(rr).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 nr=Object.freeze({__proto__:null,mainWithConfig:Ya,WativeSSHClient:Qa,createWativeSSHClient:function(e){return new Qa(e)},WativeWielderServer:Ga,SSHConfigManager:ja,checkFileExistence:Oa,sleep:function(e=0){return new Promise((t,a)=>{setTimeout(()=>{t(!0)},e)})},getAndGenerateConfig:async e=>{const t="/etc/wative";A.existsSync(t)||A.mkdirSync(t),await(async()=>{const e="/etc/wative",t=I.join(e,"id_rsa_server.pub"),a=I.join(e,"id_rsa_server");A.existsSync(t)&&A.existsSync(a)||(console.log("Generating SSH key pair..."),p.execSync(`ssh-keygen -t rsa -f ${a} -N 'wative_server'`,{stdio:"inherit"}));const r=I.join(e,"id_rsa_detake.pub"),n=I.join(e,"id_rsa_detake");A.existsSync(r)&&A.existsSync(n)||(console.log("Generating SSH key pair..."),p.execSync(`ssh-keygen -t rsa -f ${n} -N 'wative_detake'`,{stdio:"inherit"}))})();const a=I.join(t,"config.ini");if(!A.existsSync(a)){const t=Me(e).accounts,r={keystore:{path:e,allowed_keystores:da(t)},ssh:{listen:"127.0.0.1",port:5678,log:{size:10485760,backups:3}}};let n=E.stringify(r);A.writeFileSync(a,n)}return E.parse(A.readFileSync(a,"utf-8"))}});const sr=new _.Command,or=require("../package.json");let ir;sr.version(or.version).description("Wative CLI Tool"),sr.command("version").description("Show the version of wative").action(()=>{console.log(`Wative CLI Tool v${or.version}`)});const cr=()=>{if(!ir){const e=I.join(process.env.HOME||"",".wative","ssh");ir=new Xa(e)}return ir},lr=sr.command("ssh").description("Manage SSH services");lr.command("start").description("Start SSH service").option("-c, --config <name>","Specify service configuration name").option("-d, --daemon","Run service in daemon mode").action(async e=>{const t=cr();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1));const a=e.config,r=t.getServiceConfig(a),n=require("net"),s=async(e,t="127.0.0.1")=>new Promise(a=>{const r=n.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 s(r.ssh.port,r.ssh.listen)){const e=`Port ${r.ssh.port} on ${r.ssh.listen} is already in use. Cannot start SSH service '${a}'.`;console.error(`Error: ${e}`),process.exit(1)}if(console.log(`Port ${r.ssh.port} on ${r.ssh.listen} is available for service '${a}'`),e.daemon){console.log(`Starting SSH service '${a}' in daemon mode...`);const e=await t.promptForPasswords(r.keystore.allowed_keystores),n=require("crypto"),s=n.randomBytes(32),o=n.randomBytes(16),i=n.createCipheriv("aes-256-cbc",s,o);let c=i.update(JSON.stringify(e),"utf8","hex");c+=i.final("hex");const l=o.toString("hex")+":"+s.toString("hex")+":"+c;return void((e,t)=>{const a=I.join(process.env.HOME||"",".wative","logs"),r=I.join(process.env.HOME||"",".wative","ssh","pids");A.existsSync(a)||A.mkdirSync(a,{recursive:!0}),A.existsSync(r)||A.mkdirSync(r,{recursive:!0});const n=I.join(a,`${e}-daemon.log`),s=I.join(r,`${e}-daemon.pid`),o=I.join(r,`${e}-watcher.pid`),i=p.spawn("node",[I.resolve(__dirname,"daemon-watcher.js"),e,n,s,o,I.resolve(__dirname,"..")],{detached:!0,stdio:"ignore",env:{...process.env,WATIVE_ENCRYPTED_PASSWORDS:t}});A.writeFileSync(o,i.pid.toString()),i.unref(),console.log(`SSH service '${e}' daemon watcher started with PID: ${i.pid}`),console.log(`Daemon log file: ${n}`),console.log(`Watcher PID file: ${o}`)})(a,l)}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 r=t.split(":"),n=Buffer.from(r[0],"hex"),s=Buffer.from(r[1],"hex"),o=r[2],i=e.createDecipheriv("aes-256-cbc",s,n);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 '${a}'...`);const u=cr();await u.startService(a,l);for(const e in l)l[e]=null,delete l[e];console.log(`[${(new Date).toISOString()}] SSH service '${a}' started successfully`);const d=async e=>{console.log(`[${(new Date).toISOString()}] Worker received ${e}, stopping service...`);try{await u.stopService(a),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(a);"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),g=setInterval(()=>{},6e4),h=()=>{clearInterval(p),clearInterval(g)};process.on("exit",h)}catch(e){console.error(`[${(new Date).toISOString()}] Worker process error:`,e),process.exit(1)}return}{await t.startService(a),console.log(`SSH service '${a}' started successfully`),process.on("SIGINT",async()=>{console.log("\nReceived SIGINT, stopping services..."),await t.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nReceived SIGTERM, stopping services..."),await t.stopAllServices(),process.exit(0)});const e=setInterval(()=>{"running"!==t.getServiceStatus(a)&&(console.log(`Service ${a} 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)}}),lr.command("stop").description("Stop SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=cr();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)}}),lr.command("restart").description("Restart SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=cr();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)}}),lr.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 ja(r,o);let c,l,u,d;for(;;)if(c=await n("Enter service name: "),c=ua(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=ua(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 g=a.join(p,`${d}.pub`);for(console.log("\nPlease place the remote client's public key file at the following path:"),console.log(`${g}`),console.log("\nPress Enter to continue after placing the file...");;){if(await n(""),t.existsSync(g)){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 h=await n("Enter service description (optional): ");console.log("\nCreating SSH service configuration...");const m=await i.createServiceConfig(c,l,u,d,h||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: ${g}`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}finally{r.close()}}),lr.command("remove").description("Remove SSH service configuration").option("-c, --config <name>","Service configuration name").action(async e=>{const t=cr();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)}}),lr.command("list").description("List all SSH service configurations").action(async()=>{const e=new ja,t=new Xa,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.")}),lr.command("status").description("Show SSH service status").option("-c, --config <name>","Service configuration name").action(async e=>{const t=cr();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)}}),lr.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=cr();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)}}),sr.command("cmd").description("Start wallet-cli shell").action(async()=>{try{p.execSync("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")))&&sr.parse(process.argv);const{WativeCore:ur}=require("wative-core"),dr=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:",dr.version),aa();const e=await ra();await rt(e),Ca(e);const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=da(a.accounts);const n=new ur(e,r,null,!0);await Ta(e,n)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)}),e.DEFAULT_NETWORK=me,e.GasUtil=Ae,e.MNEMONIC_WORDS=he,e.SOLANA_CHAIN_IDS=fe,e.SSH=nr,e.accountBalanceLog=async(e,t,a,r)=>{let n;n="PK"===ze(a,e).account_type?vt(a,e,t):bt(a,e);const s=await xt(n,a,r);s.status,console.log(at.green(` Address No: #${t}\n Network: ${r}\n ${s.output}`))},e.accountIndexOrAddressValidator=Qt,e.accountSetting=tt,e.addAsset=Bt,e.addNetwork=it,e.addToken=Ot,e.addrValidator=Jt,e.batchGetKeystoreSlugByAccountName=da,e.batchGetTokenBalance=Ft,e.batchGetTokenBalanceViaMulticall=le,e.batchHasTokenBalance=ge,e.chainAddressValidator=Yt,e.checkFileExistence=Sa,e.chunkArray=(e,t)=>{let a=[];for(let r=0;r<e.length;r+=t)a.push(e.slice(r,r+t));return a},e.confirmSomething=ya,e.createNetwork=rt,e.deleteTokenBalance=pe,e.editorSomething=wa,e.enhancedBalanceDisplay=ht,e.excutePromiseFunction=ba,e.expandAmountValidator=Zt,e.formatAddr=_a,e.gasValidator=Wt,e.getAccountAddress=vt,e.getAccountBalance=xt,e.getAccountBalanceInEvm=X,e.getAccountBalanceInSolana=Q,e.getAccountChainType=ka,e.getAccountIndex=Ut,e.getAccountIndexByKeystoreSlug=zt,e.getAccountInfo=ze,e.getAccountInfoInSolana=ce,e.getAccountName=pa,e.getAccountNameByKeystoreSlug=la,e.getAccountRange=Mt,e.getAssetList=Nt,e.getAssetListByTokenName=It,e.getBatchAccountBalance=Lt,e.getChainId=na,e.getChainIdByEvm=Z,e.getChainType=we,e.getCodeInEvm=ne,e.getColor=ca,e.getDefaultNetworkByAddress=_t,e.getEvmNetworks=Pt,e.getKeystorePath=ra,e.getKeystoreSlugByAccountName=ua,e.getLatestBlockhash=ie,e.getMulticallAddress=oa,e.getNativeTokenDecimals=ye,e.getNetworkInfo=Me,e.getNetworkInfoByName=wt,e.getNetworkTypeByName=yt,e.getPKAccountAddress=bt,e.getPrioritizationFee=oe,e.getRpcUrl=sa,e.getShowTokenList=pt,e.getStatus=$t,e.getSymbol=ia,e.getTokenBalance=de,e.getTokenBalanceInEvm=ae,e.getTokenBalanceInSolana=re,e.getTokenInfoInEvm=ee,e.getTokenInfoInSolana=te,e.getTokenProgramId=Y,e.getTransferTokenData=se,e.hexValidator=va,e.importMaskedPassphrase=ma,e.inputMaskedPassword=ga,e.inputPassword=fa,e.inputPasswordWithoutValidator=ha,e.inputSomething=Dt,e.isEvmAddress=be,e.isSolanaAddress=ve,e.lastAccountNoValidator=Xt,e.listWithLazyBalanceLoading=Ia,e.loginIn=He,e.numberValidator=Gt,e.passphraseValidator=Vt,e.program=sr,e.removeNetwork=ot,e.saveAccountInfo=Ue,e.saveAsset=jt,e.selectCheckboxSomething=ta,e.selectDefaultNetwork=ft,e.selectFlag=dt,e.selectOrEditNetwork=nt,e.selectSomething=ea,e.selectToolsOptions=Be,e.sendSolanaRawTransaction=Ce,e.showAllAccounts=kt,e.showAssets=Et,e.showAssetsDetail=Ct,e.showAvailableNetworks=ct,e.showDataview=lt,e.showIntroduction=aa,e.showNetwork=mt,e.showTokenList=gt,e.showTools=Ee,e.sleep=xa,e.switchNetworkByAccountName=St,e.switchPPNetwork=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=["> Back",new j.default.Separator("----------------------------------")],c=o.data[a].default_network;c&&""!==c?i.push("○ Same as the account setting"):i.push("● Same as the account setting");for(let e=0;e<s;e++){const t=n[e];let r;r=we(t.chainId.toString())?o.data[a].ciphertexts.solana.address:o.data[a].ciphertexts.evm.address,t.name===c?i.push(`● ${r} [${t.name}]`):i.push(`○ ${r} [${t.name}]`)}const l=await ea(i);if("> Back"===l)return;let u=i.indexOf(l);2===u?delete o.data[a].default_network:o.data[a].default_network=n[u-3].name,Ue(e,t,o);let d=o.default_network;"default_network"in o.data[a]&&""!==o.data[a].default_network&&(d=o.data[a].default_network);let p=wt(e,d);console.log(at.green(` Address No: #${a}\n Network: ${d}\n ${p.nativeCurrency.symbol} Balance: 0`))},e.tagValidator=Ht,e.updateBalance=ue,e.updateNetwork=st,e.updateStatus=ut,e.updateStorage=Ca,e.updateTokenBalanceOption=Tt,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs"),require("path"),require("figlet"),require("inquirer"),require("web3"),require("@solana/web3.js"),require("@solana/spl-token"),require("@metaplex-foundation/js"),require("bignumber.js"),require("ini"),require("crypto"),require("child_process"),require("ssh2"),require("log4js"),require("ethers"),require("tweetnacl"),require("bs58"),require("bip39"),require("@coral-xyz/anchor"),require("crypto-js"),require("ethereumjs-wallet"),require("micro-ed25519-hdkey"),require("net"),require("commander")):"function"==typeof define&&define.amd?define(["exports","fs","path","figlet","inquirer","web3","@solana/web3.js","@solana/spl-token","@metaplex-foundation/js","bignumber.js","ini","crypto","child_process","ssh2","log4js","ethers","tweetnacl","bs58","bip39","@coral-xyz/anchor","crypto-js","ethereumjs-wallet","micro-ed25519-hdkey","net","commander"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).demo={},e.fs,e.path,e.figlet,e.inquirer,e.Web3,e.require$$6,e.splToken,e.js,e.bignumber_js,e.ini,e.crypto,e.child_process,e.ssh2,e.log4js,e.ethers,e.require$$3,e.require$$4,e.require$$5,e.require$$7,e.require$$8,e.require$$9,e.require$$10,e.net,e.commander)}(this,function(e,t,a,r,n,s,o,i,c,l,u,d,p,g,h,m,f,y,w,v,b,k,S,x,_){"use strict";function P(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function $(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 A=$(t),N=P(t),I=$(a),C=P(a),T=$(r),j=P(n),O=P(s),B=P(o),E=$(u),F=$(d),L=$(h),q=P(f),K=P(y),R=P(w),D=P(v),M=P(b),z=P(k),U=P(S),J=$(x);const H=console.error;console.error=(...e)=>{((new Error).stack||"").toLowerCase().includes("@solana/web3.js")||H.apply(console,e)};const G={},W=[{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"}],V=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],Z=async e=>{let t=new O.default(e);return await ba(t.eth.getChainId,[])},X=async(e,t)=>{const a=new O.default(t);return await ba(a.eth.getBalance,[e])},Q=async(e,t)=>{const a=new o.Connection(t);return await ba(a.getBalance.bind(a),[new o.PublicKey(e)])},Y=async(e,t)=>{const a=new o.Connection(t),r=new o.PublicKey(e);let n=await ba(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()}},ee=async(e,t)=>{const a=new(new O.default(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 ba(a.methods.symbol().call.bind(a),[]),n=await ba(a.methods.name().call.bind(a),[]),s=await ba(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"}},te=async(e,t)=>{let a=await Y(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const r=a.output,n=new o.Connection(t),s=c.Metaplex.make(n),l=new o.PublicKey(e);let u=await ba(i.getMint,[n,l,"finalized",new o.PublicKey(r)]),d={status:!0,output:{symbol:"",name:"",decimals:""}};if(!u.status)return{status:!1,output:"Failed to get token decimals"};d.output.decimals=u.output.decimals;try{const e=s.nfts().pdas().metadata({mint:l});if(await n.getAccountInfo(e)){const e=await s.nfts().findByMint({mintAddress:l});d.output.name=e.name,d.output.symbol=e.symbol}else try{const e=await i.getTokenMetadata(n,l);e&&(e.name&&(d.output.name=e.name),e.symbol&&(d.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return d},ae=async(e,t,a)=>{const r=new(new O.default(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 ba(r.methods.balanceOf(e).call.bind(r),[]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get token balance"}},re=async(e,t,a)=>{let r=await Y(t,a);if(!r.status)return{status:!1,output:"Failed to get token program id"};const n=r.output,s=new o.Connection(a),c=i.getAssociatedTokenAddressSync(new o.PublicKey(t),new o.PublicKey(e),!1,new o.PublicKey(n));let l=await ba(s.getTokenAccountBalance.bind(s),[c]);return l.status?{status:!0,output:l.output.value.amount}:l.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},ne=async(e,t)=>{const a=new O.default(t);let r=await ba(a.eth.getCode.bind(a),[e]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get code"}},se=async(e,t,a)=>new O.default(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]),oe=async e=>{const t=new o.Connection(e);let a=await ba(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}},ie=async e=>{const t=new o.Connection(e);let a=await ba(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}},ce=async(e,t)=>{const a=new o.Connection(t);let r=await ba(a.getAccountInfo.bind(a),[new o.PublicKey(e.toString())]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get account info"}},le=async(e,t,a,r)=>{let n=[];try{let s=[];const o=new O.default(a),i=new o.eth.Contract(W,r);for(const a of e)if("0"===t){const e=i.methods.getEthBalance(a).encodeABI();s.push({target:r,callData:e})}else{const e=new o.eth.Contract(V,t).methods.balanceOf(a).encodeABI();s.push({target:t,callData:e})}const{returnData:c}=await i.methods.aggregate(s).call();for(let e=0;e<c.length;e++){const t=o.eth.abi.decodeParameter("uint256",c[e]);n.push(t)}}catch(e){console.log("Multicall aggregate failed")}return n},ue=async(e,t,a,r,n,s)=>{let o;if(e=e.filter(e=>e&&e.length>30),a in G?o=G[a][t]||{}:(G[a]={},o={}),s&&s.length>0&&n){let a=await le(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 X(a,r):await Q(a,r):n?await ae(a,t,r):await re(a,t,r),e.status&&(o[a]=e.output),await xa(1e3)}return G[a][t]=o,G},de=(e,t,a,r,n,s)=>{let o={};if(!(e in G))return o;n&&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||s.includes(r.address))&&((n||"0"!==r.address)&&G[e][r.address])){if(i in G[e][r.address]){c=new l.BigNumber(G[e][r.address][i]).dividedBy(10**r.decimals).toFixed(r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:4,l.BigNumber.ROUND_FLOOR)}o[i]||(o[i]={}),o[i][r.symbol]=c}}}return o},pe=(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 G[e][r][n]}catch(e){}}}},ge=(e,t)=>{let a=0;if(e in G&&"0"in G[e])for(let r=0;r<t.length;r++)t[r]in G[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},he=["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"],me=[{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}}],fe=["901","902","903"],ye=e=>fe.includes(e)?9:18,we=e=>fe.includes(e)?"solana":"evm",ve=e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e),be=e=>e.startsWith("0x")&&42===e.length,{BN:ke}=require("bn.js"),{stripHexPrefix:Se}=require("ethereumjs-util"),{BigNumber:xe}=require("bignumber.js");function _e(e){return new ke(Se(e.toString("hex")),16)}const Pe=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function $e(e){return Pe(e.toString(16))}class Ae{constructor(e){this.query=new O.default(O.default.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,r=$e(function(e,t,a){const r=new ke(t),n=new ke(a);return e.mul(r).div(n)}(_e(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 xe(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const r=_e(e),n=_e(t).muln(.9),s=r.muln(a);return r.gt(n)?$e(r):s.lt(n)?$e(s):$e(n)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:r,simulationFails:n}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(Pe(r),a,t),simulationFails:n}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const Ne=require("chalk");require("wative-core");const Ie=async e=>{let t=[new j.default.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 j.default.Separator("——————————————-"),"Send it now","Back"],a=await ea(t),r=t.indexOf(a);return 1===r&&(e.from=await Dt("from",Yt)),2===r&&(e.to=await Dt("to",Yt)),3===r&&(e.nonce=await Dt("nonce")),4===r&&(e.gasPrice=await Dt("gasPrice")),5===r&&(e.data=await wa("data")),6===r&&(e.value=await Dt("value")),7===r&&(e.gas=await Dt("gas")),9===r?e:10===r?null:await Ie(e)},Ce=async(e,t,a,r,n)=>{const s=await Dt("to",Yt);let i=(new o.Transaction).add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(r),toPubkey:new o.PublicKey(s),lamports:1e6}));i.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),i.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),i.feePayer=new o.PublicKey(r);let c=await ie(t);if(!c.status)return void console.log(Ne.red(c.output));i.recentBlockhash=c.output.blockhash;const u=await n.account.simulateTransaction(r,t,i);if(!u.status)return void console.log(Ne.red(u.output));if(!u.output||!u.output.value||0===u.output.value.unitsConsumed||u.output.value.err)return console.log(Ne.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(u.output,null,4)),void console.log("==============================================");let d=new l.BigNumber(u.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,l.BigNumber.ROUND_CEIL),p=new l.BigNumber(d);const g=await oe(t);if(!g.status)return void console.log(Ne.red(g.output));const h=new l.BigNumber(g.output.toString()),m=p.multipliedBy(h).dividedBy(1e6).toFixed(0,l.BigNumber.ROUND_CEIL),f=await Q(r,t);if(!f.status)return void console.log(Ne.red(f.output));const y=new l.BigNumber(f.output).minus(5e3).minus(m);let w=new l.BigNumber(y).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(w)<new l.BigNumber(0))return void console.log(Ne.red("Not enough balance"));let v=await Te(w,y.toString(),a,9),b=new o.Transaction;b.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(p)})),b.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(h)})),b.add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(r),toPubkey:new o.PublicKey(s),lamports:Number(v)})),b.feePayer=new o.PublicKey(r),b.recentBlockhash=c.output.blockhash;const k=await n.account.signTransaction(r,b,t);if(!k.status)return void console.log(Ne.red(k.output));let S=await n.account.sendSignedTransaction(r,k.output,t);S.status?(pe(e,[r,s],["0"]),console.log(Ne.green(`Transaction hash: ${S.output}`))):console.log(Ne.red(S.output))},Te=async(e,t,a,r)=>{let n=["> Input value",`> Total Balance (${e} ${a})`],s=await ea(n),o=n.indexOf(s),i="0";if(0===o){let e=await Dt("value",Gt);i=new l.BigNumber(e).multipliedBy(10**r).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===o&&(i=t);return new l.BigNumber(i).isLessThanOrEqualTo(new l.BigNumber(t))?i:(console.log(Ne.red("Not enough balance")),Te(e,t,a,r))},je=async(e,t,a)=>{let r=["> Input amount",`> Total Balance (${new l.BigNumber(e).dividedBy(10**a).toFixed(4,l.BigNumber.ROUND_FLOOR)} ${t})`],n=await ea(r),s=r.indexOf(n),o="0";if(0===s){let e=await Dt("amount",Gt);o=new l.BigNumber(e).multipliedBy(10**a).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===s&&(o=e);return new l.BigNumber(o).isLessThanOrEqualTo(new l.BigNumber(e))?o:(console.log(Ne.red("Not enough balance")),je(e,t,a))},Oe=async(e,t,a,r)=>{let n=_t(e,t,a),s=yt(e,n),c=ka(a);if(s!==c&&("evm"===c&&(n="Ethereum Mainnet"),"solana"===c&&(n="Solana Mainnet"),s=yt(e,n)),"evm"===s){if(await ya(`Network (${n}), want a change?`,!1)){const t=Pt(e);n=await ea(t,"Select a network")}}let u=await xt(a,e,n);if(!u.status)return void console.log(Ne.red(u.output));const d=wt(e,n);console.log(Ne.green(` ${d.nativeCurrency.symbol} Balance: ${u.output}`));const p=["> Send Raw Tx","> Send Token",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(p)){case"> Send Raw Tx":"evm"===c&&await(async(e,t,a,r,n)=>{const s=await Dt("to",Yt),o=new Ae(t),i=await o.getGasPrice(),c=new l.BigNumber(i.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);let u=await Dt(`Gas price (${c}), agree or enter`,Wt)||c;u=new l.BigNumber(u).multipliedBy(1e9).toFixed(0);let d,p=await ne(s,t);if(!p.status)return void console.log(Ne.red(p.output));d="42161"===e||"421614"===e?"1700000":"21000";let g,h,m=new l.BigNumber(0);if("8453"===e&&(m=new l.BigNumber(1e-5).multipliedBy(1e18)),"0x"===p.output){g="0x";let e=await X(r,t);if(!e.status)return void console.log(Ne.red(e.output));let n=new l.BigNumber(e.output),s=new l.BigNumber(u),o=n.minus(s.multipliedBy(Number(d))).minus(m).toFixed(0,l.BigNumber.ROUND_FLOOR),i=new l.BigNumber(o).dividedBy(1e18).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(i)<new l.BigNumber(0))return void console.log(Ne.red("Not enough balance"));h=await Te(i,o,a,18)}else g=await wa("data",va),h=await Dt("value",Gt);const f=await o.getTransactionCount(r),y=await Dt(`Nonce (${f}), agree or enter`);let w={from:r,to:s,nonce:y||f.toString(),gasPrice:u,data:g,value:h};if("0x"===g)w.gas=d;else{let e=w.gasPrice;delete w.gasPrice;try{w.gas=(await o.estimateTxGas(w)).toString()}catch(e){return void console.log(Ne.red("Error: "+e))}w.gasPrice=e}if(w=await Ie(w),!w)return;const v=await n.account.signTransaction(r,w,t);v.status?(console.log(Ne.green(`Transaction hash: ${v.output.transactionHash}`)),n.account.sendSignedTransaction(r,v.output.rawTransaction,t),pe(e,[r,s],["0"])):console.log(Ne.red(v.output))})(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,r),"solana"===c&&await Ce(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===c&&await(async(e,t,a,r,n)=>{let s,o,i;switch(await ea(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Dt("token ticker");let n=await It(e,a,i);if(0===n.length)return void console.log(Ne.red("Token not found"));let c=[];for(let e=0;e<n.length;e++){const a=await ae(r,n[e].address,t);if(!a.status)return void console.log(Ne.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,l.BigNumber.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 u=await ea(c);const d=n[c.indexOf(u)];s=d.address,o=Number(d.decimals);break;case"> Input token contract address":s=await Dt("token contract address",Yt);let p=await ee(s,t);if(!p.status)return void console.log(Ne.red(p.output));o=Number(p.output.decimals),i=p.output.name}const c=await Dt("Receipt",Yt),u=await ae(r,s,t);if(!u.status)return void console.log(Ne.red(u.output));const d=new Ae(t),p=await d.getGasPrice(),g=new l.BigNumber(p.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);let h=await Dt(`Gas price (${g}), agree or enter`,Wt)||g;h=new l.BigNumber(h).multipliedBy(1e9).toFixed(0);let m=await je(u.output,i,o);const f=await se(c,m,t),y=await d.getTransactionCount(r),w=await Dt(`Nonce (${y}), agree or enter`);let v={from:r,to:s,nonce:w||y.toString(),gasPrice:h,data:f,value:"0"};if("0x"===f)v.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=v.gasPrice;delete v.gasPrice;try{v.gas=(await d.estimateTxGas(v)).toString()}catch(e){return void console.log(Ne.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await Ie(v),!v)return;const b=await n.account.signTransaction(r,v,t);b.status?(console.log(Ne.green(`Transaction hash: ${b.output.transactionHash}`)),n.account.sendSignedTransaction(r,b.output.rawTransaction,t),pe(a,[r,c],["0",s])):console.log(Ne.red(b.output))})(e,d.rpcUrl,d.chainId.toString(),a,r),"solana"===c&&await(async(e,t,a,r,n)=>{let s,c,u;switch(await ea(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Dt("token ticker");let n=await It(e,a,u);if(0===n.length)return void console.log(Ne.red("Token not found"));let o=[];for(let e=0;e<n.length;e++){const a=await re(r,n[e].address,t);if(!a.status)return void console.log(Ne.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(n[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===n.length){o.push(`> 1. ${u} Balance: ${s}`);break}o.push(`> ${e+1}. ${u} Balance: ${s}(${n[e].address})`),o.push(n[e].address)}let i=await ea(o);const d=n[o.indexOf(i)];s=d.address,c=Number(d.decimals);break;case"> Input token contract address":s=await Dt("token contract address",Yt);let p=await te(s,t);if(!p.status)return void console.log(Ne.red(p.output));c=Number(p.output.decimals),u=p.output.name}const d=await Dt("Receipt",Yt),p=await re(r,s,t);if(!p.status)return void console.log(Ne.red(p.output));let g=await je(p.output,u,c),h=await Y(s,t);if(!h.status)return void console.log(Ne.red(h.output));const m=new o.PublicKey(h.output);let f=i.getAssociatedTokenAddressSync(new o.PublicKey(s),new o.PublicKey(r),!0,m);const y=await ce(f.toString(),t);if(!y.status)return void console.log(Ne.red(y.output));if(!y.output||y.output.owner.toString()===o.PublicKey.default)return void console.log(Ne.red("From token account not found"));let w=i.getAssociatedTokenAddressSync(new o.PublicKey(s),new o.PublicKey(d),!1,m);const v=await ce(w.toString(),t);if(!v.status)return void console.log(Ne.red(v.output));let b=new o.Transaction,k=new o.Transaction;v.output&&v.output.owner.toString()!==o.PublicKey.default||(b.add(i.createAssociatedTokenAccountInstruction(new o.PublicKey(r),new o.PublicKey(w),new o.PublicKey(d),new o.PublicKey(s),m)),k.add(i.createAssociatedTokenAccountInstruction(new o.PublicKey(r),new o.PublicKey(w),new o.PublicKey(d),new o.PublicKey(s),m))),b.add(i.createTransferInstruction(f,w,new o.PublicKey(r),Number(g),[],m)),b.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),b.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),b.feePayer=new o.PublicKey(r);const S=await n.account.simulateTransaction(r,t,b);if(!S.status)return void console.log(Ne.red(S.output));if(!S.output||!S.output.value||0===S.output.value.unitsConsumed||S.output.value.err)return console.log(Ne.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(S.output,null,4)),void console.log("==============================================");let x=new l.BigNumber(S.output.value.unitsConsumed.toString());x=new l.BigNumber(Math.ceil(1.2*Number(x)));const _=await oe(t);if(!_.status)return void console.log(Ne.red(_.output));const P=new l.BigNumber(_.output.toString());k.add(i.createTransferInstruction(f,w,new o.PublicKey(r),Number(g),[],m)),k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(x)})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(P)})),b.feePayer=new o.PublicKey(r);const $=await n.account.signTransaction(r,k,t);if(!$.status)return void console.log(Ne.red($.output));let A=await n.account.sendSignedTransaction(r,$.output,t);A.status?(pe(a,[r,d],["0",s]),console.log(Ne.green(`Transaction hash: ${A.output}`))):console.log(Ne.red(A.output))})(e,d.rpcUrl,d.chainId.toString(),a,r);break;case"> Back":return}},Be=async(e,t,a,r)=>{const n=["> SendTx","> SignMessage",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> SendTx":await Oe(e,t,a,r);break;case"> SignMessage":{const e=await wa("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(Ne.red(t.output));break}console.log(Ne.green("Signature: "+t.output));break}case"> Back":return}await Be(e,t,a,r)},Ee=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new j.default.Separator("----------------------------------"),"> Back"],n=await ea(r);if("> Back"===n)return;"> Send Tx"===n&&(a=await Dt("Input address to send tx",Yt)),"> Search Accounts"===n&&(a=await Dt("Input part address to send tx",Ht));let s=t.account.getAccountLabel(a);if(null===s)return console.log(Ne.red("Account not found")),void await Ee(e,t);let o=s.account_label,i=la(e,o);if(a=s.account_address,null===o)return console.log(Ne.red("Account not found")),void await Ee(e,t);const c=await zt(e,o,a);if(null===c)return console.log(Ne.red("Account not found")),void await Ee(e,t);console.log(Ne.green(`Address found!\n address: ${a}\n account name: [${i}]\n account index: #${c}`)),(await Je(e,o,t)).isLoginIn?(await Be(e,o,a,t),await Ee(e,t)):await Ee(e,t)},Fe=require("chalk");require("dotenv").config();const Le=require("cli-progress");require("wative-core");const qe={keystore_slug:"",default_account_index:0},Ke=async e=>{const t=Me(e);let a=[];t.accounts&&(a=t.accounts);let r=await pa("Account Name",a);return null===r?null:{account_name:r,password:await fa(`Please set a password for Account [${r}]`),selected_default_network:await ft(e)}},Re=async(e,t,a,r,n,s,o)=>{let i=await wt(e,n);"evm"!==we(i.chainId.toString())||r.startsWith("0x")||(r="0x"+r);let c=await s.account.generatePKAccount(a,r,t,i.chainId.toString(),o);if(!c.status)return void console.log(Fe.red(c.output));let l,u=I.join(e,`accounts/${a}.json`);if(A.existsSync(u)){let e=JSON.parse(A.readFileSync(u,"utf8"));if("data"in e){if(e.data.map(e=>e.ciphertexts.address).includes(c.output.ciphertexts.address))return void console.log(Fe.red("The account has already been imported"));e.data.push({ciphertexts:c.output.ciphertexts}),l=e}else e.data=[{ciphertexts:e.ciphertexts}],delete e.ciphertexts,e.data.push({ciphertexts:c.output.ciphertexts}),l=e}else c.output.data=[{ciphertexts:c.output.ciphertexts}],delete c.output.ciphertexts,c.output.default_network=n,l=c.output;A.writeFileSync(u,JSON.stringify(l,null,4)),s.account.reloadAccount()},De=async(e,t)=>{const a=["> Import Passphrase","> Import Private Key",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(a)){case"> Import Passphrase":await(async(e,t)=>{let a=await Ke(e);if(!a)return;let r=await ma("Please enter a mnemonic [split by space]",Vt);r=r.replace(/\s+/g," ");let n=ua(a.account_name);const s=t.account.generatePPAccount(n,r,a.password);if(!s.status)return void console.log(Fe.red(s.output));let o=I.join(e,`accounts/${n}.json`);s.output.default_network=a.selected_default_network,A.writeFileSync(o,JSON.stringify(s.output,null,4));const i=I.resolve(e,"network.json"),c=JSON.parse(A.readFileSync(i,"utf8"));c.accounts.push(a.account_name),A.writeFileSync(i,JSON.stringify(c,null,4))})(e,t);break;case"> Import Private Key":await(async(e,t)=>{let a=await Ke(e);if(!a)return;let r=await ga("Please enter a private key"),n=ua(a.account_name);await Re(e,a.password,n,r,a.selected_default_network,t,!0);const s=I.resolve(e,"network.json"),o=JSON.parse(A.readFileSync(s,"utf8"));o.accounts.push(a.account_name),A.writeFileSync(s,JSON.stringify(o,null,4))})(e,t);break;case"> Back":return}t.account.reloadAccount()},Me=e=>{const t=I.resolve(e,"network.json");return JSON.parse(A.readFileSync(t,"utf8"))},ze=(e,t)=>{const a=I.join(e,`accounts/${t}.json`);return JSON.parse(A.readFileSync(a,"utf8"))},Ue=(e,t,a)=>{const r=I.join(e,`accounts/${t}.json`);A.writeFileSync(r,JSON.stringify(a,null,4))},Je=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let r=0;r<3;r++){let r,n=la(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 ha(`Please input the password for Account [${n}]`),!r)return console.log(Fe.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 ea(i,o.output);if("> Back"===c)return{isLoginIn:!1}}return{isLoginIn:!1}},He=async(e,t)=>{const a=Me(e).accounts;let r=["> Back",new j.default.Separator("----------------------------------")];const n=a.length;if(0===n)return void console.log(Fe.red("No address here yet"));for(let t=0;t<n;t++){const n=a[t],s=ua(n),o=ze(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 ea(r,"Select an account");if("> Back"===s)return;const o=a[r.indexOf(s)-2],i=ua(o);console.log(Fe.green(`Keystore slug: [${i}]`));let c=await Je(e,i,t);c.isLoginIn&&await We(e,i,t,c.password),await He(e,t)},Ge=async(e,t,a)=>{const r=await ze(e,t);let n=["> Disabled Slots","> Add Single","> Add Range",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(Fe.red("No disabled slots here yet"));break}let n=r.data,s=["> Back",new j.default.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 n[r]&&(c=n[r].default_network),"default_network"in n[i]&&(l=n[i].default_network);let u,d,p=yt(e,c),g=yt(e,l);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==g&&"solana"!==g)throw new Error(`Invalid network type: ${g}`);u="evm"===p?n[r].ciphertexts.evm.address:n[i].ciphertexts.solana.address,d="evm"===g?n[i].ciphertexts.evm.address:n[i].ciphertexts.solana.address,r===i?s.push(`${t+1}. ${u}[${r}]`):s.push(`${t+1}. ${u}[${r}]-${d}[${i}]`)}let i=await ea(s);if("> Back"===i)break;if(!await ya(`Are you sure to delete the ${i}?`,!0))break;let c=s.indexOf(i)-2;r.disabled_slots.splice(c,1),Ue(e,t,r);break}case"> Add Single":{let a=await Ut(r,"Input address or index");if(null===a){console.log(Fe.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],Ue(e,t,r);break}case"> Add Range":{let a=await Mt(r);if(!a){console.log(Fe.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],Ue(e,t,r);break}}await Ge(e,t)},We=async(e,t,a,r)=>{let n,s=await ze(e,t);n="PP"===s.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${s.default_network}]`,"> Remove",new j.default.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${s.default_network}]`,"> Remove",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(n)){case"> Address List":await Ve(e,t,a);break;case"> Expand Address":{const r=await Dt("Expand accounts count",Zt);if(Number(r)>2e3){console.log(Fe.red("Too many accounts, please input less than 2000"));break}await Xe(e,t,Number(r),a);break}case"> Import Private Key":await(async(e,t,a,r)=>{let n=await Dt("Please enter a private key"),s=I.join(e,`accounts/${a}.json`),o=JSON.parse(A.readFileSync(s,"utf8"));await Re(e,t,a,n,o.default_network,r,!1)})(e,r,t,a);break;case"> Slice Address":{const r=await Dt("Please input last account number",Xt);await Qe(e,t,Number(r),a);break}case"> Remove Address":await Ye(e,t,a);break;case"> Disable Address":await Ge(e,t);break;case"> Reset Account Password":{let r=la(e,t);const n=await fa(`Please input new password for Account [${r}]`),s=await fa(`Please confirm new password for Account [${r}]`);if(!n||!s||n!==s){console.log(Fe.red("Passwords do not match"));break}return void await a.account.resetPassword(t,n)}case`> Switch Networks [${s.default_network}]`:await St(e,t,!0);break;case"> Remove":return void await et(e,t);case"> Back":return}await We(e,t,a,r)},Ve=async(e,t,a)=>{const r=await ze(e,t);let n=["> Back",new j.default.Separator("----------------------------------")],s=r.disabled_slots,o=$t(e),i=r.default_network,c=wt(e,i),l=we(c.chainId.toString()),u=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,i=r.data[e].tag?`(${r.data[e].tag})`:"",c=a.account.checkIsDisableAddress(s,e);t="PP"===r.account_type?"evm"===l?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,c?n.push(new j.default.Separator(Fe.yellow(`#${e.toString().padEnd(u)} ${_a(t,o.fullAddr)} ${i}`))):n.push(`#${e.toString().padEnd(u)} ${_a(t,o.fullAddr)} ${i}`)}let d,p=qe.keystore_slug===t?n[qe.account_index]:n[0],g=qe.keystore_slug===t&&qe.account_index>0,h=await Nt(e,c.chainId.toString());if(g&&qe.account_index>15){let e=n.slice(0,qe.account_index-15);d=n.slice(qe.account_index-15).concat(e)}else d=n.slice(0);let m=await Ia(d,"evm"===l,e,h,c,o.gasToken,o.extendedToken,g,"Select an account",p);"> Back"!==m&&(qe.keystore_slug=t,qe.account_index=n.indexOf(m),await Ze(e,t,n.indexOf(m)-2,a),await Ve(e,t,a))},Ze=async(e,t,a,r)=>{const n=await ze(e,t);let s=n.default_network,o=vt(e,t,a);const i=await wt(e,s),c=await xt(o,e,s);c.status?console.log(Fe.green(` Address No: #${a}\n Network: ${s}\n ${i.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(Fe.green(` Address No: #${a}\n Network: ${s}\n ${i.nativeCurrency.symbol}`));let l="> Tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(l=`> Tag(${n.data[a].tag})`);let u=["> Tools","> Show address","> Assets",l,"> Reload balances","> Dump private key",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(u)){case"> Tools":await Be(e,t,o,r);break;case"> Show address":await kt(e,t,a);break;case"> Assets":await Ct(e,s,o);break;case"> Reload balances":await Tt(e,s,o);break;case l:{let r="Current tag";"tag"in n.data[a]&&""!==n.data[a].tag&&(r=`Current tag (${n.data[a].tag})`);let s=await Dt(r,Jt);n.data[a].tag=s.replace(/\s+/g," ").trim(),Ue(e,t,n);break}case"> Dump private key":{let n=vt(e,t,a),s=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",s);break}case"> Back":return}},Xe=async(e,t,a,r)=>{const n=await ze(e,t),s=n.data.length,o=new Le.SingleBar({},Le.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(Fe.red(a.output));n.data.push({ciphertexts:a.output}),o.increment()}o.stop(),Ue(e,t,n),r.account.reloadAccount()},Qe=async(e,t,a,r)=>{const n=await ze(e,t);n.data=n.data.slice(0,a+1),Ue(e,t,n),r.account.reloadAccount()},Ye=async(e,t,a)=>{let r=await Dt("Please input the accountIndex to remove this account",Gt);if("0"===r)return void console.log(Fe.red("Can't remove the first account"));let n=await ze(e,t);await ya(`Are you sure you want to remove this account(${n.data[r].ciphertexts.address})`,!0)&&(n.data.splice(Number(r),1),Ue(e,t,n),a.account.reloadAccount())},et=async(e,t)=>{let a=await Dt("Please input the account name to remove this account"),r=la(e,t);if(a!==r)return void console.log(Fe.red("Can't remove this account"));if(!await ya(`Are you sure you want to remove this account(${r})`,!0))return;let n=I.join(e,`accounts/${t}.json`);A.rmSync(n);const s=I.resolve(e,"network.json");if(!A.existsSync(s))return;const o=JSON.parse(A.readFileSync(s,"utf8"));let i=o.accounts.indexOf(r);o.accounts.splice(i,1),A.writeFileSync(s,JSON.stringify(o,null,2))},tt=async(e,t)=>{const a=I.resolve(e,"accounts");A.existsSync(a)||A.mkdirSync(a);let r;switch(r=0===Me(e).accounts.length?["> Create a new account",new j.default.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new j.default.Separator("----------------------------------"),"> Back"],await ea(r)){case"> Select an account":await He(e,t);break;case"> Create a new account":await De(e,t);break;case"> Back":return}await tt(e,t)},at=require("chalk"),rt=async e=>{const t=I.resolve(e,"network.json");if(A.existsSync(t))return;const a={networks:me,currentNetwork:"Ethereum Mainnet",accounts:[]};A.writeFileSync(t,JSON.stringify(a,null,2))},nt=async(e,t)=>{let a=["> Edit"];"Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new j.default.Separator("----------------------------------")),a.push("> Back");switch(await ea(a)){case"> Edit":await st(e,t);break;case"> Remove":await ot(e,t)}},st=async(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));let n=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];n.push(t.name)}let s=t.rpcUrl,o=t.chainId.toString(),i=t.nativeCurrency.symbol,c=t.name,l=t.multicallAddress,u=t.color;if("Ethereum Mainnet"===t.name||"Solana Mainnet"===t.name)s=await sa(t.chainId.toString(),`Rpc Url (default: ${t.rpcUrl})`,!0);else{if(c=await Dt(`Chain Name (default: ${t.name})`),c&&c!==t.name&&n.includes(c))return void console.log(at.red("Chain Name already exists"));o=await na(`Chain Id (default: ${t.chainId})`,!0),s=await sa(o||t.chainId,`RPC Url (default: ${t.rpcUrl})`,!0),i=await ia(`Symbol (default: ${t.nativeCurrency.symbol})`),l=await oa(t.multicallAddress?`Multicall Address (Optional) (default: ${t.multicallAddress})`:"Multicall Address (Optional)"),u=await ca(t.color?`Color (Optional): (default: ${t.color})`:"Color (Optional)")}s=s||t.rpcUrl,o=o||t.chainId.toString(),i=i||t.nativeCurrency.symbol,c=c||t.name,l=l||t.multicallAddress,u=u||t.color;let d=ye(o.toString()),p={name:c||t.name,chainId:Number(o)||t.chainId,rpcUrl:s||t.rpcUrl,nativeCurrency:{name:i||t.nativeCurrency.symbol,symbol:i||t.nativeCurrency.symbol,decimals:d||t.nativeCurrency.decimals}};(l||t.multicallAddress)&&(p.multicallAddress=l||t.multicallAddress),(u||t.color)&&(p.color=u||t.color);for(let e=0;e<r.networks.length;e++)if(r.networks[e].name===t.name){r.networks[e]=p;break}A.writeFileSync(a,JSON.stringify(r,null,2))},ot=async(e,t)=>{const a=I.resolve(e,"network.json");let r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++)if(r.networks[e].name===t.name){r.networks.splice(e,1);break}t.name===r.currentNetwork&&(r.currentNetwork="Ethereum Mainnet"),A.writeFileSync(a,JSON.stringify(r,null,2))},it=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];r.push(t.name)}console.log(at.green("Please input someting about network"));const n=await Dt("Chain Name");if(r.includes(n))return void console.log(at.red("Chain Name already exists"));const s=await na("Chain Id");if(!s)return;const o=await sa(s,"RPC Url");if(!o)return;const i=await ia("Symbol");if(!i)return;const c=await oa("Multicall Address (Optional)"),l=await ca("Color (Optional)");let u=ye(s.toString()),d={name:n,chainId:Number(s),rpcUrl:o,nativeCurrency:{name:i,symbol:i,decimals:u}};c&&(d.multicallAddress=c),l&&(d.color=l),a.networks.push(d),A.writeFileSync(t,JSON.stringify(a,null,2))},ct=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=[],n=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];"solana"===we(t.chainId.toString())?n.push(e):r.push(e)}let s=["> Back","+ Add Network",new j.default.Separator("----Networks(evm)----")];for(let e=0;e<r.length;e++){const t=r[e];let n=`${e+1}.${a.networks[t].name}`;0===e&&(n+=" 🔒"),s.push(n)}s.push(new j.default.Separator("----Networks(solana)----"));for(let e=0;e<n.length;e++){const t=n[e];let r=`${e+1}.${a.networks[t].name}`;0===e&&(r+=" 🔒"),s.push(r)}const o=await ea(s);if("> Back"===o)return;if("+ Add Network"===o)return void await it(e);let i,c=s.indexOf(o);i=c<r.length+3?a.networks[r[c-3]]:a.networks[n[c-r.length-4]],await nt(e,i),await ct(e)},lt=async e=>{let t=["> Enhanced Balance Display",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Enhanced Balance Display":await ht(e);break;case"> Back":return}await lt(e)},ut=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));"status"in a||(a.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let r=[`> Show Full Address [${a.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${a.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${a.status.extendedToken?"ON":"OFF"}]`,new j.default.Separator("----------------------------------"),"> Back"];const n=await ea(r);"> Back"!==n&&(n.includes("Full Address")?a.status.fullAddr=await dt():n.includes("Gas Token")?a.status.gasToken=await dt():n.includes("Extended Token")&&(a.status.extendedToken=await dt()),A.writeFileSync(t,JSON.stringify(a,null,2)))},dt=async()=>{switch(await ea(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},pt=(e,t)=>{const a=I.resolve(e,"network.json");let r=JSON.parse(A.readFileSync(a,"utf8")).showTokens;return t in r?r[t]:[]},gt=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r={};for(let e of a.networks)r[e.chainId.toString()]=e.name;const n=I.resolve(e,"assets.json");if(!Sa(n))return void console.log(at.red("No asset here yet"));const s=JSON.parse(A.readFileSync(n,"utf8"));let o=[],i=[],c={};for(let t in s){c[o.length]={name:r[t],address:null},o.push(new j.default.Separator(`----- Networks (${r[t]}) -------`));let a=pt(e,r[t]),n=s[t].length;for(let e=0;e<n;e++){let n=s[t][e];a.includes(n.address)&&i.push(`${e+1}.${n.symbol.padEnd(6)} CA: ${at.green(`${_a(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`),c[o.length]={name:r[t],address:n.address},o.push(`${e+1}.${n.symbol.padEnd(6)} CA: ${at.green(`${_a(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`)}}let l=await ta(o,"Choose Tokens",i),u={};for(let e=0;e<l.length;e++){let t=l[e],a=c[o.indexOf(t)];a.name in u?u[a.name].push(a.address):u[a.name]=[a.address]}a.showTokens=u,A.writeFileSync(t,JSON.stringify(a,null,2))},ht=async e=>{const t=["> Status","> Token List","> Add Token",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Status":await ut(e);break;case"> Token List":await gt(e);break;case"> Add Token":await Ot(e);break;case"> Back":return}await ht(e)},mt=async e=>{let t=["> Networks","> Dataview",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(t)){case"> Networks":await ct(e);break;case"> Dataview":await lt(e);break;case"> Back":return}await mt(e)},ft=async e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8")).networks.map(e=>`> ${e.name}`);return(await ea(a,"Please select a default network")).slice(2)},yt=(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++){const a=r.networks[e];if(a.name===t)return we(a.chainId.toString())}return"unknown"},wt=(e,t)=>{const a=I.resolve(e,"network.json"),r=JSON.parse(A.readFileSync(a,"utf8"));for(let e=0;e<r.networks.length;e++){const a=r.networks[e];if(a.name===t)return a}return null},vt=(e,t,a)=>{const r=ze(e,t);if("PK"===r.account_type)return r.data[a].ciphertexts.address;let n=r.default_network,s=yt(e,n);return"solana"===s?r.data[a].ciphertexts.solana.address:"evm"===s?r.data[a].ciphertexts.evm.address:null},bt=(e,t)=>ze(e,t).ciphertexts.address,kt=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=o.default_network;const c=yt(e,i);for(let t=0;t<s;t++){const r=n[t],s=yt(e,r.name);if("PK"===o.account_type&&c!==s)continue;let l;l="PK"===o.account_type?o.data[a].ciphertexts.address:"evm"===s?o.data[a].ciphertexts.evm.address:o.data[a].ciphertexts.solana.address,r.name===i?console.log(`● ${l} [${r.name}]`):console.log(`○ ${l} [${r.name}]`)}},St=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=["> Back",new j.default.Separator("----------------------------------")],c=o.default_network,l="";a||(l=o.ciphertexts.address);let u=[];const d=yt(e,c);for(let t=0;t<s;t++){const r=n[t],s=yt(e,r.name);"PK"===o.account_type&&d!==s||(r.name===c?a?i.push(`● ${r.name}`):i.push(`● ${l} [${r.name}]`):a?i.push(`○ ${r.name}`):i.push(`○ ${l} [${r.name}]`),u.push(r.name))}const p=await ea(i);if("> Back"===p)return;let g=i.indexOf(p);if(o.default_network=u[g-2],Ue(e,t,o),!a){let t=o.default_network,a=wt(e,t);console.log(at.green(` Address No: #0\n Network: ${t}\n ${a.nativeCurrency.symbol} Balance: 0`))}},xt=async(e,t,a)=>{const r=wt(t,a),n=r.rpcUrl,s=r.nativeCurrency.decimals;let o;if(o="solana"===we(r.chainId.toString())?await Q(e,n):await X(e,n),o.status){let e=new l.BigNumber(o.output.toString());o.output=e.dividedBy(Math.pow(10,s)).toFixed(4,l.BigNumber.ROUND_FLOOR)}return pe(r.chainId.toString(),[e],["0"]),o},_t=(e,t,a)=>{const r=ze(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},Pt=e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8")).networks,r=a.length;let n=[];for(let e=0;e<r;e++)"evm"===we(a[e].chainId.toString())&&n.push(a[e].name);return n},$t=e=>{const t=I.resolve(e,"network.json");return JSON.parse(A.readFileSync(t,"utf8")).status},At=require("chalk"),Nt=async(e,t)=>{let a=I.join(e,"assets.json");if(!Sa(a))return[];const r=A.readFileSync(a).toString(),n=JSON.parse(r);return t in n?n[t]:[]},It=async(e,t,a)=>{const r=await Nt(e,t);let n=[];for(let e=0;e<r.length;e++)r[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&n.push(r[e]);return n},Ct=async(e,t,a)=>{const r=wt(e,t),n=we(r.chainId.toString()),s=await Nt(e,r.chainId.toString());if(!s)return void console.log(At.red("No asset found"));const o=await Ft(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(At.green(`${i}. ${o[e].symbol} Balance: ${o[e].balance}`)),i+=1);1===i&&console.log(At.red("No asset found"))},Tt=async(e,t,a)=>{const r=wt(e,t);let n=(await Nt(e,r.chainId.toString())).map(e=>e.address);n.push("0"),pe(r.chainId.toString(),[a],n)},jt=async(e,t,a,r,n,s,o)=>{let i=I.join(e,"assets.json"),c={};if(Sa(i)){const e=A.readFileSync(i).toString();c=JSON.parse(e)}void 0===c[t]&&(c[t]=[]);for(let e=0;e<c[t].length;e++)if(c[t][e].address.toLocaleLowerCase()===a.toLocaleLowerCase()||c[t][e].symbol.toLocaleLowerCase()===r.toLocaleLowerCase())return c[t][e]={address:a,symbol:r,name:n,decimals:s,display_decimals:o},void A.writeFileSync(i,JSON.stringify(c,null,4));c[t].push({address:a,symbol:r,name:n,decimals:s,display_decimals:o}),A.writeFileSync(i,JSON.stringify(c,null,4))},Ot=async e=>{const t=I.resolve(e,"network.json");let a=[],r=JSON.parse(A.readFileSync(t,"utf8")).networks;for(let e=0;e<r.length;e++)a.push(`${e+1}. ${r[e].name}`);let n=(await ea(a)).split(".")[1].trim();const s=yt(e,n),o=wt(e,n),i=await Dt("Enter contract address",Yt);let c;if("evm"===s){if(!be(i))return void console.log(At.red("evm address format error"));c=await ee(i,o.rpcUrl)}else{if(!ve(i))return void console.log(At.red("solana address format error"));c=await te(i,o.rpcUrl)}if(!c.status)return void console.log(At.red(c.output));c.output.name||(c.output.name=await Dt("Please input token name")),c.output.symbol||(c.output.symbol=await Dt("Please input token symbol")),console.log(At.green(`Token ${c.output.symbol}(${c.output.name}) loaded successfully.`));let l=await Dt("Enter decimals for display",Gt);l=parseInt(l),await jt(e,o.chainId.toString(),i,c.output.symbol,c.output.name,c.output.decimals,l)},Bt=async(e,t)=>{const a=yt(e,t),r=wt(e,t),n=await Dt("Enter contract address",Yt);let s;if("evm"===a){if(!be(n))return void console.log(At.red("evm address format error"));s=await ee(n,r.rpcUrl)}else{if(!ve(n))return void console.log(At.red("solana address format error"));s=await te(n,r.rpcUrl)}if(!s.status)return void console.log(At.red(s.output));s.output.name||(s.output.name=await Dt("Please input token name")),s.output.symbol||(s.output.symbol=await Dt("Please input token symbol")),console.log(At.green(`Token ${s.output.symbol}(${s.output.name}) loaded successfully.`));let o=await Dt("Enter decimals for display",Gt);o=parseInt(o),await jt(e,r.chainId.toString(),n,s.output.symbol,s.output.name,s.output.decimals,o)},Et=async(e,t,a)=>{const r=["> Show Assets","> Add Asset",new j.default.Separator("----------------------------------"),"> Back"];switch(await ea(r)){case"> Show Assets":await Ct(e,a,t);break;case"> Add Asset":await Bt(e,a);break;case"> Back":return}await Et(e,t,a)},Ft=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(ae(e,s.address,a)):"solana"===r&&o.push(re(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(At.red(i[a].output)),null;let o=new l.BigNumber(i[a].output).dividedBy(Math.pow(10,s)).toFixed(4,l.BigNumber.ROUND_FLOOR);c.push({address:r.address,symbol:r.symbol,balance:o}),pe(n,[e],[r.address])}return pe(n,[e],["0"]),c},Lt=async(e,t,a,r,n,s,o)=>{let i=a.length,c=wt(e,n),l="evm"===we(c.chainId.toString());s&&await ue(t,"0",c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"");let u=[];if(o){u=pt(e,n);for(let e=0;e<i;e++){let n=a[e].address;u.includes(n)&&await ue(t,n,c.chainId.toString(),r,l,c.multicallAddress?c.multicallAddress:"")}}return de(c.chainId.toString(),t,a,c,s,u)},qt=require("chalk"),Kt=process.env.HOME||process.env.USERPROFILE,Rt=`${Kt}/.wative`,Dt=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await j.default.prompt(a);return r.trim().toString()},Mt=async e=>{for(let t=0;t<5;t++){let t=await Ut(e,"Input start address or index");if(!t)return console.log(qt.red("Invalid start account index")),null;let a=await Ut(e,"Input end address or index");if(!a)return console.log(qt.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(qt.red("Invalid address range"))}return null},zt=async(e,t,a)=>{let r=I.join(e,`accounts/${t}.json`);if(!A.existsSync(r))return null;let n=JSON.parse(A.readFileSync(r,"utf8")),s=n.data,o=n.account_type,i=s.length;if(0===i)return null;for(let e=0;e<i;e++){if("PK"===o&&s[e].ciphertexts.address.toLocaleLowerCase()===a.toLocaleLowerCase())return e.toString();if("PP"===o&&(s[e].ciphertexts.evm.address.toLocaleLowerCase()===a.toLocaleLowerCase()||s[e].ciphertexts.solana.address.toLocaleLowerCase()===a.toLocaleLowerCase()))return e.toString()}return null},Ut=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 Dt(t,Qt),a=ka(e);if("unknown"===a){if(Number(e)>o){console.log(qt.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},Jt=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"),Ht=e=>!(e.length<6)||"Address length should be greater than 6",Gt=e=>!isNaN(Number(e))||"Value should be a number",Wt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",Vt=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===he.includes(t[e]))return"Passphrase word should be valid";return!0},Zt=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},Xt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},Qt=e=>!1===isNaN(Number(e))||Yt(e),Yt=e=>"unknown"!=ka(e)||"Address should be valid",ea=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 j.default.prompt(r);return n.toString()},ta=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 j.default.prompt(r);return n},aa=()=>{console.log(qt.green(T.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})))},ra=async()=>{let e=await Dt(`Keystore storage located in (default: ${Rt})`);return e||(e=Rt),e=e.trim(),e=e.replace("~",Kt),A.existsSync(e)||A.mkdirSync(e,{recursive:!0}),e},na=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Dt(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},sa=async(e,t,a=!1)=>{for(let r=0;r<5;r++){let r=await Dt(t);try{if(""===r&&a)return null;if("solana"===we(e.toString()))return r;const t=await Z(r);if(!t.status){console.log(qt.red(t.output));continue}if(t.output.toString()===e.toString())return r;console.log(qt.red("Rpc url not match chain id"))}catch(e){console.log(qt.red(e.message))}}return null},oa=async e=>{for(let t=0;t<5;t++){let t=await Dt(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(qt.red("Multicall address length must be 42"))}return null},ia=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Dt(e);if(""===a)return null;if(t.test(a))return a}return null},ca=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Dt(e);if(""===a)return null;if(t.test(a))return a}return null},la=(e,t)=>{const a=Me(e).accounts,r=da(a).indexOf(t);return-1!==r?a[r]:t},ua=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),da=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(ua(e[a]));return t},pa=async(e,t)=>{let a=da(t),r=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Dt(e);t=t.trim();let n=ua(t);if(r.test(n)){if(a.includes(n)){console.log(qt.red("Account name already exists"));continue}return t}}return null},ga=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await j.default.prompt(a);return r.trim().toString()},ha=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await j.default.prompt(t);return a},ma=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 j.default.prompt(a);return r.trim().toString()},fa=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=qt.green("✔"),o=qt.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 j.default.prompt(t);return a},ya=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await j.default.prompt(a);return r},wa=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await j.default.prompt(a);return r.trim().toString()},va=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},ba=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},ka=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",Sa=e=>(e=e.trim(),A.existsSync(e)),xa=e=>new Promise(t=>setTimeout(t,e)),_a=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),Pa=(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,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}},Aa=(e,t)=>{const a=[];for(let r=0;r<e.length;r++){const n=Pa(e[r],t);a.push(n)}return a.concat(a)},Na=(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 g=u.split("(");if(g.length>1){let t=g[1];e[i].name=g[0]+` ${p}`+`(${t}`}else e[i].name=g[0]+` ${p}`}},Ia=async(e,t,a,r,n,s,o,i,c,l)=>{const u=[{type:"list",name:"inputText",message:c||"Choose an option",choices:e,pageSize:30,default:l,loop:!0,filter:e=>e}],d=j.default.prompt(u);let p,g=0,h=0;for(;!d.ui.activePrompt.answers[d.ui.activePrompt.opt.name];){if(i||await xa(1e3),p===d.ui.activePrompt.selected)continue;if(g===d.ui.activePrompt.selected?h+=1:(h=0,g=d.ui.activePrompt.selected),i){h=6,i=!1;const e=d.ui.activePrompt.opt.pageSize,a=Aa(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:r,toIndex:s}=$a(g,e,a.length),o=a.slice(r,s);if(!ge(n.chainId.toString(),o)){h=0;continue}}if(h<5)continue;h=0;const e=d.ui.activePrompt.opt.pageSize,c=Aa(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:l,toIndex:u}=$a(g,e,c.length),m=c.slice(l,u);let f=await Lt(a,m,r,n.rpcUrl,n.name,s,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=n.nativeCurrency.symbol;Na(d.ui.activePrompt.opt.choices.choices,c,f,y,w,s,o,l,u),d.ui.activePrompt.screen.render(""),d.ui.activePrompt.render(),p=g}return d.ui.activePrompt.answers[d.ui.activePrompt.opt.name]},Ca=e=>{const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));a.status||(a.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),a.showTokens||(a.showTokens={});let r=a.accounts.length;for(let t=0;t<r;t++){let n=a.accounts[r-1-t],s=ua(n),o=I.resolve(e,`accounts/${s}.json`);A.existsSync(o)||a.accounts.splice(r-1-t,1)}A.writeFileSync(t,JSON.stringify(a,null,4));let n=a.accounts,s=da(n);for(let t=0;t<s.length;t++){let a=I.resolve(e,`accounts/${s[t]}.json`),r=JSON.parse(A.readFileSync(a,"utf8"));"PP"!==r.account_type&&("data"in r||(r.data=[{ciphertexts:r.ciphertexts}],delete r.ciphertexts,A.writeFileSync(a,JSON.stringify(r,null,4))))}};require("wative-core");const Ta=async(e,t)=>{switch(await ea(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await mt(e);break;case"> Accounts":await tt(e,t);break;case"> Tools":await Ee(e,t);break;case"> Exit":return}await Ta(e,t)};class ja{constructor(e,t){this.configDir=e||I.join(require("os").homedir(),".wative/ssh"),this.keystorePath=t||I.join(require("os").homedir(),".wative"),A.existsSync(this.configDir)||A.mkdirSync(this.configDir,{recursive:!0});const a=I.join(this.configDir,"conf.d");A.existsSync(a)||A.mkdirSync(a,{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(e){const t=this.getServiceConfigPath(e);if(!A.existsSync(t))throw new Error(`Service configuration '${e}' not found.`);const a=E.parse(A.readFileSync(t,"utf-8"));return this.parseConfigData(a)}serviceIsExist(e){const t=this.getServiceConfigPath(e);return A.existsSync(I.dirname(t))}listServiceConfigs(){const e=I.join(this.configDir,"conf.d");if(!A.existsSync(e))return[];return A.readdirSync(e).filter(t=>{const a=I.join(e,t);return A.statSync(a).isDirectory()&&A.existsSync(I.join(a,"config.ini"))})}removeServiceConfig(e){const t=this.getServiceConfigPath(e),a=I.dirname(t);A.existsSync(a)&&A.rmSync(a,{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(e){const t=this.generateSecurePassphrase(),a=I.join(this.configDir,"conf.d",e);A.existsSync(a)||A.mkdirSync(a,{recursive:!0});const r=I.join(a,"server_private_key"),n=I.join(a,"server_public_key.pub");return A.existsSync(r)||(console.log(`Generating SSH server key pair for service '${e}'...`),p.execSync(`ssh-keygen -t rsa -b 4096 -f ${r} -N '${t}' -C 'wative_${e}_server'`,{stdio:"inherit"})),{privateKey:r,publicKey:n,passphrase:t}}async generateClientKeyPair(e,t){const a=I.join(this.configDir,"conf.d",e);A.existsSync(a)||A.mkdirSync(a,{recursive:!0});return{privateKey:"",publicKey:I.join(a,`${t}.pub`),passphrase:""}}generateSecurePassphrase(){return F.randomBytes(32).toString("hex")}getServiceConfigPath(e){return I.join(this.configDir,"conf.d",e,"config.ini")}saveServiceConfig(e,t){const a=this.getServiceConfigPath(e),r=I.dirname(a);A.existsSync(r)||A.mkdirSync(r,{recursive:!0});const n=E.stringify(t);A.writeFileSync(a,n)}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=e=>{if(e=e.trim(),!A.existsSync(e))throw new Error("File not exists")};const{WativeCore:Ba}=require("wative-core"),{Connection:Ea,PublicKey:Fa,VersionedTransaction:La,VersionedMessage:qa}=require("@solana/web3.js"),Ka=require("bs58"),{Keypair:Ra,TransactionMessage:Da,ComputeBudgetInstruction:Ma,TransactionInstruction:za,ComputeBudgetProgram:Ua}=require("@solana/web3.js"),{Wallet:Ja}=require("@coral-xyz/anchor");L.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 Ha=L.getLogger("file");Ha.level="info";class Ga{constructor(e,a,r,n,s,o,i,c){if(this._allowedAppIds=[],this._allowedPubKeys=[],this._allowedKeystoreIds=[],this._sessionIdAppIdMap={},this.getKeystoreSlugByAccountName=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),Oa(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 a=g.utils.parseKey(t.readFileSync(e));this._allowedPubKeys.push(a)}this.wativeCore=new Ba(o,i,c),this._idRsaPrivatePath=e,this._idRsaPassphrase=a,this._allowedKeystoreIds=s,this._keystoreDirectoryPath=o}listen(e,a){new g.Server({hostKeys:[{key:t.readFileSync(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",()=>{Ha.info("Client disconnected")}).on("error",e=>{Ha.error("err: ",e.message)})}).listen(a,e,function(){Ha.info("Listening on port "+a)})}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);Ha.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)&&"get_keystore_slug_list"!==s)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 Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}}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.message}}}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 Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}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 Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("sign_message"===s)try{let e=n.params;Ha.debug("sign message: ",e),c=await this.signMessage(e.account,e.message)}catch(e){return Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("sign_typed_data"===s)try{let e=n.params;Ha.debug("sign message: ",e),c=await this.signTypedData(e.account,e.domain,e.types_name,e.types,e.message)}catch(e){return Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}else if("get_disabled_slots"===s)try{c=await this.getDisabledSlots(o)}catch(e){return Ha.error("get disabled slots error: ",e.message),{status:!1,msg:e.message}}else if("update_disabled_slots"===s)try{let e=n.params;Ha.debug("update disabled slots: ",e),c=await this.updateDisabledSlots(o,e.disabled_slots)}catch(e){return Ha.error("update disabled slots error: ",e.message),{status:!1,msg:e.message}}else{if("get_keystore_slug_list"!==s)return{status:!1,msg:"message method not find"};try{let e=n.params;c=await this.getKeystoreSlugList(e.appId)}catch(e){return Ha.error("get keystore slug list error: ",e.message),{status:!1,msg:e.message}}}return{status:!0,data:c}}catch(e){return Ha.error("sign error: ",e.message),{status:!1,msg:e.message}}}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=d.timingSafeEqual(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&&d.timingSafeEqual(e,t[r]))return r;return-1}getRootAccount(e,a){const r=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let n,s=t.readFileSync(r);return s=JSON.parse(s.toString()),n="SOLANA"===this.getChainType(a)?s.data[0].ciphertexts.solana.address:s.data[0].ciphertexts.evm.address,[{id:0,address:n,children:s.data.length,type:"M"}]}getChainType(e){return"901"===e||"902"===e||"903"===e?"SOLANA":"EVM"}getSubAccount(e,a,r,n){const s=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let o=t.readFileSync(s);o=JSON.parse(o.toString());let i=o.data.length-1;n&&n<i&&(i=n);let c=0;if(r&&r>0&&(c=r),c>i)return[];let l=this.getChainType(a),u=[];for(let e=c;e<=i;e++)u.push(o.data[e].ciphertexts[l.toLocaleLowerCase()].address);return u}async getDisabledSlots(e){const a=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let r=t.readFileSync(a);return r=JSON.parse(r.toString()),r.disabled_slots||[]}async updateDisabledSlots(e,a){const r=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let n=t.readFileSync(r);return n=JSON.parse(n.toString()),n.disabled_slots=a,t.writeFileSync(r,JSON.stringify(n)),!0}async getKeystoreSlugList(e){Ha.info("appId: ",e),Ha.info("allowedAppIds: ",this._allowedAppIds);let a=this.getBytesIndex(Buffer.from(e),this._allowedAppIds);if(Ha.info("appIdIndex: ",a),-1===a)throw new Error("appId not find");const r=I.resolve(this._keystoreDirectoryPath,"network.json");let n=t.readFileSync(r);n=JSON.parse(n.toString());const s=n.accounts||[],o={};for(let e of s){o[this.getKeystoreSlugByAccountName(e)]=e}let i=this._allowedKeystoreIds[a],c=[];for(let e of i){const a=I.resolve(this._keystoreDirectoryPath,`accounts/${e}.json`);let r=t.readFileSync(a);r=JSON.parse(r.toString()),c.push({keystore_slug:e,account_name:o[e]||e,last_account_index:r.data.length-1})}return c}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 m.ethers.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 Ea(r),o=[];if(a)for(let e of a){let t=(await s.getAddressLookupTable(new Fa(e))).value;o.push(t),await Wa(1e3)}let i=qa.deserialize(Uint8Array.from(Buffer.from(t,"hex"))),c=Da.decompile(i);c.instructions.push(Ua.setComputeUnitLimit({units:2e6})),c.instructions.push(Ua.setComputeUnitPrice({microLamports:1e3})),i=c.compileToV0Message(o),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,await Wa(3e3);let l=new La(i),u=this.wativeCore.account.showPrivateKey(e);const d=Ra.fromSecretKey(new Uint8Array(Ka.decode(u))),p=new Ja(d);let g=await s.simulateTransaction(l);if(!g||!g.value||0===g.value.unitsConsumed||g.value.err)return{status:!1,output:g.value.err};let h=c.instructions.length,m=Math.trunc(1.2*g.value.unitsConsumed);if(c.instructions[h-2]=Ua.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[h-1]=Ua.setComputeUnitPrice({microLamports:n}),i=c.compileToV0Message(o),await Wa(1e3),i.recentBlockhash=(await s.getLatestBlockhash()).blockhash,l=new La(i),l.feePayer=p.publicKey,await Wa(3e3);let f=await this.wativeCore.account.signTransaction(e,l,r),y=new La(f.output.message,f.output.signatures).message.serialize();return y=Buffer.from(y).toString("hex"),{status:!0,output:{transactionHash:Ka.encode(f.output.signatures[0]),message:y,compute_units:g.value.unitsConsumed.toString()}}}async sendSignedSolanaTransaction(e,t,a,r){let n=[Ka.decode(t)],s=qa.deserialize(Uint8Array.from(Buffer.from(a,"hex"))),o=new La(s,n);return await this.wativeCore.account.sendSignedTransaction(e,o,r)}async getPrioritizationFee(e){let t=new Fa("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4");const a=new Ea(e,"confirmed");let r=await a.getSignaturesForAddress(t,{limit:5});await Wa(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 za({keys:[],programId:new Fa("ComputeBudget111111111111111111111111111111"),data:Buffer.from(Ka.decode(a))}),{microLamports:t}=Ma.decodeSetComputeUnitPrice(e);o+=Number(t);continue}catch(e){}}}return Math.ceil(o/5)}}const Wa=e=>new Promise(t=>setTimeout(t,e));"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Va={exports:{}},Za={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){!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 g(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 h=g(t),m=g(a),f=p(r),y=g(n),w=g(s),v=g(o),b=g(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]}})})},P=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}(),$=function(e){return e=e.trim(),h.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(!$(n))return!1}return!0},N=function(e){return(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim()},I=function(e,t){var a=[],r=m.join(e,"network.json");if(!$(r))throw new Error("network.json not found");for(var n=function(e){for(var t=[],a=0;a<e.length;a++)t.push(N(e[a]));return t}(C(r).accounts),s=0;s<t.length;s++)n.includes(t[s])&&a.push(t[s]);return a},C=function(e){var t=h.readFileSync(e).toString();return JSON.parse(t)},T=function(e,t){var a=JSON.stringify(e);h.writeFileSync(t,a)},j=function(e,t){return b.AES.encrypt(e,t).toString()},O=function(e,t){return b.AES.decrypt(e,t).toString(b.enc.Utf8)},B=["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"],E=new f.default(f.default.givenProvider),F=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(!$(a))return!1;var r,n=C(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 O(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=C(a).pp_ciphertexts,n=O(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=C(a);if("PK"===r.account_type){for(var n=r.data,s=0;s<n.length;s++){var o=n[s].ciphertexts.data,i=O(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(),T(r,a),delete this.account_passwords[e],{status:!0,output:"Password reset successfully"}}var l=O(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=O(d[s].ciphertexts.evm.data,this.account_passwords[e]);d[s].ciphertexts.evm.data=j(p,t);var g=O(d[s].ciphertexts.solana.data,this.account_passwords[e]);d[s].ciphertexts.solana.data=j(g,t)}return T(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 P(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 P(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 E.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=I(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(h.existsSync(r)){var n=JSON.parse(h.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=E.utils.toChecksumAddress(e)),e},e.prototype.getAccountAddressByPrivateKey=function(e,t){return"evm"===this.getNetworkTypeByChainId(t)?E.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(!B.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:E.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=h.readFileSync(r,"utf8");t.push(n)}return b.MD5(JSON.stringify(t)).toString()},e}(),L=Za,q=function(){function e(e,t,a,r){this.account=new F(e,t,a,r)}return e.version=L.version,e}();e.WativeCore=q,Object.defineProperty(e,"__esModule",{value:!0})}(t,N.default,C.default,O.default,q.default,K.default,R.default,B.default,D.default,M.default,z.default,U.default)}(0,Va.exports);class Xa{constructor(e,t){this.runningServices=new Map,this.configManager=new ja(e,t),this.pidDir=I.join(this.configManager.getKeystorePath(),"ssh","pids"),this.ensurePidDir(),this.setupLogger()}ensurePidDir(){A.existsSync(this.pidDir)||A.mkdirSync(this.pidDir,{recursive:!0})}async isPortInUse(e,t="127.0.0.1"){return new Promise(a=>{const r=J.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 I.join(this.pidDir,`${e}.pid`)}writePidFile(e,t){const a=this.getPidFilePath(e);A.writeFileSync(a,t.toString())}readPidFile(e){const t=this.getPidFilePath(e);if(!A.existsSync(t))return null;try{const e=A.readFileSync(t,"utf8").trim();return parseInt(e,10)}catch(e){return null}}removePidFile(e){const t=this.getPidFilePath(e);A.existsSync(t)&&A.unlinkSync(t)}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(e){const t=this.runningServices.get(e),a=this.readPidFile(e),r=I.join(this.pidDir,`${e}-daemon.pid`),n=I.join(this.pidDir,`${e}-watcher.pid`);let s=null,o=null;if(A.existsSync(r)){const e=A.readFileSync(r,"utf8").trim();e&&(s=parseInt(e))}if(A.existsSync(n)){const e=A.readFileSync(n,"utf8").trim();e&&(o=parseInt(e))}if(t)t.server&&t.server.close&&t.server.close(),this.runningServices.delete(e);else if(o&&this.isProcessRunning(o))try{process.kill(o,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(o)&&process.kill(o,"SIGKILL");try{A.existsSync(n)&&A.unlinkSync(n),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}},5e3)}catch(e){if(s&&this.isProcessRunning(s))try{process.kill(s,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(s)&&process.kill(s,"SIGKILL")},5e3)}catch(e){}try{A.existsSync(n)&&A.unlinkSync(n),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}}else if(s&&this.isProcessRunning(s))try{process.kill(s,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(s)&&process.kill(s,"SIGKILL")},5e3),A.existsSync(r)&&A.unlinkSync(r)}catch(e){}else{if(!a||!this.isProcessRunning(a))throw new Error(`Service '${e}' is not running.`);try{process.kill(a,"SIGTERM"),setTimeout(()=>{this.isProcessRunning(a)&&process.kill(a,"SIGKILL")},5e3)}catch(e){}}this.removePidFile(e),this.logger.info(`SSH service '${e}' 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(e){if(this.runningServices.has(e))return"running";try{this.configManager.loadServiceConfig(e);const t=I.join(this.pidDir,`${e}-daemon.pid`);if(A.existsSync(t)){const e=A.readFileSync(t,"utf8").trim();if(e){const a=parseInt(e);if(this.isProcessRunning(a))return"running";A.unlinkSync(t)}}const a=this.readPidFile(e);return a&&this.isProcessRunning(a)?"running":(a&&this.removePidFile(e),"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 ha(`Enter password for keystore [${a}]`);try{const o=this.configManager.getKeystorePath();if(r=new Va.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 Ga(e.server_keys.private_key_path,e.server_keys.passphrase,n,s,o,e.keystore.path,i,c)}async showLogs(e,t=50,a=!1){const r=process.env.HOME+"/.wative/logs";let n;if(n=e?I.join(r,`${e}.log`):I.join(r,"service_manager.log"),!A.existsSync(n))throw new Error(`Log file not found: ${n}`);const s=a?["-f",`-n${t}`,n]:[`-n${t}`,n],o=p.spawn("tail",s,{stdio:["ignore","inherit","inherit"]});return a?(process.on("SIGINT",()=>{o.kill("SIGTERM"),process.exit(0)}),new Promise((e,t)=>{o.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})):new Promise((e,t)=>{o.on("close",a=>{0===a?e():t(new Error(`tail process exited with code ${a}`))})})}setupLogger(){const e=process.env.HOME+"/.wative/logs";A.existsSync(e)||A.mkdirSync(e,{recursive:!0}),L.configure({appenders:{file:{type:"file",filename:I.join(e,"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=L.getLogger("service_manager"),this.logger.level="info"}setupServiceLogger(e){const t=process.env.HOME+"/.wative/logs";A.existsSync(t)||A.mkdirSync(t,{recursive:!0});const a=I.join(t,`${e}.log`);this.cleanupOldLogs(t),L.configure({appenders:{file:{type:"file",filename:I.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"},[`${e}_file`]:{type:"file",filename:a,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"},[e]:{appenders:[`${e}_file`],level:"info"}}})}cleanupOldLogs(e){try{const t=A.readdirSync(e),a=new Date;a.setDate(a.getDate()-3),t.forEach(t=>{const r=I.join(e,t);A.statSync(r).mtime<a&&t.endsWith(".log")&&(A.unlinkSync(r),this.logger.info(`Deleted old log file: ${t}`))})}catch(e){this.logger.warn(`Failed to cleanup old logs: ${e}`)}}}class Qa{constructor(e){this.config=e}async executeCommand(e){return this.config.useRemoteServer?this.executeCommandThroughRemoteServer(e):new Promise((a,r)=>{const n=new g.Client;n.on("ready",()=>{n.exec(e,(e,t)=>{if(e)return n.end(),r(e);let s="",o="";t.on("close",(e,t)=>{n.end(),0===e?a(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:t.readFileSync(s.privateKeyPath),passphrase:s.passphrase};n.connect(o)})}async executeCommandThroughRemoteServer(e){return new Promise((a,r)=>{const n=new g.Client;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 g.Client;i.on("ready",()=>{i.exec(e,(e,t)=>{if(e)return i.end(),n.end(),r(e);let s="",o="";t.on("close",(e,t)=>{i.end(),n.end(),0===e?a(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:t.readFileSync(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:t.readFileSync(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 Ya=async e=>{const t=new Xa;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)}},er=process.argv.slice(2),tr=er.includes("--daemon"),ar=er.indexOf("--config"),rr=-1!==ar&&er[ar+1]?er[ar+1]:void 0;(tr||rr)&&Ya(rr).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 nr=Object.freeze({__proto__:null,mainWithConfig:Ya,WativeSSHClient:Qa,createWativeSSHClient:function(e){return new Qa(e)},WativeWielderServer:Ga,SSHConfigManager:ja,checkFileExistence:Oa,sleep:function(e=0){return new Promise((t,a)=>{setTimeout(()=>{t(!0)},e)})},getAndGenerateConfig:async e=>{const t="/etc/wative";A.existsSync(t)||A.mkdirSync(t),await(async()=>{const e="/etc/wative",t=I.join(e,"id_rsa_server.pub"),a=I.join(e,"id_rsa_server");A.existsSync(t)&&A.existsSync(a)||(console.log("Generating SSH key pair..."),p.execSync(`ssh-keygen -t rsa -f ${a} -N 'wative_server'`,{stdio:"inherit"}));const r=I.join(e,"id_rsa_detake.pub"),n=I.join(e,"id_rsa_detake");A.existsSync(r)&&A.existsSync(n)||(console.log("Generating SSH key pair..."),p.execSync(`ssh-keygen -t rsa -f ${n} -N 'wative_detake'`,{stdio:"inherit"}))})();const a=I.join(t,"config.ini");if(!A.existsSync(a)){const t=Me(e).accounts,r={keystore:{path:e,allowed_keystores:da(t)},ssh:{listen:"127.0.0.1",port:5678,log:{size:10485760,backups:3}}};let n=E.stringify(r);A.writeFileSync(a,n)}return E.parse(A.readFileSync(a,"utf-8"))}});const sr=new _.Command,or=require("../package.json");let ir;sr.version(or.version).description("Wative CLI Tool"),sr.command("version").description("Show the version of wative").action(()=>{console.log(`Wative CLI Tool v${or.version}`)});const cr=()=>{if(!ir){const e=I.join(process.env.HOME||"",".wative","ssh");ir=new Xa(e)}return ir},lr=sr.command("ssh").description("Manage SSH services");lr.command("start").description("Start SSH service").option("-c, --config <name>","Specify service configuration name").option("-d, --daemon","Run service in daemon mode").action(async e=>{const t=cr();try{e.config||(console.error("Error: Configuration name is required. Use -c or --config to specify a service configuration."),process.exit(1));const a=e.config,r=t.getServiceConfig(a),n=require("net"),s=async(e,t="127.0.0.1")=>new Promise(a=>{const r=n.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 s(r.ssh.port,r.ssh.listen)){const e=`Port ${r.ssh.port} on ${r.ssh.listen} is already in use. Cannot start SSH service '${a}'.`;console.error(`Error: ${e}`),process.exit(1)}if(console.log(`Port ${r.ssh.port} on ${r.ssh.listen} is available for service '${a}'`),e.daemon){console.log(`Starting SSH service '${a}' in daemon mode...`);const e=await t.promptForPasswords(r.keystore.allowed_keystores),n=require("crypto"),s=n.randomBytes(32),o=n.randomBytes(16),i=n.createCipheriv("aes-256-cbc",s,o);let c=i.update(JSON.stringify(e),"utf8","hex");c+=i.final("hex");const l=o.toString("hex")+":"+s.toString("hex")+":"+c;return void((e,t)=>{const a=I.join(process.env.HOME||"",".wative","logs"),r=I.join(process.env.HOME||"",".wative","ssh","pids");A.existsSync(a)||A.mkdirSync(a,{recursive:!0}),A.existsSync(r)||A.mkdirSync(r,{recursive:!0});const n=I.join(a,`${e}-daemon.log`),s=I.join(r,`${e}-daemon.pid`),o=I.join(r,`${e}-watcher.pid`),i=p.spawn("node",[I.resolve(__dirname,"daemon-watcher.js"),e,n,s,o,I.resolve(__dirname,"..")],{detached:!0,stdio:"ignore",env:{...process.env,WATIVE_ENCRYPTED_PASSWORDS:t}});A.writeFileSync(o,i.pid.toString()),i.unref(),console.log(`SSH service '${e}' daemon watcher started with PID: ${i.pid}`),console.log(`Daemon log file: ${n}`),console.log(`Watcher PID file: ${o}`)})(a,l)}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 r=t.split(":"),n=Buffer.from(r[0],"hex"),s=Buffer.from(r[1],"hex"),o=r[2],i=e.createDecipheriv("aes-256-cbc",s,n);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 '${a}'...`);const u=cr();await u.startService(a,l);for(const e in l)l[e]=null,delete l[e];console.log(`[${(new Date).toISOString()}] SSH service '${a}' started successfully`);const d=async e=>{console.log(`[${(new Date).toISOString()}] Worker received ${e}, stopping service...`);try{await u.stopService(a),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(a);"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),g=setInterval(()=>{},6e4),h=()=>{clearInterval(p),clearInterval(g)};process.on("exit",h)}catch(e){console.error(`[${(new Date).toISOString()}] Worker process error:`,e),process.exit(1)}return}{await t.startService(a),console.log(`SSH service '${a}' started successfully`),process.on("SIGINT",async()=>{console.log("\nReceived SIGINT, stopping services..."),await t.stopAllServices(),process.exit(0)}),process.on("SIGTERM",async()=>{console.log("\nReceived SIGTERM, stopping services..."),await t.stopAllServices(),process.exit(0)});const e=setInterval(()=>{"running"!==t.getServiceStatus(a)&&(console.log(`Service ${a} 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)}}),lr.command("stop").description("Stop SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=cr();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)}}),lr.command("restart").description("Restart SSH service").option("-c, --config <name>","Specify service configuration name").action(async e=>{const t=cr();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)}}),lr.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 ja(r,o);let c,l,u,d;for(;;)if(c=await n("Enter service name: "),c=ua(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=ua(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 g=a.join(p,`${d}.pub`);for(console.log("\nPlease place the remote client's public key file at the following path:"),console.log(`${g}`),console.log("\nPress Enter to continue after placing the file...");;){if(await n(""),t.existsSync(g)){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 h=await n("Enter service description (optional): ");console.log("\nCreating SSH service configuration...");const m=await i.createServiceConfig(c,l,u,d,h||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: ${g}`)}catch(e){console.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}finally{r.close()}}),lr.command("remove").description("Remove SSH service configuration").option("-c, --config <name>","Service configuration name").action(async e=>{const t=cr();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)}}),lr.command("list").description("List all SSH service configurations").action(async()=>{const e=new ja,t=new Xa,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.")}),lr.command("status").description("Show SSH service status").option("-c, --config <name>","Service configuration name").action(async e=>{const t=cr();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)}}),lr.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=cr();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)}}),sr.command("cmd").description("Start wallet-cli shell").action(async()=>{try{p.execSync("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")))&&sr.parse(process.argv);const{WativeCore:ur}=require("wative-core"),dr=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:",dr.version),aa();const e=await ra();await rt(e),Ca(e);const t=I.resolve(e,"network.json"),a=JSON.parse(A.readFileSync(t,"utf8"));let r=da(a.accounts);const n=new ur(e,r,null,!0);await Ta(e,n)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)}),e.DEFAULT_NETWORK=me,e.GasUtil=Ae,e.MNEMONIC_WORDS=he,e.SOLANA_CHAIN_IDS=fe,e.SSH=nr,e.accountBalanceLog=async(e,t,a,r)=>{let n;n="PK"===ze(a,e).account_type?vt(a,e,t):bt(a,e);const s=await xt(n,a,r);s.status,console.log(at.green(` Address No: #${t}\n Network: ${r}\n ${s.output}`))},e.accountIndexOrAddressValidator=Qt,e.accountSetting=tt,e.addAsset=Bt,e.addNetwork=it,e.addToken=Ot,e.addrValidator=Ht,e.batchGetKeystoreSlugByAccountName=da,e.batchGetTokenBalance=Ft,e.batchGetTokenBalanceViaMulticall=le,e.batchHasTokenBalance=ge,e.chainAddressValidator=Yt,e.checkFileExistence=Sa,e.chunkArray=(e,t)=>{let a=[];for(let r=0;r<e.length;r+=t)a.push(e.slice(r,r+t));return a},e.confirmSomething=ya,e.createNetwork=rt,e.deleteTokenBalance=pe,e.editorSomething=wa,e.enhancedBalanceDisplay=ht,e.excutePromiseFunction=ba,e.expandAmountValidator=Zt,e.formatAddr=_a,e.gasValidator=Wt,e.getAccountAddress=vt,e.getAccountBalance=xt,e.getAccountBalanceInEvm=X,e.getAccountBalanceInSolana=Q,e.getAccountChainType=ka,e.getAccountIndex=Ut,e.getAccountIndexByKeystoreSlug=zt,e.getAccountInfo=ze,e.getAccountInfoInSolana=ce,e.getAccountName=pa,e.getAccountNameByKeystoreSlug=la,e.getAccountRange=Mt,e.getAssetList=Nt,e.getAssetListByTokenName=It,e.getBatchAccountBalance=Lt,e.getChainId=na,e.getChainIdByEvm=Z,e.getChainType=we,e.getCodeInEvm=ne,e.getColor=ca,e.getDefaultNetworkByAddress=_t,e.getEvmNetworks=Pt,e.getKeystorePath=ra,e.getKeystoreSlugByAccountName=ua,e.getLatestBlockhash=ie,e.getMulticallAddress=oa,e.getNativeTokenDecimals=ye,e.getNetworkInfo=Me,e.getNetworkInfoByName=wt,e.getNetworkTypeByName=yt,e.getPKAccountAddress=bt,e.getPrioritizationFee=oe,e.getRpcUrl=sa,e.getShowTokenList=pt,e.getStatus=$t,e.getSymbol=ia,e.getTokenBalance=de,e.getTokenBalanceInEvm=ae,e.getTokenBalanceInSolana=re,e.getTokenInfoInEvm=ee,e.getTokenInfoInSolana=te,e.getTokenProgramId=Y,e.getTransferTokenData=se,e.hexValidator=va,e.importMaskedPassphrase=ma,e.inputMaskedPassword=ga,e.inputPassword=fa,e.inputPasswordWithoutValidator=ha,e.inputSomething=Dt,e.isEvmAddress=be,e.isSolanaAddress=ve,e.lastAccountNoValidator=Xt,e.listWithLazyBalanceLoading=Ia,e.loginIn=Je,e.numberValidator=Gt,e.passphraseValidator=Vt,e.program=sr,e.removeNetwork=ot,e.saveAccountInfo=Ue,e.saveAsset=jt,e.selectCheckboxSomething=ta,e.selectDefaultNetwork=ft,e.selectFlag=dt,e.selectOrEditNetwork=nt,e.selectSomething=ea,e.selectToolsOptions=Be,e.sendSolanaRawTransaction=Ce,e.showAllAccounts=kt,e.showAssets=Et,e.showAssetsDetail=Ct,e.showAvailableNetworks=ct,e.showDataview=lt,e.showIntroduction=aa,e.showNetwork=mt,e.showTokenList=gt,e.showTools=Ee,e.sleep=xa,e.switchNetworkByAccountName=St,e.switchPPNetwork=async(e,t,a)=>{const r=I.resolve(e,"network.json"),n=JSON.parse(A.readFileSync(r,"utf8")).networks,s=n.length;let o=ze(e,t),i=["> Back",new j.default.Separator("----------------------------------")],c=o.data[a].default_network;c&&""!==c?i.push("○ Same as the account setting"):i.push("● Same as the account setting");for(let e=0;e<s;e++){const t=n[e];let r;r=we(t.chainId.toString())?o.data[a].ciphertexts.solana.address:o.data[a].ciphertexts.evm.address,t.name===c?i.push(`● ${r} [${t.name}]`):i.push(`○ ${r} [${t.name}]`)}const l=await ea(i);if("> Back"===l)return;let u=i.indexOf(l);2===u?delete o.data[a].default_network:o.data[a].default_network=n[u-3].name,Ue(e,t,o);let d=o.default_network;"default_network"in o.data[a]&&""!==o.data[a].default_network&&(d=o.data[a].default_network);let p=wt(e,d);console.log(at.green(` Address No: #${a}\n Network: ${d}\n ${p.nativeCurrency.symbol} Balance: 0`))},e.tagValidator=Jt,e.updateBalance=ue,e.updateNetwork=st,e.updateStatus=ut,e.updateStorage=Ca,e.updateTokenBalanceOption=Tt,Object.defineProperty(e,"__esModule",{value:!0})});