wative 1.2.12 → 1.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,6 +15,8 @@ export declare class WativeWielderServer {
15
15
  private getRootAccount;
16
16
  private getChainType;
17
17
  private getSubAccount;
18
+ private getDisabledSlots;
19
+ private updateDisabledSlots;
18
20
  private signMessage;
19
21
  private signTypedData;
20
22
  private signSolanaTransaction;
@@ -1 +1 @@
1
- {"version":3,"file":"wative_server.d.ts","sourceRoot":"","sources":["../../src/ssh/wative_server.ts"],"names":[],"mappings":"AAuCA,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,mBAAmB,CAAkB;IAE7C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAW;gBAGjC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GAAG,SAAS,EAEnC,aAAa,EAAE,MAAM,EAAE,EACvB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAE9B,qBAAqB,EAAE,MAAM,EAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,EAAE;IA4ChB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;YAoE1B,WAAW;IA4FzB,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;YA6BP,WAAW;YAMX,aAAa;YAqBb,qBAAqB;YA2FrB,2BAA2B;YAW3B,oBAAoB;CAqCrC;AAED,eAAO,MAAM,KAAK,OAAQ,MAAM,qBAE/B,CAAA;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"wative_server.d.ts","sourceRoot":"","sources":["../../src/ssh/wative_server.ts"],"names":[],"mappings":"AAuCA,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,mBAAmB,CAAkB;IAE7C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAW;gBAGjC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GAAG,SAAS,EAEnC,aAAa,EAAE,MAAM,EAAE,EACvB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAE9B,qBAAqB,EAAE,MAAM,EAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,EAAE;IA4ChB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;YAoE1B,WAAW;IA4GzB,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;YA6BP,gBAAgB;YAQhB,mBAAmB;YASnB,WAAW;YAMX,aAAa;YAqBb,qBAAqB;YA2FrB,2BAA2B;YAW3B,oBAAoB;CAqCrC;AAED,eAAO,MAAM,KAAK,OAAQ,MAAM,qBAE/B,CAAA;AAED,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAgBA,QAAA,MAAQ,UAAU,KAA2B,CAAC;AAsK9C,eAAO,MAAM,wBAAwB,aAAoB,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,mBAAmB,MAAM,eAAe,iBAAiB,kBA8HrK,CAAA;AAyhBD,eAAO,MAAM,kBAAkB,kBAAyB,MAAM,iBAAiB,MAAM,mBAAmB,MAAM,eAAe,iBAAiB,kBA+B7I,CAAA;AAED,eAAO,MAAM,SAAS,kBAAyB,MAAM,eAAe,iBAAiB,kBA4DpF,CAAA"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAgBA,QAAA,MAAQ,UAAU,KAA2B,CAAC;AA2K9C,eAAO,MAAM,wBAAwB,aAAoB,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,mBAAmB,MAAM,eAAe,iBAAiB,kBA8HrK,CAAA;AAyhBD,eAAO,MAAM,kBAAkB,kBAAyB,MAAM,iBAAiB,MAAM,mBAAmB,MAAM,eAAe,iBAAiB,kBA+B7I,CAAA;AAED,eAAO,MAAM,SAAS,kBAAyB,MAAM,eAAe,iBAAiB,kBA4DpF,CAAA"}
@@ -1 +1 @@
1
- import*as e from"fs";import*as t from"path";import*as a from"figlet";import n from"inquirer";import r from"web3";import{Connection as o,PublicKey as s,Transaction as i,SystemProgram as l,ComputeBudgetProgram as c}from"@solana/web3.js";import{getMint as u,getTokenMetadata as d,getAssociatedTokenAddressSync as p,createAssociatedTokenAccountInstruction as m,createTransferInstruction as w}from"@solana/spl-token";import{Metaplex as g}from"@metaplex-foundation/js";import{BigNumber as h}from"bignumber.js";const f={},y=[{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"}],b=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],k=async e=>{let t=new r(e);return await Ft(t.eth.getChainId,[])},v=async(e,t)=>{const a=new r(t);return await Ft(a.eth.getBalance,[e])},S=async(e,t)=>{const a=new o(t);return await Ft(a.getBalance.bind(a),[new s(e)])},x=async(e,t)=>{const a=new o(t),n=new s(e);let r=await Ft(a.getAccountInfo.bind(a),[n]);if(!r.status)return{status:!1,output:"Failed to get mint account info"};const i=r.output;if(!i)return{status:!1,output:"Mint account not found"};return{status:!0,output:i.owner.toBase58()}},$=async(e,t)=>{const a=new(new r(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 n=await Ft(a.methods.symbol().call.bind(a),[]),o=await Ft(a.methods.name().call.bind(a),[]),s=await Ft(a.methods.decimals().call.bind(a),[]);return n.status&&o.status&&s.status?{status:!0,output:{symbol:n.output,name:o.output,decimals:s.output}}:{status:!1,output:"Failed to get token info"}},N=async(e,t)=>{let a=await x(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const n=a.output,r=new o(t),i=g.make(r),l=new s(e);let c=await Ft(u,[r,l,"finalized",new s(n)]),p={status:!0,output:{symbol:"",name:"",decimals:""}};if(!c.status)return{status:!1,output:"Failed to get token decimals"};p.output.decimals=c.output.decimals;try{const e=i.nfts().pdas().metadata({mint:l});if(await r.getAccountInfo(e)){const e=await i.nfts().findByMint({mintAddress:l});p.output.name=e.name,p.output.symbol=e.symbol}else try{const e=await d(r,l);e&&(e.name&&(p.output.name=e.name),e.symbol&&(p.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return p},O=async(e,t,a)=>{const n=new(new r(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let o=await Ft(n.methods.balanceOf(e).call.bind(n),[]);return o.status?{status:!0,output:o.output}:{status:!1,output:"Failed to get token balance"}},A=async(e,t,a)=>{let n=await x(t,a);if(!n.status)return{status:!1,output:"Failed to get token program id"};const r=n.output,i=new o(a),l=p(new s(t),new s(e),!1,new s(r));let c=await Ft(i.getTokenAccountBalance.bind(i),[l]);return c.status?{status:!0,output:c.output.value.amount}:c.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},F=async e=>{const t=new o(e);let a=await Ft(t.getRecentPrioritizationFees.bind(t),[]);if(!a.status)return{status:!1,output:"Failed to get recent prioritization fees"};const n=a.output.map(e=>e.prioritizationFee).sort();return{status:!0,output:n.length>0?Math.ceil(n.reduce((e,t)=>e+t)/n.length):1e3}},P=async(e,t)=>{const a=new o(t);let n=await Ft(a.getAccountInfo.bind(a),[new s(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},_=async(e,t,a,n,o,s)=>{let i;if(e=e.filter(e=>e&&e.length>30),a in f?i=f[a][t]||{}:(f[a]={},i={}),s&&s.length>0&&o){let a=await(async(e,t,a,n)=>{let o=[];try{let s=[];const i=new r(a),l=new i.eth.Contract(y,n);for(const a of e)if("0"===t){const e=l.methods.getEthBalance(a).encodeABI();s.push({target:n,callData:e})}else{const e=new i.eth.Contract(b,t).methods.balanceOf(a).encodeABI();s.push({target:t,callData:e})}const{returnData:c}=await l.methods.aggregate(s).call();for(let e=0;e<c.length;e++){const t=i.eth.abi.decodeParameter("uint256",c[e]);o.push(t)}}catch(e){console.log("Multicall aggregate failed")}return o})(e,t,n,s);if(e.length===a.length)for(let t=0;t<e.length;t++)i[e[t]]=a[t]}else for(const a of e)if(a&&!(a in i)){let e;e="0"===t?o?await v(a,n):await S(a,n):o?await O(a,t,n):await A(a,t,n),e.status&&(i[a]=e.output),await Tt(200)}return f[a][t]=i,f},T=(e,t,a)=>{for(let n=0;n<t.length;n++){let r=t[n];for(let t=0;t<a.length;t++){let n=a[t];try{delete f[e][n][r]}catch(e){}}}},I=(e,t)=>{let a=0;if(e in f&&"0"in f[e])for(let n=0;n<t.length;n++)t[n]in f[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},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"],C=[{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}}],L=["901","902","903"],j=e=>L.includes(e)?9:18,R=e=>L.includes(e)?"solana":"evm",{BN:z}=require("bn.js"),{stripHexPrefix:J}=require("ethereumjs-util"),{BigNumber:U}=require("bignumber.js");function q(e){return new z(J(e.toString("hex")),16)}const E=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function D(e){return E(e.toString(16))}class M{constructor(e){this.query=new r(r.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=D(function(e,t,a){const n=new z(t),r=new z(a);return e.mul(n).div(r)}(q(t.gasLimit),19,20));try{n=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:n,simulationFails:a}}async estimateTxGas(e){let t=await this.query.estimateGas(e);return t=new U(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=q(e),r=q(t).muln(.9),o=n.muln(a);return n.gt(r)?D(n):o.lt(r)?D(o):D(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(E(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const G=require("chalk");require("wative-core");const K=async e=>{let t=[new n.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 n.Separator("——————————————-"),"Send it now","Back"],a=await ut(t),r=t.indexOf(a);return 1===r&&(e.from=await Xe("from",ct)),2===r&&(e.to=await Xe("to",ct)),3===r&&(e.nonce=await Xe("nonce")),4===r&&(e.gasPrice=await Xe("gasPrice")),5===r&&(e.data=await Ot("data")),6===r&&(e.value=await Xe("value")),7===r&&(e.gas=await Xe("gas")),9===r?e:10===r?null:await K(e)},W=async(e,t,a,n,o)=>{const s=await Xe("to",ct),i=new M(t),l=await i.getGasPrice(),c=new h(l.toString()).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR),u=await Xe(`Gas price (${c}), agree or enter`,rt);let d=u||c;d=new h(d).multipliedBy(1e9).toFixed(0);let p,m,w,g=await(async(e,t)=>{const a=new r(t);let n=await Ft(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(s,t);if(!g.status)return void console.log(G.red(g.output));if(p="42161"===e||"421614"===e?"1700000":"21000","0x"===g.output){m="0x";let e=await v(n,t);if(!e.status)return void console.log(G.red(e.output));let r=new h(e.output),o=new h(d),s=r.minus(o.multipliedBy(Number(p))).toFixed(0,h.ROUND_FLOOR),i=new h(s).dividedBy(1e18).toFixed(4,h.ROUND_FLOOR);if(new h(i)<new h(0))return void console.log(G.red("Not enough balance"));w=await Z(i,s,a,18)}else m=await Ot("data",At),w=await Xe("value",nt);const f=await i.getTransactionCount(n),y=await Xe(`Nonce (${f}), agree or enter`);let b={from:n,to:s,nonce:y||f.toString(),gasPrice:d,data:m,value:w};if("0x"===m)b.gas=p;else{let e=b.gasPrice;delete b.gasPrice;try{b.gas=(await i.estimateTxGas(b)).toString()}catch(e){return void console.log(G.red("Error: "+e))}b.gasPrice=e}if(b=await K(b),!b)return;const k=await o.account.signTransaction(n,b,t);k.status?(console.log(G.green(`Transaction hash: ${k.output.transactionHash}`)),o.account.sendSignedTransaction(n,k.output.rawTransaction,t),T(e,[n,s],["0"])):console.log(G.red(k.output))},H=async(e,t,a,n,r)=>{const u=await Xe("to",ct);let d=(new i).add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:1e6}));d.add(c.setComputeUnitLimit({units:2e5})),d.add(c.setComputeUnitPrice({microLamports:1e3})),d.feePayer=new s(n);let p=await(async e=>{const t=new o(e);let a=await Ft(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}})(t);if(!p.status)return void console.log(G.red(p.output));d.recentBlockhash=p.output.blockhash;const m=await r.account.simulateTransaction(n,t,d);if(!m.status)return void console.log(G.red(m.output));if(!m.output||!m.output.value||0===m.output.value.unitsConsumed||m.output.value.err)return console.log(G.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(m.output,null,4)),void console.log("==============================================");let w=new h(m.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,h.ROUND_CEIL),g=new h(w);const f=await F(t);if(!f.status)return void console.log(G.red(f.output));const y=new h(f.output.toString()),b=g.multipliedBy(y).dividedBy(1e6).toFixed(0,h.ROUND_CEIL),k=await S(n,t);if(!k.status)return void console.log(G.red(k.output));const v=new h(k.output).minus(5e3).minus(b);let x=new h(v).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR);if(new h(x)<new h(0))return void console.log(G.red("Not enough balance"));let $=await Z(x,v.toString(),a,9),N=new i;N.add(c.setComputeUnitLimit({units:Number(g)})),N.add(c.setComputeUnitPrice({microLamports:Number(y)})),N.add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:Number($)})),N.feePayer=new s(n),N.recentBlockhash=p.output.blockhash;const O=await r.account.signTransaction(n,N,t);if(!O.status)return void console.log(G.red(O.output));let A=await r.account.sendSignedTransaction(n,O.output,t);A.status?(T(e,[n,u],["0"]),console.log(G.green(`Transaction hash: ${A.output}`))):console.log(G.red(A.output))},Z=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await ut(r),s=r.indexOf(o),i="0";if(0===s){let e=await Xe("value",nt);i=new h(e).multipliedBy(10**n).toFixed(0,h.ROUND_FLOOR)}else 1===s&&(i=t);return new h(i).isLessThanOrEqualTo(new h(t))?i:(console.log(G.red("Not enough balance")),Z(e,t,a,n))},V=async(e,t,a,n,o)=>{let s,i,l;switch(await ut(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":l=await Xe("token ticker");let r=await Ee(e,a,l);if(0===r.length)return void console.log(G.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await O(n,r[e].address,t);if(!a.status)return void console.log(G.red(a.output));let s=new h(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,h.ROUND_FLOOR);if(1===r.length){o.push(`> 1. ${l} Balance: ${s}`);break}o.push(`> ${e+1}. ${l} Balance: ${s}(${r[e].address})`),o.push(r[e].address)}let c=await ut(o);const u=r[o.indexOf(c)];s=u.address,i=Number(u.decimals);break;case"> Input token contract address":s=await Xe("token contract address",ct);let d=await $(s,t);if(!d.status)return void console.log(G.red(d.output));i=Number(d.output.decimals),l=d.output.name}const c=await Xe("Receipt",ct),u=await O(n,s,t);if(!u.status)return void console.log(G.red(u.output));const d=new M(t),p=await d.getGasPrice(),m=new h(p.toString()).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR),w=await Xe(`Gas price (${m}), agree or enter`,rt);let g=w||m;g=new h(g).multipliedBy(1e9).toFixed(0);let f=await X(u.output,l,i);const y=await(async(e,t,a)=>new r(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]))(c,f,t),b=await d.getTransactionCount(n),k=await Xe(`Nonce (${b}), agree or enter`);let v={from:n,to:s,nonce:k||b.toString(),gasPrice:g,data:y,value:"0"};if("0x"===y)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(G.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await K(v),!v)return;const S=await o.account.signTransaction(n,v,t);S.status?(console.log(G.green(`Transaction hash: ${S.output.transactionHash}`)),o.account.sendSignedTransaction(n,S.output.rawTransaction,t),T(a,[n,c],["0",s])):console.log(G.red(S.output))},X=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new h(e).dividedBy(10**a).toFixed(4,h.ROUND_FLOOR)} ${t})`],r=await ut(n),o=n.indexOf(r),s="0";if(0===o){let e=await Xe("amount",nt);s=new h(e).multipliedBy(10**a).toFixed(0,h.ROUND_FLOOR)}else 1===o&&(s=e);return new h(s).isLessThanOrEqualTo(new h(e))?s:(console.log(G.red("Not enough balance")),X(e,t,a))},Q=async(e,t,a,r)=>{let o=Re(e,t,a),l=Te(e,o),u=Pt(a);if(l!==u&&("evm"===u&&(o="Ethereum Mainnet"),"solana"===u&&(o="Solana Mainnet"),l=Te(e,o)),"evm"===l){if(await Nt(`Network (${o}), want a change?`,!1)){const t=ze(e);o=await ut(t,"Select a network")}}let d=await je(a,e,o);if(!d.status)return void console.log(G.red(d.output));const g=Ie(e,o);console.log(G.green(` ${g.nativeCurrency.symbol} Balance: ${d.output}`));const f=["> Send Raw Tx","> Send Token",new n.Separator("----------------------------------"),"> Back"];switch(await ut(f)){case"> Send Raw Tx":"evm"===u&&await W(g.chainId.toString(),g.rpcUrl,g.nativeCurrency.symbol,a,r),"solana"===u&&await H(g.chainId.toString(),g.rpcUrl,g.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===u&&await V(e,g.rpcUrl,g.chainId.toString(),a,r),"solana"===u&&await(async(e,t,a,n,r)=>{let o,l,u;switch(await ut(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Xe("token ticker");let r=await Ee(e,a,u);if(0===r.length)return void console.log(G.red("Token not found"));let s=[];for(let e=0;e<r.length;e++){const a=await A(n,r[e].address,t);if(!a.status)return void console.log(G.red(a.output));let o=new h(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,h.ROUND_FLOOR);if(1===r.length){s.push(`> 1. ${u} Balance: ${o}`);break}s.push(`> ${e+1}. ${u} Balance: ${o}(${r[e].address})`),s.push(r[e].address)}let i=await ut(s);const c=r[s.indexOf(i)];o=c.address,l=Number(c.decimals);break;case"> Input token contract address":o=await Xe("token contract address",ct);let d=await N(o,t);if(!d.status)return void console.log(G.red(d.output));l=Number(d.output.decimals),u=d.output.name}const d=await Xe("Receipt",ct),g=await A(n,o,t);if(!g.status)return void console.log(G.red(g.output));let f=await X(g.output,u,l),y=await x(o,t);if(!y.status)return void console.log(G.red(y.output));const b=new s(y.output);let k=p(new s(o),new s(n),!0,b);const v=await P(k.toString(),t);if(!v.status)return void console.log(G.red(v.output));if(!v.output||v.output.owner.toString()===s.default)return void console.log(G.red("From token account not found"));let S=p(new s(o),new s(d),!1,b);const $=await P(S.toString(),t);if(!$.status)return void console.log(G.red($.output));let O=new i,_=new i;$.output&&$.output.owner.toString()!==s.default||(O.add(m(new s(n),new s(S),new s(d),new s(o),b)),_.add(m(new s(n),new s(S),new s(d),new s(o),b))),O.add(w(k,S,new s(n),Number(f),[],b)),O.add(c.setComputeUnitLimit({units:2e5})),O.add(c.setComputeUnitPrice({microLamports:1e3})),O.feePayer=new s(n);const I=await r.account.simulateTransaction(n,t,O);if(!I.status)return void console.log(G.red(I.output));if(!I.output||!I.output.value||0===I.output.value.unitsConsumed||I.output.value.err)return console.log(G.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(I.output,null,4)),void console.log("==============================================");let B=new h(I.output.value.unitsConsumed.toString());B=new h(Math.ceil(1.2*Number(B)));const C=await F(t);if(!C.status)return void console.log(G.red(C.output));const L=new h(C.output.toString());_.add(w(k,S,new s(n),Number(f),[],b)),_.add(c.setComputeUnitLimit({units:Number(B)})),_.add(c.setComputeUnitPrice({microLamports:Number(L)})),O.feePayer=new s(n);const j=await r.account.signTransaction(n,_,t);if(!j.status)return void console.log(G.red(j.output));let R=await r.account.sendSignedTransaction(n,j.output,t);R.status?(T(a,[n,d],["0",o]),console.log(G.green(`Transaction hash: ${R.output}`))):console.log(G.red(R.output))})(e,g.rpcUrl,g.chainId.toString(),a,r);break;case"> Back":return}},Y=async(e,t,a,r)=>{const o=["> SendTx","> SignMessage",new n.Separator("----------------------------------"),"> Back"];switch(await ut(o)){case"> SendTx":await Q(e,t,a,r);break;case"> SignMessage":{const e=await Ot("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(G.red(t.output));break}console.log(G.green("Signature: "+t.output));break}case"> Back":return}await Y(e,t,a,r)},ee=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new n.Separator("----------------------------------"),"> Back"],o=await ut(r);if("> Back"===o)return;"> Send Tx"===o&&(a=await Xe("Input address to send tx",ct)),"> Search Accounts"===o&&(a=await Xe("Input part address to send tx",at));let s=t.account.getAccountLabel(a);if(null===s)return console.log(G.red("Account not found")),void await ee(e,t);let i=s.account_label,l=ft(e,i);if(a=s.account_address,null===i)return console.log(G.red("Account not found")),void await ee(e,t);const c=await Ye(e,i,a);if(null===c)return console.log(G.red("Account not found")),void await ee(e,t);console.log(G.green(`Address found!\n address: ${a}\n account name: [${l}]\n account index: #${c}`)),(await ue(e,i,t)).isLoginIn?(await Y(e,i,a,t),await ee(e,t)):await ee(e,t)},te=require("chalk");require("dotenv").config();const ae=require("cli-progress");require("wative-core");const ne={keystore_slug:"",default_account_index:0},re=async e=>{const t=ie(e);let a=[];t.accounts&&(a=t.accounts);let n=await kt("Account Name",a);return null===n?null:{account_name:n,password:await $t(`Please set a password for Account [${n}]`),selected_default_network:await _e(e)}},oe=async(a,n,r,o,s,i,l)=>{let c=await Ie(a,s);"evm"!==R(c.chainId.toString())||o.startsWith("0x")||(o="0x"+o);let u=await i.account.generatePKAccount(r,o,n,c.chainId.toString(),l);if(!u.status)return void console.log(te.red(u.output));let d,p=t.join(a,`accounts/${r}.json`);if(e.existsSync(p)){let t=JSON.parse(e.readFileSync(p,"utf8"));if("data"in t){if(t.data.map(e=>e.ciphertexts.address).includes(u.output.ciphertexts.address))return void console.log(te.red("The account has already been imported"));t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else t.data=[{ciphertexts:t.ciphertexts}],delete t.ciphertexts,t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else u.output.data=[{ciphertexts:u.output.ciphertexts}],delete u.output.ciphertexts,u.output.default_network=s,d=u.output;e.writeFileSync(p,JSON.stringify(d,null,4)),i.account.reloadAccount()},se=async(a,r)=>{const o=["> Import Passphrase","> Import Private Key",new n.Separator("----------------------------------"),"> Back"];switch(await ut(o)){case"> Import Passphrase":await(async(a,n)=>{let r=await re(a);if(!r)return;let o=await xt("Please enter a mnemonic [split by space]",ot);o=o.replace(/\s+/g," ");let s=yt(r.account_name);const i=n.account.generatePPAccount(s,o,r.password);if(!i.status)return void console.log(te.red(i.output));let l=t.join(a,`accounts/${s}.json`);i.output.default_network=r.selected_default_network,e.writeFileSync(l,JSON.stringify(i.output,null,4));const c=t.resolve(a,"network.json"),u=JSON.parse(e.readFileSync(c,"utf8"));u.accounts.push(r.account_name),e.writeFileSync(c,JSON.stringify(u,null,4))})(a,r);break;case"> Import Private Key":await(async(a,n)=>{let r=await re(a);if(!r)return;let o=await vt("Please enter a private key"),s=yt(r.account_name);await oe(a,r.password,s,o,r.selected_default_network,n,!0);const i=t.resolve(a,"network.json"),l=JSON.parse(e.readFileSync(i,"utf8"));l.accounts.push(r.account_name),e.writeFileSync(i,JSON.stringify(l,null,4))})(a,r);break;case"> Back":return}r.account.reloadAccount()},ie=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8"))},le=(a,n)=>{const r=t.join(a,`accounts/${n}.json`);return JSON.parse(e.readFileSync(r,"utf8"))},ce=(a,n,r)=>{const o=t.join(a,`accounts/${n}.json`);e.writeFileSync(o,JSON.stringify(r,null,4))},ue=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=ft(e,t),o="WATIVE_PASSWD_"+t;if(n=process.env[o]&&""!==process.env[o]?process.env[o]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await St(`Please input the password for Account [${r}]`),!n)return console.log(te.red("Password can't be empty")),{isLoginIn:!1};const s=await a.account.login(t,n);if(s.status)return{isLoginIn:!0,password:n};const i=["> Try Again","> Back"],l=await ut(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},de=async(e,t)=>{const a=ie(e).accounts;let r=["> Back",new n.Separator("----------------------------------")];const o=a.length;if(0===o)return void console.log(te.red("No address here yet"));for(let t=0;t<o;t++){const n=a[t],o=yt(n),s=le(e,o);"data"in s?r.push(`${t+1}) ${n} [${s.account_type}:${s.data.length}]`):r.push(`${t+1}) ${n} [${s.account_type}:1]`)}const s=await ut(r,"Select an account");if("> Back"===s)return;const i=a[r.indexOf(s)-2],l=yt(i);console.log(te.green(`Keystore slug: [${l}]`));let c=await ue(e,l,t);c.isLoginIn&&await me(e,l,t,c.password),await de(e,t)},pe=async(e,t,a)=>{const r=await le(e,t);let o=["> Disabled Slots","> Add Single","> Add Range",new n.Separator("----------------------------------"),"> Back"];switch(await ut(o)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(te.red("No disabled slots here yet"));break}let o=r.data,s=["> Back",new n.Separator("----------------------------------")],i=r.default_network;for(let t=0;t<a.length;t++){let n=a[t].from,r=a[t].to,l=i,c=i;"default_network"in o[n]&&(l=o[n].default_network),"default_network"in o[r]&&(c=o[r].default_network);let u,d,p=Te(e,l),m=Te(e,c);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==m&&"solana"!==m)throw new Error(`Invalid network type: ${m}`);u="evm"===p?o[n].ciphertexts.evm.address:o[r].ciphertexts.solana.address,d="evm"===m?o[r].ciphertexts.evm.address:o[r].ciphertexts.solana.address,n===r?s.push(`${t+1}. ${u}[${n}]`):s.push(`${t+1}. ${u}[${n}]-${d}[${r}]`)}let l=await ut(s);if("> Back"===l)break;if(!await Nt(`Are you sure to delete the ${l}?`,!0))break;let c=s.indexOf(l)-2;r.disabled_slots.splice(c,1),ce(e,t,r);break}case"> Add Single":{let a=await et(r,"Input address or index");if(null===a){console.log(te.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],ce(e,t,r);break}case"> Add Range":{let a=await Qe(r);if(!a){console.log(te.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],ce(e,t,r);break}}await pe(e,t)},me=async(a,r,o,s)=>{let i,l=await le(a,r);i="PP"===l.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${l.default_network}]`,"> Remove",new n.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${l.default_network}]`,"> Remove",new n.Separator("----------------------------------"),"> Back"];switch(await ut(i)){case"> Address List":await we(a,r,o);break;case"> Expand Address":{const e=await Xe("Expand accounts count",st);if(Number(e)>2e3){console.log(te.red("Too many accounts, please input less than 2000"));break}await he(a,r,Number(e),o);break}case"> Import Private Key":await(async(a,n,r,o)=>{let s=await Xe("Please enter a private key"),i=t.join(a,`accounts/${r}.json`),l=JSON.parse(e.readFileSync(i,"utf8"));await oe(a,n,r,s,l.default_network,o,!1)})(a,s,r,o);break;case"> Slice Address":{const e=await Xe("Please input last account number",it);await fe(a,r,Number(e),o);break}case"> Remove Address":await ye(a,r,o);break;case"> Disable Address":await pe(a,r);break;case"> Reset Account Password":{let e=ft(a,r);const t=await $t(`Please input new password for Account [${e}]`),n=await $t(`Please confirm new password for Account [${e}]`);if(!t||!n||t!==n){console.log(te.red("Passwords do not match"));break}return void await o.account.resetPassword(r,t)}case`> Switch Networks [${l.default_network}]`:await Le(a,r,!0);break;case"> Remove":return void await be(a,r);case"> Back":return}await me(a,r,o,s)},we=async(e,t,a)=>{const r=await le(e,t);let o=["> Back",new n.Separator("----------------------------------")],s=r.disabled_slots,i=Je(e),l=r.default_network,c=Ie(e,l),u=R(c.chainId.toString()),d=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,l=r.data[e].tag?`(${r.data[e].tag})`:"",c=a.account.checkIsDisableAddress(s,e);t="PP"===r.account_type?"evm"===u?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,c?o.push(new n.Separator(te.yellow(`#${e.toString().padEnd(d)} ${It(t,i.fullAddr)} ${l}`))):o.push(`#${e.toString().padEnd(d)} ${It(t,i.fullAddr)} ${l}`)}let p,m=ne.keystore_slug===t?o[ne.account_index]:o[0],w=ne.keystore_slug===t&&ne.account_index>0,g=await qe(e,c.chainId.toString());if(w&&ne.account_index>15){let e=o.slice(0,ne.account_index-15);p=o.slice(ne.account_index-15).concat(e)}else p=o.slice(0);let h=await Rt(p,"evm"===u,e,g,c,i.gasToken,i.extendedToken,w,"Select an account",m);"> Back"!==h&&(ne.keystore_slug=t,ne.account_index=o.indexOf(h),await ge(e,t,o.indexOf(h)-2,a),await we(e,t,a))},ge=async(e,t,a,r)=>{const o=await le(e,t);let s=o.default_network,i=Be(e,t,a);const l=await Ie(e,s),c=await je(i,e,s);c.status?console.log(te.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(te.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol}`));let u="> Tag";"tag"in o.data[a]&&""!==o.data[a].tag&&(u=`> Tag(${o.data[a].tag})`);let d=["> Tools","> Show address","> Assets",u,"> Reload balances","> Dump private key",new n.Separator("----------------------------------"),"> Back"];switch(await ut(d)){case"> Tools":await Y(e,t,i,r);break;case"> Show address":await Ce(e,t,a);break;case"> Assets":await De(e,s,i);break;case"> Reload balances":await Me(e,s,i);break;case u:{let n="Current tag";"tag"in o.data[a]&&""!==o.data[a].tag&&(n=`Current tag (${o.data[a].tag})`);let r=await Xe(n,tt);o.data[a].tag=r.replace(/\s+/g," ").trim(),ce(e,t,o);break}case"> Dump private key":{let n=Be(e,t,a),o=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",o);break}case"> Back":return}},he=async(e,t,a,n)=>{const r=await le(e,t),o=r.data.length,s=new ae.SingleBar({},ae.Presets.legacy);s.start(a,0);for(let e=o;e<o+a;e++){let a=await n.account.generateSubAccount(t,e);if(!a.status)return void console.log(te.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),ce(e,t,r),n.account.reloadAccount()},fe=async(e,t,a,n)=>{const r=await le(e,t);r.data=r.data.slice(0,a+1),ce(e,t,r),n.account.reloadAccount()},ye=async(e,t,a)=>{let n=await Xe("Please input the accountIndex to remove this account",nt);if("0"===n)return void console.log(te.red("Can't remove the first account"));let r=await le(e,t);await Nt(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),ce(e,t,r),a.account.reloadAccount())},be=async(a,n)=>{let r=await Xe("Please input the account name to remove this account"),o=ft(a,n);if(r!==o)return void console.log(te.red("Can't remove this account"));if(!await Nt(`Are you sure you want to remove this account(${o})`,!0))return;let s=t.join(a,`accounts/${n}.json`);e.rmSync(s);const i=t.resolve(a,"network.json");if(!e.existsSync(i))return;const l=JSON.parse(e.readFileSync(i,"utf8"));let c=l.accounts.indexOf(o);l.accounts.splice(c,1),e.writeFileSync(i,JSON.stringify(l,null,2))},ke=async(a,r)=>{const o=t.resolve(a,"accounts");e.existsSync(o)||e.mkdirSync(o);let s;switch(s=0===ie(a).accounts.length?["> Create a new account",new n.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new n.Separator("----------------------------------"),"> Back"],await ut(s)){case"> Select an account":await de(a,r);break;case"> Create a new account":await se(a,r);break;case"> Back":return}await ke(a,r)},ve=require("chalk"),Se=async(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=[];for(let e=0;e<o.networks.length;e++){const t=o.networks[e];s.push(t.name)}let i=n.rpcUrl,l=n.chainId.toString(),c=n.nativeCurrency.symbol,u=n.name,d=n.multicallAddress,p=n.color;if("Ethereum Mainnet"===n.name||"Solana Mainnet"===n.name)i=await mt(n.chainId.toString(),`Rpc Url (default: ${n.rpcUrl})`,!0);else{if(u=await Xe(`Chain Name (default: ${n.name})`),u&&u!==n.name&&s.includes(u))return void console.log(ve.red("Chain Name already exists"));l=await pt(`Chain Id (default: ${n.chainId})`,!0),i=await mt(l||n.chainId,`RPC Url (default: ${n.rpcUrl})`,!0),c=await gt(`Symbol (default: ${n.nativeCurrency.symbol})`),d=await wt(n.multicallAddress?`Multicall Address (Optional) (default: ${n.multicallAddress})`:"Multicall Address (Optional)"),p=await ht(n.color?`Color (Optional): (default: ${n.color})`:"Color (Optional)")}i=i||n.rpcUrl,l=l||n.chainId.toString(),c=c||n.nativeCurrency.symbol,u=u||n.name,d=d||n.multicallAddress,p=p||n.color;let m=j(l.toString()),w={name:u||n.name,chainId:Number(l)||n.chainId,rpcUrl:i||n.rpcUrl,nativeCurrency:{name:c||n.nativeCurrency.symbol,symbol:c||n.nativeCurrency.symbol,decimals:m||n.nativeCurrency.decimals}};(d||n.multicallAddress)&&(w.multicallAddress=d||n.multicallAddress),(p||n.color)&&(w.color=p||n.color);for(let e=0;e<o.networks.length;e++)if(o.networks[e].name===n.name){o.networks[e]=w;break}e.writeFileSync(r,JSON.stringify(o,null,2))},xe=async(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++)if(o.networks[e].name===n.name){o.networks.splice(e,1);break}n.name===o.currentNetwork&&(o.currentNetwork="Ethereum Mainnet"),e.writeFileSync(r,JSON.stringify(o,null,2))},$e=async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=[],i=[];for(let e=0;e<o.networks.length;e++){const t=o.networks[e];"solana"===R(t.chainId.toString())?i.push(e):s.push(e)}let l=["> Back","+ Add Network",new n.Separator("----Networks(evm)----")];for(let e=0;e<s.length;e++){const t=s[e];let a=`${e+1}.${o.networks[t].name}`;0===e&&(a+=" 🔒"),l.push(a)}l.push(new n.Separator("----Networks(solana)----"));for(let e=0;e<i.length;e++){const t=i[e];let a=`${e+1}.${o.networks[t].name}`;0===e&&(a+=" 🔒"),l.push(a)}const c=await ut(l);if("> Back"===c)return;if("+ Add Network"===c)return void await(async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8"));let o=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];o.push(t.name)}console.log(ve.green("Please input someting about network"));const s=await Xe("Chain Name");if(o.includes(s))return void console.log(ve.red("Chain Name already exists"));const i=await pt("Chain Id");if(!i)return;const l=await mt(i,"RPC Url");if(!l)return;const c=await gt("Symbol");if(!c)return;const u=await wt("Multicall Address (Optional)"),d=await ht("Color (Optional)");let p=j(i.toString()),m={name:s,chainId:Number(i),rpcUrl:l,nativeCurrency:{name:c,symbol:c,decimals:p}};u&&(m.multicallAddress=u),d&&(m.color=d),r.networks.push(m),e.writeFileSync(n,JSON.stringify(r,null,2))})(a);let u,d=l.indexOf(c);u=d<s.length+3?o.networks[s[d-3]]:o.networks[i[d-s.length-4]],await(async(e,t)=>{let a=["> Edit"];switch("Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new n.Separator("----------------------------------")),a.push("> Back"),await ut(a)){case"> Edit":await Se(e,t);break;case"> Remove":await xe(e,t)}})(a,u),await $e(a)},Ne=async e=>{let t=["> Enhanced Balance Display",new n.Separator("----------------------------------"),"> Back"];switch(await ut(t)){case"> Enhanced Balance Display":await Fe(e);break;case"> Back":return}await Ne(e)},Oe=async()=>{switch(await ut(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},Ae=(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8")).showTokens;return n in o?o[n]:[]},Fe=async a=>{const r=["> Status","> Token List","> Add Token",new n.Separator("----------------------------------"),"> Back"];switch(await ut(r)){case"> Status":await(async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));"status"in o||(o.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let s=[`> Show Full Address [${o.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${o.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${o.status.extendedToken?"ON":"OFF"}]`,new n.Separator("----------------------------------"),"> Back"];const i=await ut(s);"> Back"!==i&&(i.includes("Full Address")?o.status.fullAddr=await Oe():i.includes("Gas Token")?o.status.gasToken=await Oe():i.includes("Extended Token")&&(o.status.extendedToken=await Oe()),e.writeFileSync(r,JSON.stringify(o,null,2)))})(a);break;case"> Token List":await(async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s={};for(let e of o.networks)s[e.chainId.toString()]=e.name;const i=t.resolve(a,"assets.json");if(!_t(i))return void console.log(ve.red("No asset here yet"));const l=JSON.parse(e.readFileSync(i,"utf8"));let c=[],u=[],d={};for(let e in l){d[c.length]={name:s[e],address:null},c.push(new n.Separator(`----- Networks (${s[e]}) -------`));let t=Ae(a,s[e]),r=l[e].length;for(let a=0;a<r;a++){let n=l[e][a];t.includes(n.address)&&u.push(`${a+1}.${n.symbol.padEnd(6)} CA: ${ve.green(`${It(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`),d[c.length]={name:s[e],address:n.address},c.push(`${a+1}.${n.symbol.padEnd(6)} CA: ${ve.green(`${It(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`)}}let p=await dt(c,"Choose Tokens",u),m={};for(let e=0;e<p.length;e++){let t=p[e],a=d[c.indexOf(t)];a.name in m?m[a.name].push(a.address):m[a.name]=[a.address]}o.showTokens=m,e.writeFileSync(r,JSON.stringify(o,null,2))})(a);break;case"> Add Token":await Ge(a);break;case"> Back":return}await Fe(a)},Pe=async e=>{let t=["> Networks","> Dataview",new n.Separator("----------------------------------"),"> Back"];switch(await ut(t)){case"> Networks":await $e(e);break;case"> Dataview":await Ne(e);break;case"> Back":return}await Pe(e)},_e=async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks.map(e=>`> ${e.name}`);return(await ut(r,"Please select a default network")).slice(2)},Te=(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++){const t=o.networks[e];if(t.name===n)return R(t.chainId.toString())}return"unknown"},Ie=(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++){const t=o.networks[e];if(t.name===n)return t}return null},Be=(e,t,a)=>{const n=le(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Te(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},Ce=async(a,n,r)=>{const o=t.resolve(a,"network.json"),s=JSON.parse(e.readFileSync(o,"utf8")).networks,i=s.length;let l=le(a,n),c=l.default_network;const u=Te(a,c);for(let e=0;e<i;e++){const t=s[e],n=Te(a,t.name);if("PK"===l.account_type&&u!==n)continue;let o;o="PK"===l.account_type?l.data[r].ciphertexts.address:"evm"===n?l.data[r].ciphertexts.evm.address:l.data[r].ciphertexts.solana.address,t.name===c?console.log(`● ${o} [${t.name}]`):console.log(`○ ${o} [${t.name}]`)}},Le=async(a,r,o)=>{const s=t.resolve(a,"network.json"),i=JSON.parse(e.readFileSync(s,"utf8")).networks,l=i.length;let c=le(a,r),u=["> Back",new n.Separator("----------------------------------")],d=c.default_network,p="";o||(p=c.ciphertexts.address);let m=[];const w=Te(a,d);for(let e=0;e<l;e++){const t=i[e],n=Te(a,t.name);"PK"===c.account_type&&w!==n||(t.name===d?o?u.push(`● ${t.name}`):u.push(`● ${p} [${t.name}]`):o?u.push(`○ ${t.name}`):u.push(`○ ${p} [${t.name}]`),m.push(t.name))}const g=await ut(u);if("> Back"===g)return;let h=u.indexOf(g);if(c.default_network=m[h-2],ce(a,r,c),!o){let e=c.default_network,t=Ie(a,e);console.log(ve.green(` Address No: #0\n Network: ${e}\n ${t.nativeCurrency.symbol} Balance: 0`))}},je=async(e,t,a)=>{const n=Ie(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===R(n.chainId.toString())?await S(e,r):await v(e,r),s.status){let e=new h(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,h.ROUND_FLOOR)}return T(n.chainId.toString(),[e],["0"]),s},Re=(e,t,a)=>{const n=le(e,t);if("PK"===n.account_type)return n.default_network;for(let e=0;e<n.data.length;e++)if(n.data[e].ciphertexts.solana.address===a||n.data[e].ciphertexts.evm.address===a)return"default_network"in n.data[e]?n.data[e].default_network:n.default_network;return null},ze=a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks,o=r.length;let s=[];for(let e=0;e<o;e++)"evm"===R(r[e].chainId.toString())&&s.push(r[e].name);return s},Je=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8")).status},Ue=require("chalk"),qe=async(a,n)=>{let r=t.join(a,"assets.json");if(!_t(r))return[];const o=e.readFileSync(r).toString(),s=JSON.parse(o);return n in s?s[n]:[]},Ee=async(e,t,a)=>{const n=await qe(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},De=async(e,t,a)=>{const n=Ie(e,t),r=R(n.chainId.toString()),o=await qe(e,n.chainId.toString());if(!o)return void console.log(Ue.red("No asset found"));const s=await Ke(a,o,n.rpcUrl,r,n.chainId.toString());let i=1;for(let e=0;e<s.length;e++)"0"!==s[e].balance&&"0.0000"!==s[e].balance&&(console.log(Ue.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(Ue.red("No asset found"))},Me=async(e,t,a)=>{const n=Ie(e,t);let r=(await qe(e,n.chainId.toString())).map(e=>e.address);r.push("0"),T(n.chainId.toString(),[a],r)},Ge=async a=>{const n=t.resolve(a,"network.json");let r=[],o=JSON.parse(e.readFileSync(n,"utf8")).networks;for(let e=0;e<o.length;e++)r.push(`${e+1}. ${o[e].name}`);let s=(await ut(r)).split(".")[1].trim();const i=Te(a,s),l=Ie(a,s),c=await Xe("Enter contract address",ct);let u;if("evm"===i){if(!(d=c).startsWith("0x")||42!==d.length)return void console.log(Ue.red("evm address format error"));u=await $(c,l.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(c))return void console.log(Ue.red("solana address format error"));u=await N(c,l.rpcUrl)}var d;if(!u.status)return void console.log(Ue.red(u.output));u.output.name||(u.output.name=await Xe("Please input token name")),u.output.symbol||(u.output.symbol=await Xe("Please input token symbol")),console.log(Ue.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let p=await Xe("Enter decimals for display",nt);p=parseInt(p),await(async(a,n,r,o,s,i,l)=>{let c=t.join(a,"assets.json"),u={};if(_t(c)){const t=e.readFileSync(c).toString();u=JSON.parse(t)}void 0===u[n]&&(u[n]=[]);for(let t=0;t<u[n].length;t++)if(u[n][t].address.toLocaleLowerCase()===r.toLocaleLowerCase()||u[n][t].symbol.toLocaleLowerCase()===o.toLocaleLowerCase())return u[n][t]={address:r,symbol:o,name:s,decimals:i,display_decimals:l},void e.writeFileSync(c,JSON.stringify(u,null,4));u[n].push({address:r,symbol:o,name:s,decimals:i,display_decimals:l}),e.writeFileSync(c,JSON.stringify(u,null,4))})(a,l.chainId.toString(),c,u.output.symbol,u.output.name,u.output.decimals,p)},Ke=async(e,t,a,n,r)=>{let o=t.length,s=[];for(let r=0;r<o;r++){let o=t[r];"evm"===n?s.push(O(e,o.address,a)):"solana"===n&&s.push(A(e,o.address,a))}let i=await Promise.all(s),l=[];for(let a=0;a<o;a++){let n=t[a],o=n.decimals;if(!i[a].status)return console.log(Ue.red(i[a].output)),null;let s=new h(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,h.ROUND_FLOOR);l.push({address:n.address,symbol:n.symbol,balance:s}),T(r,[e],[n.address])}return T(r,[e],["0"]),l},We=async(e,t,a,n,r,o,s)=>{let i=a.length,l=Ie(e,r),c="evm"===R(l.chainId.toString());if(o&&await _(t,"0",l.chainId.toString(),n,c,l.multicallAddress?l.multicallAddress:""),s){let o=Ae(e,r);for(let e=0;e<i;e++){let r=a[e].address;o.includes(r)&&await _(t,r,l.chainId.toString(),n,c,l.multicallAddress?l.multicallAddress:"")}}let u=((e,t,a,n)=>{let r={};if(!(e in f))return r;a.unshift({address:"0",name:n.nativeCurrency.name,symbol:n.nativeCurrency.symbol,decimals:n.nativeCurrency.decimals,display_decimals:4});let o=t.length;for(let n=0;n<o;n++){let o=t[n];if(o)for(let t=0;t<a.length;t++){let n=a[t],s="0";f[e][n.address]&&(o in f[e][n.address]&&(s=new h(f[e][n.address][o]).dividedBy(10**n.decimals).toFixed(n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:4,h.ROUND_FLOOR)),r[o]||(r[o]={}),r[o][n.symbol]=s)}}return r})(l.chainId.toString(),t,a,l);return u},He=require("chalk"),Ze=process.env.HOME||process.env.USERPROFILE,Ve=`${Ze}/.wative`,Xe=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},Qe=async e=>{for(let t=0;t<5;t++){let t=await et(e,"Input start address or index");if(!t)return console.log(He.red("Invalid start account index")),null;let a=await et(e,"Input end address or index");if(!a)return console.log(He.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(He.red("Invalid address range"))}return null},Ye=async(a,n,r)=>{let o=t.join(a,`accounts/${n}.json`);if(!e.existsSync(o))return null;let s=JSON.parse(e.readFileSync(o,"utf8")),i=s.data,l=s.account_type,c=i.length;if(0===c)return null;for(let e=0;e<c;e++){if("PK"===l&&i[e].ciphertexts.address.toLocaleLowerCase()===r.toLocaleLowerCase())return e.toString();if("PP"===l&&(i[e].ciphertexts.evm.address.toLocaleLowerCase()===r.toLocaleLowerCase()||i[e].ciphertexts.solana.address.toLocaleLowerCase()===r.toLocaleLowerCase()))return e.toString()}return null},et=async(e,t)=>{let a=e.data,n=a.length;if(0===n)return null;let r=[],o=[];for(let e=0;e<n;e++)r.push(a[e].ciphertexts.evm.address.toLocaleLowerCase()),o.push(a[e].ciphertexts.solana.address.toLocaleLowerCase());let s=n-1;for(let e=0;e<5;e++){let e=await Xe(t,lt),a=Pt(e);if("unknown"===a){if(Number(e)>s){console.log(He.red("Invalid account index"));continue}return Number(e)}if("evm"===a&&-1!==r.indexOf(e.toLocaleLowerCase()))return r.indexOf(e.toLocaleLowerCase());if("solana"===a&&-1!==o.indexOf(e.toLocaleLowerCase()))return o.indexOf(e.toLocaleLowerCase())}return null},tt=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"),at=e=>!(e.length<6)||"Address length should be greater than 6",nt=e=>!isNaN(Number(e))||"Value should be a number",rt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",ot=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===B.includes(t[e]))return"Passphrase word should be valid";return!0},st=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},it=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},lt=e=>!1===isNaN(Number(e))||ct(e),ct=e=>"unknown"!=Pt(e)||"Address should be valid",ut=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:o}=await n.prompt(r);return o.toString()},dt=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:o}=await n.prompt(r);return o},pt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Xe(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},mt=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await Xe(t);try{if(""===n&&a)return null;if("solana"===R(e.toString()))return n;const t=await k(n);if(!t.status){console.log(He.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(He.red("Rpc url not match chain id"))}catch(e){console.log(He.red(e.message))}}return null},wt=async e=>{for(let t=0;t<5;t++){let t=await Xe(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(He.red("Multicall address length must be 42"))}return null},gt=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Xe(e);if(""===a)return null;if(t.test(a))return a}return null},ht=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Xe(e);if(""===a)return null;if(t.test(a))return a}return null},ft=(e,t)=>{const a=ie(e).accounts,n=bt(a).indexOf(t);return-1!==n?a[n]:t},yt=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),bt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(yt(e[a]));return t},kt=async(e,t)=>{let a=bt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Xe(e);t=t.trim();let r=yt(t);if(n.test(r)){if(a.includes(r)){console.log(He.red("Account name already exists"));continue}return t}}return null},vt=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},St=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await n.prompt(t);return a},xt=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t,transformer:e=>{const t=e.split(" ");return t.map((e,a)=>a<t.length-1?"#".repeat(e.length):e).join(" ")}}],{inputText:r}=await n.prompt(a);return r.trim().toString()},$t=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`,validate:e=>function(e){let t,a="Password must contain at least: \n",n=!0,r=" ",o=He.green("✔"),s=He.red("✖");return e.length>=8?a+=r+o+" 8 characters\n":(a+=r+s+" 8 characters\n",n=!1),t=/[0-9]/,t.test(e)?a+=r+o+" One numerical character\n":(a+=r+s+" One numerical character\n",n=!1),t=/[A-Z]/,t.test(e)?a+=r+o+" One uppercase letter\n":(a+=r+s+" One uppercase letter\n",n=!1),t=/[!@#$%]/,t.test(e)?a+=r+o+" One sepcial character (i.e. !@#$%)\n":(a+=r+s+" One sepcial character (i.e. !@#$%)\n",n=!1),!!n||a}(e)}];let{password:a}=await n.prompt(t);return a},Nt=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await n.prompt(a);return r},Ot=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await n.prompt(a);return r.trim().toString()},At=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},Ft=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},Pt=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",_t=t=>(t=t.trim(),e.existsSync(t)),Tt=e=>new Promise(t=>setTimeout(t,e)),It=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),Bt=(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},Ct=(e,t,a)=>{let n,r;return e<t/2?a/2<=t?(n=0,r=a/2):(n=0,r=t):a/2<=t?(n=0,r=a/2):(n=e-t/2+1,r=e+t/2+1),{fromIndex:n,toIndex:r}},Lt=(e,t)=>{const a=[];for(let n=0;n<e.length;n++){const r=Bt(e[n],t);a.push(r)}return a.concat(a)},jt=(e,t,a,n,r,o,s,i,l)=>{for(let c=i;c<l;c++){let i=c>=t.length/2?c-t.length/2:c,l=e[i];if(!l.name)continue;let u=l.name,d=t[c],p="";if(!d)continue;for(let e in a[d])(o||e!==r)&&(s||e===r)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(n[e])} `));let m=u.split("(");if(m.length>1){let t=m[1];e[i].name=m[0]+` ${p}`+`(${t}`}else e[i].name=m[0]+` ${p}`}},Rt=async(e,t,a,r,o,s,i,l,c,u)=>{const d=[{type:"list",name:"inputText",message:c||"Choose an option",choices:e,pageSize:30,default:u,loop:!0,filter:e=>e}],p=n.prompt(d);let m,w=0,g=0;for(;!p.ui.activePrompt.answers[p.ui.activePrompt.opt.name];){if(l||await Tt(1e3),m===p.ui.activePrompt.selected)continue;if(w===p.ui.activePrompt.selected?g+=1:(g=0,w=p.ui.activePrompt.selected),l){g=6,l=!1;const e=p.ui.activePrompt.opt.pageSize,a=Lt(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:n,toIndex:r}=Ct(w,e,a.length),s=a.slice(n,r);if(!I(o.chainId.toString(),s)){g=0;continue}}if(g<5)continue;g=0;const e=p.ui.activePrompt.opt.pageSize,n=Lt(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:c,toIndex:u}=Ct(w,e,n.length),d=n.slice(c,u);let h=await We(a,d,r,o.rpcUrl,o.name,s,i),f={};for(let e in h)for(let t in h[e]){let a=h[e][t].length+1;f[t]?f[t]<a&&(f[t]=a):f[t]=a}const y=o.nativeCurrency.symbol;jt(p.ui.activePrompt.opt.choices.choices,n,h,f,y,s,i,c,u),p.ui.activePrompt.screen.render(""),p.ui.activePrompt.render(),m=w}return p.ui.activePrompt.answers[p.ui.activePrompt.opt.name]};require("wative-core");const zt=async(e,t)=>{switch(await ut(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await Pe(e);break;case"> Accounts":await ke(e,t);break;case"> Tools":await ee(e,t);break;case"> Exit":return}await zt(e,t)},{WativeCore:Jt}=require("wative-core"),Ut=require("../package.json");require("events").EventEmitter.defaultMaxListeners=0;process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)}),(async()=>{console.log("version:",Ut.version),console.log(He.green(a.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const n=await(async()=>{let t=await Xe(`Keystore storage located in (default: ${Ve})`);return t||(t=Ve),t=t.trim(),t=t.replace("~",Ze),e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),t})();await(async a=>{const n=t.resolve(a,"network.json");if(e.existsSync(n))return;const r={networks:C,currentNetwork:"Ethereum Mainnet",accounts:[]};e.writeFileSync(n,JSON.stringify(r,null,2))})(n),(a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8"));r.status||(r.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),r.showTokens||(r.showTokens={});let o=r.accounts.length;for(let n=0;n<o;n++){let s=r.accounts[o-1-n],i=yt(s),l=t.resolve(a,`accounts/${i}.json`);e.existsSync(l)||r.accounts.splice(o-1-n,1)}e.writeFileSync(n,JSON.stringify(r,null,4));let s=r.accounts,i=bt(s);for(let n=0;n<i.length;n++){let r=t.resolve(a,`accounts/${i[n]}.json`),o=JSON.parse(e.readFileSync(r,"utf8"));"PP"!==o.account_type&&("data"in o||(o.data=[{ciphertexts:o.ciphertexts}],delete o.ciphertexts,e.writeFileSync(r,JSON.stringify(o,null,4))))}})(n);const r=t.resolve(n,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=bt(o.accounts);const i=new Jt(n,s,null,!0);await zt(n,i)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)});
1
+ import*as e from"fs";import*as t from"path";import*as a from"figlet";import n from"inquirer";import r from"web3";import{Connection as o,PublicKey as s,Transaction as i,SystemProgram as l,ComputeBudgetProgram as c}from"@solana/web3.js";import{getMint as u,getTokenMetadata as d,getAssociatedTokenAddressSync as p,createAssociatedTokenAccountInstruction as m,createTransferInstruction as w}from"@solana/spl-token";import{Metaplex as g}from"@metaplex-foundation/js";import{BigNumber as h}from"bignumber.js";const f=console.error;console.error=(...e)=>{((new Error).stack||"").toLowerCase().includes("@solana/web3.js")||f.apply(console,e)};const y={},b=[{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"}],k=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],v=async e=>{let t=new r(e);return await Pt(t.eth.getChainId,[])},S=async(e,t)=>{const a=new r(t);return await Pt(a.eth.getBalance,[e])},x=async(e,t)=>{const a=new o(t);return await Pt(a.getBalance.bind(a),[new s(e)])},$=async(e,t)=>{const a=new o(t),n=new s(e);let r=await Pt(a.getAccountInfo.bind(a),[n]);if(!r.status)return{status:!1,output:"Failed to get mint account info"};const i=r.output;if(!i)return{status:!1,output:"Mint account not found"};return{status:!0,output:i.owner.toBase58()}},N=async(e,t)=>{const a=new(new r(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 n=await Pt(a.methods.symbol().call.bind(a),[]),o=await Pt(a.methods.name().call.bind(a),[]),s=await Pt(a.methods.decimals().call.bind(a),[]);return n.status&&o.status&&s.status?{status:!0,output:{symbol:n.output,name:o.output,decimals:s.output}}:{status:!1,output:"Failed to get token info"}},O=async(e,t)=>{let a=await $(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const n=a.output,r=new o(t),i=g.make(r),l=new s(e);let c=await Pt(u,[r,l,"finalized",new s(n)]),p={status:!0,output:{symbol:"",name:"",decimals:""}};if(!c.status)return{status:!1,output:"Failed to get token decimals"};p.output.decimals=c.output.decimals;try{const e=i.nfts().pdas().metadata({mint:l});if(await r.getAccountInfo(e)){const e=await i.nfts().findByMint({mintAddress:l});p.output.name=e.name,p.output.symbol=e.symbol}else try{const e=await d(r,l);e&&(e.name&&(p.output.name=e.name),e.symbol&&(p.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return p},A=async(e,t,a)=>{const n=new(new r(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let o=await Pt(n.methods.balanceOf(e).call.bind(n),[]);return o.status?{status:!0,output:o.output}:{status:!1,output:"Failed to get token balance"}},F=async(e,t,a)=>{let n=await $(t,a);if(!n.status)return{status:!1,output:"Failed to get token program id"};const r=n.output,i=new o(a),l=p(new s(t),new s(e),!1,new s(r));let c=await Pt(i.getTokenAccountBalance.bind(i),[l]);return c.status?{status:!0,output:c.output.value.amount}:c.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},P=async e=>{const t=new o(e);let a=await Pt(t.getRecentPrioritizationFees.bind(t),[]);if(!a.status)return{status:!1,output:"Failed to get recent prioritization fees"};const n=a.output.map(e=>e.prioritizationFee).sort();return{status:!0,output:n.length>0?Math.ceil(n.reduce((e,t)=>e+t)/n.length):1e3}},_=async(e,t)=>{const a=new o(t);let n=await Pt(a.getAccountInfo.bind(a),[new s(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},T=async(e,t,a,n,o,s)=>{let i;if(e=e.filter(e=>e&&e.length>30),a in y?i=y[a][t]||{}:(y[a]={},i={}),s&&s.length>0&&o){let a=await(async(e,t,a,n)=>{let o=[];try{let s=[];const i=new r(a),l=new i.eth.Contract(b,n);for(const a of e)if("0"===t){const e=l.methods.getEthBalance(a).encodeABI();s.push({target:n,callData:e})}else{const e=new i.eth.Contract(k,t).methods.balanceOf(a).encodeABI();s.push({target:t,callData:e})}const{returnData:c}=await l.methods.aggregate(s).call();for(let e=0;e<c.length;e++){const t=i.eth.abi.decodeParameter("uint256",c[e]);o.push(t)}}catch(e){console.log("Multicall aggregate failed")}return o})(e,t,n,s);if(e.length===a.length)for(let t=0;t<e.length;t++)i[e[t]]=a[t]}else for(const a of e)if(a&&!(a in i)){let e;e="0"===t?o?await S(a,n):await x(a,n):o?await A(a,t,n):await F(a,t,n),e.status&&(i[a]=e.output),await Bt(1e3)}return y[a][t]=i,y},B=(e,t,a)=>{for(let n=0;n<t.length;n++){let r=t[n];for(let t=0;t<a.length;t++){let n=a[t];try{delete y[e][n][r]}catch(e){}}}},C=(e,t)=>{let a=0;if(e in y&&"0"in y[e])for(let n=0;n<t.length;n++)t[n]in y[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},I=["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"],L=[{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}}],j=["901","902","903"],R=e=>j.includes(e)?9:18,z=e=>j.includes(e)?"solana":"evm",{BN:J}=require("bn.js"),{stripHexPrefix:U}=require("ethereumjs-util"),{BigNumber:q}=require("bignumber.js");function E(e){return new J(U(e.toString("hex")),16)}const D=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function M(e){return D(e.toString(16))}class G{constructor(e){this.query=new r(r.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=M(function(e,t,a){const n=new J(t),r=new J(a);return e.mul(n).div(r)}(E(t.gasLimit),19,20));try{n=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:n,simulationFails:a}}async estimateTxGas(e){let t=await this.query.estimateGas(e);return t=new q(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=E(e),r=E(t).muln(.9),o=n.muln(a);return n.gt(r)?M(n):o.lt(r)?M(o):M(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(D(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const K=require("chalk");require("wative-core");const W=async e=>{let t=[new n.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 n.Separator("——————————————-"),"Send it now","Back"],a=await dt(t),r=t.indexOf(a);return 1===r&&(e.from=await Qe("from",ut)),2===r&&(e.to=await Qe("to",ut)),3===r&&(e.nonce=await Qe("nonce")),4===r&&(e.gasPrice=await Qe("gasPrice")),5===r&&(e.data=await At("data")),6===r&&(e.value=await Qe("value")),7===r&&(e.gas=await Qe("gas")),9===r?e:10===r?null:await W(e)},H=async(e,t,a,n,o)=>{const s=await Qe("to",ut),i=new G(t),l=await i.getGasPrice(),c=new h(l.toString()).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR),u=await Qe(`Gas price (${c}), agree or enter`,ot);let d=u||c;d=new h(d).multipliedBy(1e9).toFixed(0);let p,m=await(async(e,t)=>{const a=new r(t);let n=await Pt(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(s,t);if(!m.status)return void console.log(K.red(m.output));p="42161"===e||"421614"===e?"1700000":"21000";let w,g,f=new h(0);if("8453"===e&&(f=new h(1e-5).multipliedBy(1e18)),"0x"===m.output){w="0x";let e=await S(n,t);if(!e.status)return void console.log(K.red(e.output));let r=new h(e.output),o=new h(d),s=r.minus(o.multipliedBy(Number(p))).minus(f).toFixed(0,h.ROUND_FLOOR),i=new h(s).dividedBy(1e18).toFixed(4,h.ROUND_FLOOR);if(new h(i)<new h(0))return void console.log(K.red("Not enough balance"));g=await V(i,s,a,18)}else w=await At("data",Ft),g=await Qe("value",rt);const y=await i.getTransactionCount(n),b=await Qe(`Nonce (${y}), agree or enter`);let k={from:n,to:s,nonce:b||y.toString(),gasPrice:d,data:w,value:g};if("0x"===w)k.gas=p;else{let e=k.gasPrice;delete k.gasPrice;try{k.gas=(await i.estimateTxGas(k)).toString()}catch(e){return void console.log(K.red("Error: "+e))}k.gasPrice=e}if(k=await W(k),!k)return;const v=await o.account.signTransaction(n,k,t);v.status?(console.log(K.green(`Transaction hash: ${v.output.transactionHash}`)),o.account.sendSignedTransaction(n,v.output.rawTransaction,t),B(e,[n,s],["0"])):console.log(K.red(v.output))},Z=async(e,t,a,n,r)=>{const u=await Qe("to",ut);let d=(new i).add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:1e6}));d.add(c.setComputeUnitLimit({units:2e5})),d.add(c.setComputeUnitPrice({microLamports:1e3})),d.feePayer=new s(n);let p=await(async e=>{const t=new o(e);let a=await Pt(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}})(t);if(!p.status)return void console.log(K.red(p.output));d.recentBlockhash=p.output.blockhash;const m=await r.account.simulateTransaction(n,t,d);if(!m.status)return void console.log(K.red(m.output));if(!m.output||!m.output.value||0===m.output.value.unitsConsumed||m.output.value.err)return console.log(K.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(m.output,null,4)),void console.log("==============================================");let w=new h(m.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,h.ROUND_CEIL),g=new h(w);const f=await P(t);if(!f.status)return void console.log(K.red(f.output));const y=new h(f.output.toString()),b=g.multipliedBy(y).dividedBy(1e6).toFixed(0,h.ROUND_CEIL),k=await x(n,t);if(!k.status)return void console.log(K.red(k.output));const v=new h(k.output).minus(5e3).minus(b);let S=new h(v).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR);if(new h(S)<new h(0))return void console.log(K.red("Not enough balance"));let $=await V(S,v.toString(),a,9),N=new i;N.add(c.setComputeUnitLimit({units:Number(g)})),N.add(c.setComputeUnitPrice({microLamports:Number(y)})),N.add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:Number($)})),N.feePayer=new s(n),N.recentBlockhash=p.output.blockhash;const O=await r.account.signTransaction(n,N,t);if(!O.status)return void console.log(K.red(O.output));let A=await r.account.sendSignedTransaction(n,O.output,t);A.status?(B(e,[n,u],["0"]),console.log(K.green(`Transaction hash: ${A.output}`))):console.log(K.red(A.output))},V=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await dt(r),s=r.indexOf(o),i="0";if(0===s){let e=await Qe("value",rt);i=new h(e).multipliedBy(10**n).toFixed(0,h.ROUND_FLOOR)}else 1===s&&(i=t);return new h(i).isLessThanOrEqualTo(new h(t))?i:(console.log(K.red("Not enough balance")),V(e,t,a,n))},X=async(e,t,a,n,o)=>{let s,i,l;switch(await dt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":l=await Qe("token ticker");let r=await De(e,a,l);if(0===r.length)return void console.log(K.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await A(n,r[e].address,t);if(!a.status)return void console.log(K.red(a.output));let s=new h(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,h.ROUND_FLOOR);if(1===r.length){o.push(`> 1. ${l} Balance: ${s}`);break}o.push(`> ${e+1}. ${l} Balance: ${s}(${r[e].address})`),o.push(r[e].address)}let c=await dt(o);const u=r[o.indexOf(c)];s=u.address,i=Number(u.decimals);break;case"> Input token contract address":s=await Qe("token contract address",ut);let d=await N(s,t);if(!d.status)return void console.log(K.red(d.output));i=Number(d.output.decimals),l=d.output.name}const c=await Qe("Receipt",ut),u=await A(n,s,t);if(!u.status)return void console.log(K.red(u.output));const d=new G(t),p=await d.getGasPrice(),m=new h(p.toString()).dividedBy(1e9).toFixed(4,h.ROUND_FLOOR),w=await Qe(`Gas price (${m}), agree or enter`,ot);let g=w||m;g=new h(g).multipliedBy(1e9).toFixed(0);let f=await Q(u.output,l,i);const y=await(async(e,t,a)=>new r(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]))(c,f,t),b=await d.getTransactionCount(n),k=await Qe(`Nonce (${b}), agree or enter`);let v={from:n,to:s,nonce:k||b.toString(),gasPrice:g,data:y,value:"0"};if("0x"===y)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(K.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await W(v),!v)return;const S=await o.account.signTransaction(n,v,t);S.status?(console.log(K.green(`Transaction hash: ${S.output.transactionHash}`)),o.account.sendSignedTransaction(n,S.output.rawTransaction,t),B(a,[n,c],["0",s])):console.log(K.red(S.output))},Q=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new h(e).dividedBy(10**a).toFixed(4,h.ROUND_FLOOR)} ${t})`],r=await dt(n),o=n.indexOf(r),s="0";if(0===o){let e=await Qe("amount",rt);s=new h(e).multipliedBy(10**a).toFixed(0,h.ROUND_FLOOR)}else 1===o&&(s=e);return new h(s).isLessThanOrEqualTo(new h(e))?s:(console.log(K.red("Not enough balance")),Q(e,t,a))},Y=async(e,t,a,r)=>{let o=ze(e,t,a),l=Be(e,o),u=_t(a);if(l!==u&&("evm"===u&&(o="Ethereum Mainnet"),"solana"===u&&(o="Solana Mainnet"),l=Be(e,o)),"evm"===l){if(await Ot(`Network (${o}), want a change?`,!1)){const t=Je(e);o=await dt(t,"Select a network")}}let d=await Re(a,e,o);if(!d.status)return void console.log(K.red(d.output));const g=Ce(e,o);console.log(K.green(` ${g.nativeCurrency.symbol} Balance: ${d.output}`));const f=["> Send Raw Tx","> Send Token",new n.Separator("----------------------------------"),"> Back"];switch(await dt(f)){case"> Send Raw Tx":"evm"===u&&await H(g.chainId.toString(),g.rpcUrl,g.nativeCurrency.symbol,a,r),"solana"===u&&await Z(g.chainId.toString(),g.rpcUrl,g.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===u&&await X(e,g.rpcUrl,g.chainId.toString(),a,r),"solana"===u&&await(async(e,t,a,n,r)=>{let o,l,u;switch(await dt(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Qe("token ticker");let r=await De(e,a,u);if(0===r.length)return void console.log(K.red("Token not found"));let s=[];for(let e=0;e<r.length;e++){const a=await F(n,r[e].address,t);if(!a.status)return void console.log(K.red(a.output));let o=new h(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,h.ROUND_FLOOR);if(1===r.length){s.push(`> 1. ${u} Balance: ${o}`);break}s.push(`> ${e+1}. ${u} Balance: ${o}(${r[e].address})`),s.push(r[e].address)}let i=await dt(s);const c=r[s.indexOf(i)];o=c.address,l=Number(c.decimals);break;case"> Input token contract address":o=await Qe("token contract address",ut);let d=await O(o,t);if(!d.status)return void console.log(K.red(d.output));l=Number(d.output.decimals),u=d.output.name}const d=await Qe("Receipt",ut),g=await F(n,o,t);if(!g.status)return void console.log(K.red(g.output));let f=await Q(g.output,u,l),y=await $(o,t);if(!y.status)return void console.log(K.red(y.output));const b=new s(y.output);let k=p(new s(o),new s(n),!0,b);const v=await _(k.toString(),t);if(!v.status)return void console.log(K.red(v.output));if(!v.output||v.output.owner.toString()===s.default)return void console.log(K.red("From token account not found"));let S=p(new s(o),new s(d),!1,b);const x=await _(S.toString(),t);if(!x.status)return void console.log(K.red(x.output));let N=new i,A=new i;x.output&&x.output.owner.toString()!==s.default||(N.add(m(new s(n),new s(S),new s(d),new s(o),b)),A.add(m(new s(n),new s(S),new s(d),new s(o),b))),N.add(w(k,S,new s(n),Number(f),[],b)),N.add(c.setComputeUnitLimit({units:2e5})),N.add(c.setComputeUnitPrice({microLamports:1e3})),N.feePayer=new s(n);const T=await r.account.simulateTransaction(n,t,N);if(!T.status)return void console.log(K.red(T.output));if(!T.output||!T.output.value||0===T.output.value.unitsConsumed||T.output.value.err)return console.log(K.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(T.output,null,4)),void console.log("==============================================");let C=new h(T.output.value.unitsConsumed.toString());C=new h(Math.ceil(1.2*Number(C)));const I=await P(t);if(!I.status)return void console.log(K.red(I.output));const L=new h(I.output.toString());A.add(w(k,S,new s(n),Number(f),[],b)),A.add(c.setComputeUnitLimit({units:Number(C)})),A.add(c.setComputeUnitPrice({microLamports:Number(L)})),N.feePayer=new s(n);const j=await r.account.signTransaction(n,A,t);if(!j.status)return void console.log(K.red(j.output));let R=await r.account.sendSignedTransaction(n,j.output,t);R.status?(B(a,[n,d],["0",o]),console.log(K.green(`Transaction hash: ${R.output}`))):console.log(K.red(R.output))})(e,g.rpcUrl,g.chainId.toString(),a,r);break;case"> Back":return}},ee=async(e,t,a,r)=>{const o=["> SendTx","> SignMessage",new n.Separator("----------------------------------"),"> Back"];switch(await dt(o)){case"> SendTx":await Y(e,t,a,r);break;case"> SignMessage":{const e=await At("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(K.red(t.output));break}console.log(K.green("Signature: "+t.output));break}case"> Back":return}await ee(e,t,a,r)},te=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new n.Separator("----------------------------------"),"> Back"],o=await dt(r);if("> Back"===o)return;"> Send Tx"===o&&(a=await Qe("Input address to send tx",ut)),"> Search Accounts"===o&&(a=await Qe("Input part address to send tx",nt));let s=t.account.getAccountLabel(a);if(null===s)return console.log(K.red("Account not found")),void await te(e,t);let i=s.account_label,l=yt(e,i);if(a=s.account_address,null===i)return console.log(K.red("Account not found")),void await te(e,t);const c=await et(e,i,a);if(null===c)return console.log(K.red("Account not found")),void await te(e,t);console.log(K.green(`Address found!\n address: ${a}\n account name: [${l}]\n account index: #${c}`)),(await de(e,i,t)).isLoginIn?(await ee(e,i,a,t),await te(e,t)):await te(e,t)},ae=require("chalk");require("dotenv").config();const ne=require("cli-progress");require("wative-core");const re={keystore_slug:"",default_account_index:0},oe=async e=>{const t=le(e);let a=[];t.accounts&&(a=t.accounts);let n=await vt("Account Name",a);return null===n?null:{account_name:n,password:await Nt(`Please set a password for Account [${n}]`),selected_default_network:await Te(e)}},se=async(a,n,r,o,s,i,l)=>{let c=await Ce(a,s);"evm"!==z(c.chainId.toString())||o.startsWith("0x")||(o="0x"+o);let u=await i.account.generatePKAccount(r,o,n,c.chainId.toString(),l);if(!u.status)return void console.log(ae.red(u.output));let d,p=t.join(a,`accounts/${r}.json`);if(e.existsSync(p)){let t=JSON.parse(e.readFileSync(p,"utf8"));if("data"in t){if(t.data.map(e=>e.ciphertexts.address).includes(u.output.ciphertexts.address))return void console.log(ae.red("The account has already been imported"));t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else t.data=[{ciphertexts:t.ciphertexts}],delete t.ciphertexts,t.data.push({ciphertexts:u.output.ciphertexts}),d=t}else u.output.data=[{ciphertexts:u.output.ciphertexts}],delete u.output.ciphertexts,u.output.default_network=s,d=u.output;e.writeFileSync(p,JSON.stringify(d,null,4)),i.account.reloadAccount()},ie=async(a,r)=>{const o=["> Import Passphrase","> Import Private Key",new n.Separator("----------------------------------"),"> Back"];switch(await dt(o)){case"> Import Passphrase":await(async(a,n)=>{let r=await oe(a);if(!r)return;let o=await $t("Please enter a mnemonic [split by space]",st);o=o.replace(/\s+/g," ");let s=bt(r.account_name);const i=n.account.generatePPAccount(s,o,r.password);if(!i.status)return void console.log(ae.red(i.output));let l=t.join(a,`accounts/${s}.json`);i.output.default_network=r.selected_default_network,e.writeFileSync(l,JSON.stringify(i.output,null,4));const c=t.resolve(a,"network.json"),u=JSON.parse(e.readFileSync(c,"utf8"));u.accounts.push(r.account_name),e.writeFileSync(c,JSON.stringify(u,null,4))})(a,r);break;case"> Import Private Key":await(async(a,n)=>{let r=await oe(a);if(!r)return;let o=await St("Please enter a private key"),s=bt(r.account_name);await se(a,r.password,s,o,r.selected_default_network,n,!0);const i=t.resolve(a,"network.json"),l=JSON.parse(e.readFileSync(i,"utf8"));l.accounts.push(r.account_name),e.writeFileSync(i,JSON.stringify(l,null,4))})(a,r);break;case"> Back":return}r.account.reloadAccount()},le=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8"))},ce=(a,n)=>{const r=t.join(a,`accounts/${n}.json`);return JSON.parse(e.readFileSync(r,"utf8"))},ue=(a,n,r)=>{const o=t.join(a,`accounts/${n}.json`);e.writeFileSync(o,JSON.stringify(r,null,4))},de=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=yt(e,t),o="WATIVE_PASSWD_"+t;if(n=process.env[o]&&""!==process.env[o]?process.env[o]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await xt(`Please input the password for Account [${r}]`),!n)return console.log(ae.red("Password can't be empty")),{isLoginIn:!1};const s=await a.account.login(t,n);if(s.status)return{isLoginIn:!0,password:n};const i=["> Try Again","> Back"],l=await dt(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},pe=async(e,t)=>{const a=le(e).accounts;let r=["> Back",new n.Separator("----------------------------------")];const o=a.length;if(0===o)return void console.log(ae.red("No address here yet"));for(let t=0;t<o;t++){const n=a[t],o=bt(n),s=ce(e,o);"data"in s?r.push(`${t+1}) ${n} [${s.account_type}:${s.data.length}]`):r.push(`${t+1}) ${n} [${s.account_type}:1]`)}const s=await dt(r,"Select an account");if("> Back"===s)return;const i=a[r.indexOf(s)-2],l=bt(i);console.log(ae.green(`Keystore slug: [${l}]`));let c=await de(e,l,t);c.isLoginIn&&await we(e,l,t,c.password),await pe(e,t)},me=async(e,t,a)=>{const r=await ce(e,t);let o=["> Disabled Slots","> Add Single","> Add Range",new n.Separator("----------------------------------"),"> Back"];switch(await dt(o)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(ae.red("No disabled slots here yet"));break}let o=r.data,s=["> Back",new n.Separator("----------------------------------")],i=r.default_network;for(let t=0;t<a.length;t++){let n=a[t].from,r=a[t].to,l=i,c=i;"default_network"in o[n]&&(l=o[n].default_network),"default_network"in o[r]&&(c=o[r].default_network);let u,d,p=Be(e,l),m=Be(e,c);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==m&&"solana"!==m)throw new Error(`Invalid network type: ${m}`);u="evm"===p?o[n].ciphertexts.evm.address:o[r].ciphertexts.solana.address,d="evm"===m?o[r].ciphertexts.evm.address:o[r].ciphertexts.solana.address,n===r?s.push(`${t+1}. ${u}[${n}]`):s.push(`${t+1}. ${u}[${n}]-${d}[${r}]`)}let l=await dt(s);if("> Back"===l)break;if(!await Ot(`Are you sure to delete the ${l}?`,!0))break;let c=s.indexOf(l)-2;r.disabled_slots.splice(c,1),ue(e,t,r);break}case"> Add Single":{let a=await tt(r,"Input address or index");if(null===a){console.log(ae.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 Ye(r);if(!a){console.log(ae.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],ue(e,t,r);break}}await me(e,t)},we=async(a,r,o,s)=>{let i,l=await ce(a,r);i="PP"===l.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${l.default_network}]`,"> Remove",new n.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${l.default_network}]`,"> Remove",new n.Separator("----------------------------------"),"> Back"];switch(await dt(i)){case"> Address List":await ge(a,r,o);break;case"> Expand Address":{const e=await Qe("Expand accounts count",it);if(Number(e)>2e3){console.log(ae.red("Too many accounts, please input less than 2000"));break}await fe(a,r,Number(e),o);break}case"> Import Private Key":await(async(a,n,r,o)=>{let s=await Qe("Please enter a private key"),i=t.join(a,`accounts/${r}.json`),l=JSON.parse(e.readFileSync(i,"utf8"));await se(a,n,r,s,l.default_network,o,!1)})(a,s,r,o);break;case"> Slice Address":{const e=await Qe("Please input last account number",lt);await ye(a,r,Number(e),o);break}case"> Remove Address":await be(a,r,o);break;case"> Disable Address":await me(a,r);break;case"> Reset Account Password":{let e=yt(a,r);const t=await Nt(`Please input new password for Account [${e}]`),n=await Nt(`Please confirm new password for Account [${e}]`);if(!t||!n||t!==n){console.log(ae.red("Passwords do not match"));break}return void await o.account.resetPassword(r,t)}case`> Switch Networks [${l.default_network}]`:await je(a,r,!0);break;case"> Remove":return void await ke(a,r);case"> Back":return}await we(a,r,o,s)},ge=async(e,t,a)=>{const r=await ce(e,t);let o=["> Back",new n.Separator("----------------------------------")],s=r.disabled_slots,i=Ue(e),l=r.default_network,c=Ce(e,l),u=z(c.chainId.toString()),d=r.data.length.toString().length+1;for(let e=0;e<r.data.length;e++){let t,l=r.data[e].tag?`(${r.data[e].tag})`:"",c=a.account.checkIsDisableAddress(s,e);t="PP"===r.account_type?"evm"===u?r.data[e].ciphertexts.evm.address:r.data[e].ciphertexts.solana.address:r.data[e].ciphertexts.address,c?o.push(new n.Separator(ae.yellow(`#${e.toString().padEnd(d)} ${Ct(t,i.fullAddr)} ${l}`))):o.push(`#${e.toString().padEnd(d)} ${Ct(t,i.fullAddr)} ${l}`)}let p,m=re.keystore_slug===t?o[re.account_index]:o[0],w=re.keystore_slug===t&&re.account_index>0,g=await Ee(e,c.chainId.toString());if(w&&re.account_index>15){let e=o.slice(0,re.account_index-15);p=o.slice(re.account_index-15).concat(e)}else p=o.slice(0);let h=await zt(p,"evm"===u,e,g,c,i.gasToken,i.extendedToken,w,"Select an account",m);"> Back"!==h&&(re.keystore_slug=t,re.account_index=o.indexOf(h),await he(e,t,o.indexOf(h)-2,a),await ge(e,t,a))},he=async(e,t,a,r)=>{const o=await ce(e,t);let s=o.default_network,i=Ie(e,t,a);const l=await Ce(e,s),c=await Re(i,e,s);c.status?console.log(ae.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(ae.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol}`));let u="> Tag";"tag"in o.data[a]&&""!==o.data[a].tag&&(u=`> Tag(${o.data[a].tag})`);let d=["> Tools","> Show address","> Assets",u,"> Reload balances","> Dump private key",new n.Separator("----------------------------------"),"> Back"];switch(await dt(d)){case"> Tools":await ee(e,t,i,r);break;case"> Show address":await Le(e,t,a);break;case"> Assets":await Me(e,s,i);break;case"> Reload balances":await Ge(e,s,i);break;case u:{let n="Current tag";"tag"in o.data[a]&&""!==o.data[a].tag&&(n=`Current tag (${o.data[a].tag})`);let r=await Qe(n,at);o.data[a].tag=r.replace(/\s+/g," ").trim(),ue(e,t,o);break}case"> Dump private key":{let n=Ie(e,t,a),o=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",o);break}case"> Back":return}},fe=async(e,t,a,n)=>{const r=await ce(e,t),o=r.data.length,s=new ne.SingleBar({},ne.Presets.legacy);s.start(a,0);for(let e=o;e<o+a;e++){let a=await n.account.generateSubAccount(t,e);if(!a.status)return void console.log(ae.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),ue(e,t,r),n.account.reloadAccount()},ye=async(e,t,a,n)=>{const r=await ce(e,t);r.data=r.data.slice(0,a+1),ue(e,t,r),n.account.reloadAccount()},be=async(e,t,a)=>{let n=await Qe("Please input the accountIndex to remove this account",rt);if("0"===n)return void console.log(ae.red("Can't remove the first account"));let r=await ce(e,t);await Ot(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),ue(e,t,r),a.account.reloadAccount())},ke=async(a,n)=>{let r=await Qe("Please input the account name to remove this account"),o=yt(a,n);if(r!==o)return void console.log(ae.red("Can't remove this account"));if(!await Ot(`Are you sure you want to remove this account(${o})`,!0))return;let s=t.join(a,`accounts/${n}.json`);e.rmSync(s);const i=t.resolve(a,"network.json");if(!e.existsSync(i))return;const l=JSON.parse(e.readFileSync(i,"utf8"));let c=l.accounts.indexOf(o);l.accounts.splice(c,1),e.writeFileSync(i,JSON.stringify(l,null,2))},ve=async(a,r)=>{const o=t.resolve(a,"accounts");e.existsSync(o)||e.mkdirSync(o);let s;switch(s=0===le(a).accounts.length?["> Create a new account",new n.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new n.Separator("----------------------------------"),"> Back"],await dt(s)){case"> Select an account":await pe(a,r);break;case"> Create a new account":await ie(a,r);break;case"> Back":return}await ve(a,r)},Se=require("chalk"),xe=async(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=[];for(let e=0;e<o.networks.length;e++){const t=o.networks[e];s.push(t.name)}let i=n.rpcUrl,l=n.chainId.toString(),c=n.nativeCurrency.symbol,u=n.name,d=n.multicallAddress,p=n.color;if("Ethereum Mainnet"===n.name||"Solana Mainnet"===n.name)i=await wt(n.chainId.toString(),`Rpc Url (default: ${n.rpcUrl})`,!0);else{if(u=await Qe(`Chain Name (default: ${n.name})`),u&&u!==n.name&&s.includes(u))return void console.log(Se.red("Chain Name already exists"));l=await mt(`Chain Id (default: ${n.chainId})`,!0),i=await wt(l||n.chainId,`RPC Url (default: ${n.rpcUrl})`,!0),c=await ht(`Symbol (default: ${n.nativeCurrency.symbol})`),d=await gt(n.multicallAddress?`Multicall Address (Optional) (default: ${n.multicallAddress})`:"Multicall Address (Optional)"),p=await ft(n.color?`Color (Optional): (default: ${n.color})`:"Color (Optional)")}i=i||n.rpcUrl,l=l||n.chainId.toString(),c=c||n.nativeCurrency.symbol,u=u||n.name,d=d||n.multicallAddress,p=p||n.color;let m=R(l.toString()),w={name:u||n.name,chainId:Number(l)||n.chainId,rpcUrl:i||n.rpcUrl,nativeCurrency:{name:c||n.nativeCurrency.symbol,symbol:c||n.nativeCurrency.symbol,decimals:m||n.nativeCurrency.decimals}};(d||n.multicallAddress)&&(w.multicallAddress=d||n.multicallAddress),(p||n.color)&&(w.color=p||n.color);for(let e=0;e<o.networks.length;e++)if(o.networks[e].name===n.name){o.networks[e]=w;break}e.writeFileSync(r,JSON.stringify(o,null,2))},$e=async(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++)if(o.networks[e].name===n.name){o.networks.splice(e,1);break}n.name===o.currentNetwork&&(o.currentNetwork="Ethereum Mainnet"),e.writeFileSync(r,JSON.stringify(o,null,2))},Ne=async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=[],i=[];for(let e=0;e<o.networks.length;e++){const t=o.networks[e];"solana"===z(t.chainId.toString())?i.push(e):s.push(e)}let l=["> Back","+ Add Network",new n.Separator("----Networks(evm)----")];for(let e=0;e<s.length;e++){const t=s[e];let a=`${e+1}.${o.networks[t].name}`;0===e&&(a+=" 🔒"),l.push(a)}l.push(new n.Separator("----Networks(solana)----"));for(let e=0;e<i.length;e++){const t=i[e];let a=`${e+1}.${o.networks[t].name}`;0===e&&(a+=" 🔒"),l.push(a)}const c=await dt(l);if("> Back"===c)return;if("+ Add Network"===c)return void await(async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8"));let o=[];for(let e=0;e<r.networks.length;e++){const t=r.networks[e];o.push(t.name)}console.log(Se.green("Please input someting about network"));const s=await Qe("Chain Name");if(o.includes(s))return void console.log(Se.red("Chain Name already exists"));const i=await mt("Chain Id");if(!i)return;const l=await wt(i,"RPC Url");if(!l)return;const c=await ht("Symbol");if(!c)return;const u=await gt("Multicall Address (Optional)"),d=await ft("Color (Optional)");let p=R(i.toString()),m={name:s,chainId:Number(i),rpcUrl:l,nativeCurrency:{name:c,symbol:c,decimals:p}};u&&(m.multicallAddress=u),d&&(m.color=d),r.networks.push(m),e.writeFileSync(n,JSON.stringify(r,null,2))})(a);let u,d=l.indexOf(c);u=d<s.length+3?o.networks[s[d-3]]:o.networks[i[d-s.length-4]],await(async(e,t)=>{let a=["> Edit"];switch("Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new n.Separator("----------------------------------")),a.push("> Back"),await dt(a)){case"> Edit":await xe(e,t);break;case"> Remove":await $e(e,t)}})(a,u),await Ne(a)},Oe=async e=>{let t=["> Enhanced Balance Display",new n.Separator("----------------------------------"),"> Back"];switch(await dt(t)){case"> Enhanced Balance Display":await Pe(e);break;case"> Back":return}await Oe(e)},Ae=async()=>{switch(await dt(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},Fe=(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8")).showTokens;return n in o?o[n]:[]},Pe=async a=>{const r=["> Status","> Token List","> Add Token",new n.Separator("----------------------------------"),"> Back"];switch(await dt(r)){case"> Status":await(async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));"status"in o||(o.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let s=[`> Show Full Address [${o.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${o.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${o.status.extendedToken?"ON":"OFF"}]`,new n.Separator("----------------------------------"),"> Back"];const i=await dt(s);"> Back"!==i&&(i.includes("Full Address")?o.status.fullAddr=await Ae():i.includes("Gas Token")?o.status.gasToken=await Ae():i.includes("Extended Token")&&(o.status.extendedToken=await Ae()),e.writeFileSync(r,JSON.stringify(o,null,2)))})(a);break;case"> Token List":await(async a=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s={};for(let e of o.networks)s[e.chainId.toString()]=e.name;const i=t.resolve(a,"assets.json");if(!Tt(i))return void console.log(Se.red("No asset here yet"));const l=JSON.parse(e.readFileSync(i,"utf8"));let c=[],u=[],d={};for(let e in l){d[c.length]={name:s[e],address:null},c.push(new n.Separator(`----- Networks (${s[e]}) -------`));let t=Fe(a,s[e]),r=l[e].length;for(let a=0;a<r;a++){let n=l[e][a];t.includes(n.address)&&u.push(`${a+1}.${n.symbol.padEnd(6)} CA: ${Se.green(`${Ct(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`),d[c.length]={name:s[e],address:n.address},c.push(`${a+1}.${n.symbol.padEnd(6)} CA: ${Se.green(`${Ct(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:"4"}`)}}let p=await pt(c,"Choose Tokens",u),m={};for(let e=0;e<p.length;e++){let t=p[e],a=d[c.indexOf(t)];a.name in m?m[a.name].push(a.address):m[a.name]=[a.address]}o.showTokens=m,e.writeFileSync(r,JSON.stringify(o,null,2))})(a);break;case"> Add Token":await Ke(a);break;case"> Back":return}await Pe(a)},_e=async e=>{let t=["> Networks","> Dataview",new n.Separator("----------------------------------"),"> Back"];switch(await dt(t)){case"> Networks":await Ne(e);break;case"> Dataview":await Oe(e);break;case"> Back":return}await _e(e)},Te=async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks.map(e=>`> ${e.name}`);return(await dt(r,"Please select a default network")).slice(2)},Be=(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++){const t=o.networks[e];if(t.name===n)return z(t.chainId.toString())}return"unknown"},Ce=(a,n)=>{const r=t.resolve(a,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));for(let e=0;e<o.networks.length;e++){const t=o.networks[e];if(t.name===n)return t}return null},Ie=(e,t,a)=>{const n=ce(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Be(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},Le=async(a,n,r)=>{const o=t.resolve(a,"network.json"),s=JSON.parse(e.readFileSync(o,"utf8")).networks,i=s.length;let l=ce(a,n),c=l.default_network;const u=Be(a,c);for(let e=0;e<i;e++){const t=s[e],n=Be(a,t.name);if("PK"===l.account_type&&u!==n)continue;let o;o="PK"===l.account_type?l.data[r].ciphertexts.address:"evm"===n?l.data[r].ciphertexts.evm.address:l.data[r].ciphertexts.solana.address,t.name===c?console.log(`● ${o} [${t.name}]`):console.log(`○ ${o} [${t.name}]`)}},je=async(a,r,o)=>{const s=t.resolve(a,"network.json"),i=JSON.parse(e.readFileSync(s,"utf8")).networks,l=i.length;let c=ce(a,r),u=["> Back",new n.Separator("----------------------------------")],d=c.default_network,p="";o||(p=c.ciphertexts.address);let m=[];const w=Be(a,d);for(let e=0;e<l;e++){const t=i[e],n=Be(a,t.name);"PK"===c.account_type&&w!==n||(t.name===d?o?u.push(`● ${t.name}`):u.push(`● ${p} [${t.name}]`):o?u.push(`○ ${t.name}`):u.push(`○ ${p} [${t.name}]`),m.push(t.name))}const g=await dt(u);if("> Back"===g)return;let h=u.indexOf(g);if(c.default_network=m[h-2],ue(a,r,c),!o){let e=c.default_network,t=Ce(a,e);console.log(Se.green(` Address No: #0\n Network: ${e}\n ${t.nativeCurrency.symbol} Balance: 0`))}},Re=async(e,t,a)=>{const n=Ce(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===z(n.chainId.toString())?await x(e,r):await S(e,r),s.status){let e=new h(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,h.ROUND_FLOOR)}return B(n.chainId.toString(),[e],["0"]),s},ze=(e,t,a)=>{const n=ce(e,t);if("PK"===n.account_type)return n.default_network;for(let e=0;e<n.data.length;e++)if(n.data[e].ciphertexts.solana.address===a||n.data[e].ciphertexts.evm.address===a)return"default_network"in n.data[e]?n.data[e].default_network:n.default_network;return null},Je=a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks,o=r.length;let s=[];for(let e=0;e<o;e++)"evm"===z(r[e].chainId.toString())&&s.push(r[e].name);return s},Ue=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8")).status},qe=require("chalk"),Ee=async(a,n)=>{let r=t.join(a,"assets.json");if(!Tt(r))return[];const o=e.readFileSync(r).toString(),s=JSON.parse(o);return n in s?s[n]:[]},De=async(e,t,a)=>{const n=await Ee(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},Me=async(e,t,a)=>{const n=Ce(e,t),r=z(n.chainId.toString()),o=await Ee(e,n.chainId.toString());if(!o)return void console.log(qe.red("No asset found"));const s=await We(a,o,n.rpcUrl,r,n.chainId.toString());let i=1;for(let e=0;e<s.length;e++)"0"!==s[e].balance&&"0.0000"!==s[e].balance&&(console.log(qe.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(qe.red("No asset found"))},Ge=async(e,t,a)=>{const n=Ce(e,t);let r=(await Ee(e,n.chainId.toString())).map(e=>e.address);r.push("0"),B(n.chainId.toString(),[a],r)},Ke=async a=>{const n=t.resolve(a,"network.json");let r=[],o=JSON.parse(e.readFileSync(n,"utf8")).networks;for(let e=0;e<o.length;e++)r.push(`${e+1}. ${o[e].name}`);let s=(await dt(r)).split(".")[1].trim();const i=Be(a,s),l=Ce(a,s),c=await Qe("Enter contract address",ut);let u;if("evm"===i){if(!(d=c).startsWith("0x")||42!==d.length)return void console.log(qe.red("evm address format error"));u=await N(c,l.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(c))return void console.log(qe.red("solana address format error"));u=await O(c,l.rpcUrl)}var d;if(!u.status)return void console.log(qe.red(u.output));u.output.name||(u.output.name=await Qe("Please input token name")),u.output.symbol||(u.output.symbol=await Qe("Please input token symbol")),console.log(qe.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let p=await Qe("Enter decimals for display",rt);p=parseInt(p),await(async(a,n,r,o,s,i,l)=>{let c=t.join(a,"assets.json"),u={};if(Tt(c)){const t=e.readFileSync(c).toString();u=JSON.parse(t)}void 0===u[n]&&(u[n]=[]);for(let t=0;t<u[n].length;t++)if(u[n][t].address.toLocaleLowerCase()===r.toLocaleLowerCase()||u[n][t].symbol.toLocaleLowerCase()===o.toLocaleLowerCase())return u[n][t]={address:r,symbol:o,name:s,decimals:i,display_decimals:l},void e.writeFileSync(c,JSON.stringify(u,null,4));u[n].push({address:r,symbol:o,name:s,decimals:i,display_decimals:l}),e.writeFileSync(c,JSON.stringify(u,null,4))})(a,l.chainId.toString(),c,u.output.symbol,u.output.name,u.output.decimals,p)},We=async(e,t,a,n,r)=>{let o=t.length,s=[];for(let r=0;r<o;r++){let o=t[r];"evm"===n?s.push(A(e,o.address,a)):"solana"===n&&s.push(F(e,o.address,a))}let i=await Promise.all(s),l=[];for(let a=0;a<o;a++){let n=t[a],o=n.decimals;if(!i[a].status)return console.log(qe.red(i[a].output)),null;let s=new h(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,h.ROUND_FLOOR);l.push({address:n.address,symbol:n.symbol,balance:s}),B(r,[e],[n.address])}return B(r,[e],["0"]),l},He=async(e,t,a,n,r,o,s)=>{let i=a.length,l=Ce(e,r),c="evm"===z(l.chainId.toString());o&&await T(t,"0",l.chainId.toString(),n,c,l.multicallAddress?l.multicallAddress:"");let u=[];if(s){u=Fe(e,r);for(let e=0;e<i;e++){let r=a[e].address;u.includes(r)&&await T(t,r,l.chainId.toString(),n,c,l.multicallAddress?l.multicallAddress:"")}}let d=((e,t,a,n,r,o)=>{let s={};if(!(e in y))return s;r&&a.unshift({address:"0",name:n.nativeCurrency.name,symbol:n.nativeCurrency.symbol,decimals:n.nativeCurrency.decimals,display_decimals:4});let i=t.length;for(let n=0;n<i;n++){let i=t[n];if(i)for(let t=0;t<a.length;t++){let n=a[t],l="0";"0"!==n.address&&!o.includes(n.address)||!r&&"0"===n.address||!y[e][n.address]||(i in y[e][n.address]&&(l=new h(y[e][n.address][i]).dividedBy(10**n.decimals).toFixed(n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:4,h.ROUND_FLOOR)),s[i]||(s[i]={}),s[i][n.symbol]=l)}}return s})(l.chainId.toString(),t,a,l,o,u);return d},Ze=require("chalk"),Ve=process.env.HOME||process.env.USERPROFILE,Xe=`${Ve}/.wative`,Qe=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},Ye=async e=>{for(let t=0;t<5;t++){let t=await tt(e,"Input start address or index");if(!t)return console.log(Ze.red("Invalid start account index")),null;let a=await tt(e,"Input end address or index");if(!a)return console.log(Ze.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(Ze.red("Invalid address range"))}return null},et=async(a,n,r)=>{let o=t.join(a,`accounts/${n}.json`);if(!e.existsSync(o))return null;let s=JSON.parse(e.readFileSync(o,"utf8")),i=s.data,l=s.account_type,c=i.length;if(0===c)return null;for(let e=0;e<c;e++){if("PK"===l&&i[e].ciphertexts.address.toLocaleLowerCase()===r.toLocaleLowerCase())return e.toString();if("PP"===l&&(i[e].ciphertexts.evm.address.toLocaleLowerCase()===r.toLocaleLowerCase()||i[e].ciphertexts.solana.address.toLocaleLowerCase()===r.toLocaleLowerCase()))return e.toString()}return null},tt=async(e,t)=>{let a=e.data,n=a.length;if(0===n)return null;let r=[],o=[];for(let e=0;e<n;e++)r.push(a[e].ciphertexts.evm.address.toLocaleLowerCase()),o.push(a[e].ciphertexts.solana.address.toLocaleLowerCase());let s=n-1;for(let e=0;e<5;e++){let e=await Qe(t,ct),a=_t(e);if("unknown"===a){if(Number(e)>s){console.log(Ze.red("Invalid account index"));continue}return Number(e)}if("evm"===a&&-1!==r.indexOf(e.toLocaleLowerCase()))return r.indexOf(e.toLocaleLowerCase());if("solana"===a&&-1!==o.indexOf(e.toLocaleLowerCase()))return o.indexOf(e.toLocaleLowerCase())}return null},at=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"),nt=e=>!(e.length<6)||"Address length should be greater than 6",rt=e=>!isNaN(Number(e))||"Value should be a number",ot=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",st=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===I.includes(t[e]))return"Passphrase word should be valid";return!0},it=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},lt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},ct=e=>!1===isNaN(Number(e))||ut(e),ut=e=>"unknown"!=_t(e)||"Address should be valid",dt=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:o}=await n.prompt(r);return o.toString()},pt=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:o}=await n.prompt(r);return o},mt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Qe(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},wt=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await Qe(t);try{if(""===n&&a)return null;if("solana"===z(e.toString()))return n;const t=await v(n);if(!t.status){console.log(Ze.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(Ze.red("Rpc url not match chain id"))}catch(e){console.log(Ze.red(e.message))}}return null},gt=async e=>{for(let t=0;t<5;t++){let t=await Qe(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(Ze.red("Multicall address length must be 42"))}return null},ht=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Qe(e);if(""===a)return null;if(t.test(a))return a}return null},ft=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Qe(e);if(""===a)return null;if(t.test(a))return a}return null},yt=(e,t)=>{const a=le(e).accounts,n=kt(a).indexOf(t);return-1!==n?a[n]:t},bt=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),kt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(bt(e[a]));return t},vt=async(e,t)=>{let a=kt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Qe(e);t=t.trim();let r=bt(t);if(n.test(r)){if(a.includes(r)){console.log(Ze.red("Account name already exists"));continue}return t}}return null},St=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},xt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await n.prompt(t);return a},$t=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t,transformer:e=>{const t=e.split(" ");return t.map((e,a)=>a<t.length-1?"#".repeat(e.length):e).join(" ")}}],{inputText:r}=await n.prompt(a);return r.trim().toString()},Nt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`,validate:e=>function(e){let t,a="Password must contain at least: \n",n=!0,r=" ",o=Ze.green("✔"),s=Ze.red("✖");return e.length>=8?a+=r+o+" 8 characters\n":(a+=r+s+" 8 characters\n",n=!1),t=/[0-9]/,t.test(e)?a+=r+o+" One numerical character\n":(a+=r+s+" One numerical character\n",n=!1),t=/[A-Z]/,t.test(e)?a+=r+o+" One uppercase letter\n":(a+=r+s+" One uppercase letter\n",n=!1),t=/[!@#$%]/,t.test(e)?a+=r+o+" One sepcial character (i.e. !@#$%)\n":(a+=r+s+" One sepcial character (i.e. !@#$%)\n",n=!1),!!n||a}(e)}];let{password:a}=await n.prompt(t);return a},Ot=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await n.prompt(a);return r},At=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await n.prompt(a);return r.trim().toString()},Ft=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},Pt=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},_t=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",Tt=t=>(t=t.trim(),e.existsSync(t)),Bt=e=>new Promise(t=>setTimeout(t,e)),Ct=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),It=(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},Lt=(e,t,a)=>{let n,r;return e<t/2?a/2<=t?(n=0,r=a/2):(n=0,r=t):a/2<=t?(n=0,r=a/2):(n=e-t/2+1,r=e+t/2+1),{fromIndex:n,toIndex:r}},jt=(e,t)=>{const a=[];for(let n=0;n<e.length;n++){const r=It(e[n],t);a.push(r)}return a.concat(a)},Rt=(e,t,a,n,r,o,s,i,l)=>{for(let c=i;c<l;c++){let i=c>=t.length/2?c-t.length/2:c,l=e[i];if(!l.name)continue;let u=l.name,d=t[c],p="";if(!d)continue;for(let e in a[d])(o||e!==r)&&(s||e===r)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(n[e])} `));let m=u.split("(");if(m.length>1){let t=m[1];e[i].name=m[0]+` ${p}`+`(${t}`}else e[i].name=m[0]+` ${p}`}},zt=async(e,t,a,r,o,s,i,l,c,u)=>{const d=[{type:"list",name:"inputText",message:c||"Choose an option",choices:e,pageSize:30,default:u,loop:!0,filter:e=>e}],p=n.prompt(d);let m,w=0,g=0;for(;!p.ui.activePrompt.answers[p.ui.activePrompt.opt.name];){if(l||await Bt(1e3),m===p.ui.activePrompt.selected)continue;if(w===p.ui.activePrompt.selected?g+=1:(g=0,w=p.ui.activePrompt.selected),l){g=6,l=!1;const e=p.ui.activePrompt.opt.pageSize,a=jt(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:n,toIndex:r}=Lt(w,e,a.length),s=a.slice(n,r);if(!C(o.chainId.toString(),s)){g=0;continue}}if(g<5)continue;g=0;const e=p.ui.activePrompt.opt.pageSize,n=jt(p.ui.activePrompt.opt.choices.choices,t),{fromIndex:c,toIndex:u}=Lt(w,e,n.length),d=n.slice(c,u);let h=await He(a,d,r,o.rpcUrl,o.name,s,i),f={};for(let e in h)for(let t in h[e]){let a=h[e][t].length+1;f[t]?f[t]<a&&(f[t]=a):f[t]=a}const y=o.nativeCurrency.symbol;Rt(p.ui.activePrompt.opt.choices.choices,n,h,f,y,s,i,c,u),p.ui.activePrompt.screen.render(""),p.ui.activePrompt.render(),m=w}return p.ui.activePrompt.answers[p.ui.activePrompt.opt.name]};require("wative-core");const Jt=async(e,t)=>{switch(await dt(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await _e(e);break;case"> Accounts":await ve(e,t);break;case"> Tools":await te(e,t);break;case"> Exit":return}await Jt(e,t)};process.on("warning",e=>{"DEP0040"!==e.code&&"DeprecationWarning"!==e.name&&console.warn(e)});const{WativeCore:Ut}=require("wative-core"),qt=require("../package.json");require("events").EventEmitter.defaultMaxListeners=0;process.on("unhandledRejection",(e,t)=>{console.log("Unhandled Rejection at:",t,"reason:",e)}),(async()=>{console.log("version:",qt.version),console.log(Ze.green(a.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const n=await(async()=>{let t=await Qe(`Keystore storage located in (default: ${Xe})`);return t||(t=Xe),t=t.trim(),t=t.replace("~",Ve),e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),t})();await(async a=>{const n=t.resolve(a,"network.json");if(e.existsSync(n))return;const r={networks:L,currentNetwork:"Ethereum Mainnet",accounts:[]};e.writeFileSync(n,JSON.stringify(r,null,2))})(n),(a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8"));r.status||(r.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),r.showTokens||(r.showTokens={});let o=r.accounts.length;for(let n=0;n<o;n++){let s=r.accounts[o-1-n],i=bt(s),l=t.resolve(a,`accounts/${i}.json`);e.existsSync(l)||r.accounts.splice(o-1-n,1)}e.writeFileSync(n,JSON.stringify(r,null,4));let s=r.accounts,i=kt(s);for(let n=0;n<i.length;n++){let r=t.resolve(a,`accounts/${i[n]}.json`),o=JSON.parse(e.readFileSync(r,"utf8"));"PP"!==o.account_type&&("data"in o||(o.data=[{ciphertexts:o.ciphertexts}],delete o.ciphertexts,e.writeFileSync(r,JSON.stringify(o,null,4))))}})(n);const r=t.resolve(n,"network.json"),o=JSON.parse(e.readFileSync(r,"utf8"));let s=kt(o.accounts);const i=new Ut(n,s,null,!0);await Jt(n,i)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)});