wative 1.2.5 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/account.d.ts +13 -13
- package/lib/account.d.ts.map +1 -1
- package/lib/assets.d.ts +10 -10
- package/lib/assets.d.ts.map +1 -1
- package/lib/chain.d.ts +5 -5
- package/lib/chain.d.ts.map +1 -1
- package/lib/config.d.ts +22 -22
- package/lib/home_page.d.ts +3 -3
- package/lib/home_page.d.ts.map +1 -1
- package/lib/index.d.ts +11 -11
- package/lib/index.esm.js +1 -1
- package/lib/index.umd.js +1 -1
- package/lib/network.d.ts +27 -27
- package/lib/network.d.ts.map +1 -1
- package/lib/ssh/client.d.ts +119 -119
- package/lib/ssh/config_manager.d.ts +54 -54
- package/lib/ssh/index.d.ts +7 -7
- package/lib/ssh/index.d.ts.map +1 -1
- package/lib/ssh/service_manager.d.ts +118 -118
- package/lib/ssh/types.d.ts +43 -44
- package/lib/ssh/types.d.ts.map +1 -1
- package/lib/ssh/utils.d.ts +10 -10
- package/lib/ssh/utils.d.ts.map +1 -1
- package/lib/ssh/wative_server.d.ts +25 -25
- package/lib/ssh/wative_server.d.ts.map +1 -1
- package/lib/tools.d.ts +5 -5
- package/lib/tools.d.ts.map +1 -1
- package/lib/tx_gas_utils.d.ts +17 -17
- package/lib/utils.d.ts +48 -48
- package/lib/utils.d.ts.map +1 -1
- package/lib/wallet-cli.d.ts +1 -1
- package/lib/wallet-cli.esm.js +1 -1
- package/lib/wallet-cli.umd.js +1 -1
- package/lib/wative.d.ts +3 -3
- package/lib/web3.d.ts +58 -58
- package/lib/web3.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/ssh/types.ts +1 -3
- package/src/utils.ts +2 -0
- package/src/ssh/client.rs +0 -221
package/lib/wallet-cli.esm.js
CHANGED
|
@@ -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{getAssociatedTokenAddressSync as u,getMint as d,createAssociatedTokenAccountInstruction as p,createTransferInstruction as m}from"@solana/spl-token";import{Metaplex as w}from"@metaplex-foundation/js";import{BigNumber as g}from"bignumber.js";const h={},f=async e=>{let t=new r(e);return await $t(t.eth.getChainId,[])},y=async(e,t)=>{const a=new r(t);return await $t(a.eth.getBalance,[e])},b=async(e,t)=>{const a=new o(t);return await $t(a.getBalance.bind(a),[new s(e)])},k=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 $t(a.methods.symbol().call.bind(a),[]),o=await $t(a.methods.name().call.bind(a),[]),s=await $t(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"}},v=async(e,t)=>{const a=new o(t),n=w.make(a),r=new s(e),i=await $t(d,[a,r]);let l={status:!0,output:{symbol:"",name:"",decimals:""}};if(!i.status)return{status:!1,output:"Failed to get token decimals"};l.output.decimals=i.output.decimals;try{const e=n.nfts().pdas().metadata({mint:r});if(await a.getAccountInfo(e)){const e=await n.nfts().findByMint({mintAddress:r});l.output.name=e.name,l.output.symbol=e.symbol}}catch(e){return{status:!1,output:"Failed to get token name"}}return l},S=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 $t(n.methods.balanceOf(e).call.bind(n),[]);return o.status?{status:!0,output:o.output}:{status:!1,output:"Failed to get token balance"}},x=async(e,t,a)=>{const n=new o(a),r=u(new s(t),new s(e));let i=await $t(n.getTokenAccountBalance.bind(n),[r]);return i.status?{status:!0,output:i.output.value.amount}:i.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},$=async e=>{const t=new o(e);let a=await $t(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}},N=async(e,t)=>{const a=new o(t);let n=await $t(a.getAccountInfo.bind(a),[new s(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},O=async(e,t,a,n,r)=>{let o;a in h?o=h[a][t]||{}:(h[a]={},o={});for(const a of e)if(a&&!(a in o)){let e;e="0"===t?r?await y(a,n):await b(a,n):r?await S(a,t,n):await x(a,t,n),e.status&&(o[a]=e.output),await Ft(200)}return h[a][t]=o,h},F=(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 h[e][n][r]}catch(e){}}}},P=(e,t)=>{let a=0;if(e in h&&"0"in h[e])for(let n=0;n<t.length;n++)t[n]in h[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},A=["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"],_=[{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"],T=e=>L.includes(e)?9:18,I=e=>L.includes(e)?"solana":"evm",{BN:C}=require("bn.js"),{stripHexPrefix:B}=require("ethereumjs-util"),{BigNumber:j}=require("bignumber.js");function R(e){return new C(B(e.toString("hex")),16)}const z=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function J(e){return z(e.toString(16))}class U{constructor(e){this.query=new r(r.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=J(function(e,t,a){const n=new C(t),r=new C(a);return e.mul(n).div(r)}(R(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 j(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=R(e),r=R(t).muln(.9),o=n.muln(a);return n.gt(r)?J(n):o.lt(r)?J(o):J(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(z(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const q=require("chalk");require("wative-core");const E=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 st(t),r=t.indexOf(a);return 1===r&&(e.from=await We("from",ot)),2===r&&(e.to=await We("to",ot)),3===r&&(e.nonce=await We("nonce")),4===r&&(e.gasPrice=await We("gasPrice")),5===r&&(e.data=await St("data")),6===r&&(e.value=await We("value")),7===r&&(e.gas=await We("gas")),9===r?e:10===r?null:await E(e)},D=async(e,t,a,n,o)=>{const s=await We("to",ot),i=new U(t),l=await i.getGasPrice(),c=new g(l.toString()).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR),u=await We(`Gas price (${c}), agree or enter`,et);let d=u||c;d=new g(d).multipliedBy(1e9).toFixed(0);let p,m,w,h=await(async(e,t)=>{const a=new r(t);let n=await $t(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(s,t);if(!h.status)return void console.log(q.red(h.output));if(p="42161"===e||"421614"===e?"1700000":"21000","0x"===h.output){m="0x";let e=await y(n,t);if(!e.status)return void console.log(q.red(e.output));let r=new g(e.output),o=new g(d),s=r.minus(o.multipliedBy(Number(p))).toFixed(0,g.ROUND_FLOOR),i=new g(s).dividedBy(1e18).toFixed(4,g.ROUND_FLOOR);if(new g(i)<new g(0))return void console.log(q.red("Not enough balance"));w=await G(i,s,a,18)}else m=await St("data",xt),w=await We("value",Ye);const f=await i.getTransactionCount(n),b=await We(`Nonce (${f}), agree or enter`);let k={from:n,to:s,nonce:b||f.toString(),gasPrice:d,data:m,value:w};if("0x"===m)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(q.red("Error: "+e))}k.gasPrice=e}if(k=await E(k),!k)return;const v=await o.account.signTransaction(n,k,t);v.status?(console.log(q.green(`Transaction hash: ${v.output.transactionHash}`)),o.account.sendSignedTransaction(n,v.output.rawTransaction,t),F(e,[n,s],["0"])):console.log(q.red(v.output))},M=async(e,t,a,n,r)=>{const u=await We("to",ot);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 $t(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(q.red(p.output));d.recentBlockhash=p.output.blockhash;const m=await r.account.simulateTransaction(n,t,d);if(!m.status)return void console.log(q.red(m.output));if(!m.output||!m.output.value||0===m.output.value.unitsConsumed||m.output.value.err)return console.log(q.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(m.output,null,4)),void console.log("==============================================");let w=new g(m.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,g.ROUND_CEIL),h=new g(w);const f=await $(t);if(!f.status)return void console.log(q.red(f.output));const y=new g(f.output.toString()),k=h.multipliedBy(y).dividedBy(1e6).toFixed(0,g.ROUND_CEIL),v=await b(n,t);if(!v.status)return void console.log(q.red(v.output));const S=new g(v.output).minus(5e3).minus(k);let x=new g(S).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR);if(new g(x)<new g(0))return void console.log(q.red("Not enough balance"));let N=await G(x,S.toString(),a,9),O=new i;O.add(c.setComputeUnitLimit({units:Number(h)})),O.add(c.setComputeUnitPrice({microLamports:Number(y)})),O.add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:Number(N)})),O.feePayer=new s(n),O.recentBlockhash=p.output.blockhash;const P=await r.account.signTransaction(n,O,t);if(!P.status)return void console.log(q.red(P.output));let A=await r.account.sendSignedTransaction(n,P.output,t);A.status?(F(e,[n,u],["0"]),console.log(q.green(`Transaction hash: ${A.output}`))):console.log(q.red(A.output))},G=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await st(r),s=r.indexOf(o),i="0";if(0===s){let e=await We("value",Ye);i=new g(e).multipliedBy(10**n).toFixed(0,g.ROUND_FLOOR)}else 1===s&&(i=t);return new g(i).isLessThanOrEqualTo(new g(t))?i:(console.log(q.red("Not enough balance")),G(e,t,a,n))},K=async(e,t,a,n,o)=>{let s,i,l;switch(await st(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":l=await We("token ticker");let r=await ze(e,a,l);if(0===r.length)return void console.log(q.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await S(n,r[e].address,t);if(!a.status)return void console.log(q.red(a.output));let s=new g(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,g.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 st(o);const u=r[o.indexOf(c)];s=u.address,i=Number(u.decimals);break;case"> Input token contract address":s=await We("token contract address",ot);let d=await k(s,t);if(!d.status)return void console.log(q.red(d.output));i=Number(d.output.decimals),l=d.output.name}const c=await We("Receipt",ot),u=await S(n,s,t);if(!u.status)return void console.log(q.red(u.output));const d=new U(t),p=await d.getGasPrice(),m=new g(p.toString()).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR),w=await We(`Gas price (${m}), agree or enter`,et);let h=w||m;h=new g(h).multipliedBy(1e9).toFixed(0);let f=await W(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),v=await We(`Nonce (${b}), agree or enter`);let x={from:n,to:s,nonce:v||b.toString(),gasPrice:h,data:y,value:"0"};if("0x"===y)x.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=x.gasPrice;delete x.gasPrice;try{x.gas=(await d.estimateTxGas(x)).toString()}catch(e){return void console.log(q.red("Failed to estimate gas, "+e.message))}x.gasPrice=e}if(x=await E(x),!x)return;const $=await o.account.signTransaction(n,x,t);$.status?(console.log(q.green(`Transaction hash: ${$.output.transactionHash}`)),o.account.sendSignedTransaction(n,$.output.rawTransaction,t),F(a,[n,c],["0",s])):console.log(q.red($.output))},W=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new g(e).dividedBy(10**a).toFixed(4,g.ROUND_FLOOR)} ${t})`],r=await st(n),o=n.indexOf(r),s="0";if(0===o){let e=await We("amount",Ye);s=new g(e).multipliedBy(10**a).toFixed(0,g.ROUND_FLOOR)}else 1===o&&(s=e);return new g(s).isLessThanOrEqualTo(new g(e))?s:(console.log(q.red("Not enough balance")),W(e,t,a))},H=async(e,t,a,r)=>{let o=Ie(e,t,a),l=Fe(e,o),d=Nt(a);if(l!==d&&("evm"===d&&(o="Ethereum Mainnet"),"solana"===d&&(o="Solana Mainnet"),l=Fe(e,o)),"evm"===l){if(await vt(`Network (${o}), want a change?`,!1)){const t=Ce(e);o=await st(t,"Select a network")}}let w=await Te(a,e,o);if(!w.status)return void console.log(q.red(w.output));const h=Pe(e,o);console.log(q.green(` ${h.nativeCurrency.symbol} Balance: ${w.output}`));const f=["> Send Raw Tx","> Send Token",new n.Separator("----------------------------------"),"> Back"];switch(await st(f)){case"> Send Raw Tx":"evm"===d&&await D(h.chainId.toString(),h.rpcUrl,h.nativeCurrency.symbol,a,r),"solana"===d&&await M(h.chainId.toString(),h.rpcUrl,h.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===d&&await K(e,h.rpcUrl,h.chainId.toString(),a,r),"solana"===d&&await(async(e,t,a,n,r)=>{let o,l,d;switch(await st(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":d=await We("token ticker");let r=await ze(e,a,d);if(0===r.length)return void console.log(q.red("Token not found"));let s=[];for(let e=0;e<r.length;e++){const a=await x(n,r[e].address,t);if(!a.status)return void console.log(q.red(a.output));let o=new g(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,g.ROUND_FLOOR);if(1===r.length){s.push(`> 1. ${d} Balance: ${o}`);break}s.push(`> ${e+1}. ${d} Balance: ${o}(${r[e].address})`),s.push(r[e].address)}let i=await st(s);const c=r[s.indexOf(i)];o=c.address,l=Number(c.decimals);break;case"> Input token contract address":o=await We("token contract address",ot);let u=await v(o,t);if(!u.status)return void console.log(q.red(u.output));l=Number(u.output.decimals),d=u.output.name}const w=await We("Receipt",ot),h=await x(n,o,t);if(!h.status)return void console.log(q.red(h.output));let f=await W(h.output,d,l),y=u(new s(o),new s(n),!0);const b=await N(y.toString(),t);if(!b.status)return void console.log(q.red(b.output));if(!b.output||b.output.owner.toString()===s.default)return void console.log(q.red("From token account not found"));let k=u(new s(o),new s(w),!1);const S=await N(k.toString(),t);if(!S.status)return void console.log(q.red(S.output));let O=new i,P=new i;S.output&&S.output.owner.toString()!==s.default||(O.add(p(new s(n),new s(k),new s(w),new s(o))),P.add(p(new s(n),new s(k),new s(w),new s(o)))),O.add(m(y,k,new s(n),Number(f))),O.add(c.setComputeUnitLimit({units:2e5})),O.add(c.setComputeUnitPrice({microLamports:1e3})),O.feePayer=new s(n);const A=await r.account.simulateTransaction(n,t,O);if(!A.status)return void console.log(q.red(A.output));if(!A.output||!A.output.value||0===A.output.value.unitsConsumed||A.output.value.err)return console.log(q.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(A.output,null,4)),void console.log("==============================================");let _=new g(A.output.value.unitsConsumed.toString());_=new g(Math.ceil(1.2*Number(_)));const L=await $(t);if(!L.status)return void console.log(q.red(L.output));const T=new g(L.output.toString());P.add(m(y,k,new s(n),Number(f))),P.add(c.setComputeUnitLimit({units:Number(_)})),P.add(c.setComputeUnitPrice({microLamports:Number(T)})),O.feePayer=new s(n);const I=await r.account.signTransaction(n,P,t);if(!I.status)return void console.log(q.red(I.output));let C=await r.account.sendSignedTransaction(n,I.output,t);C.status?(F(a,[n,w],["0",o]),console.log(q.green(`Transaction hash: ${C.output}`))):console.log(q.red(C.output))})(e,h.rpcUrl,h.chainId.toString(),a,r);break;case"> Back":return}},Z=async(e,t,a,r)=>{const o=["> SendTx","> SignMessage",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> SendTx":await H(e,t,a,r);break;case"> SignMessage":{const e=await St("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(q.red(t.output));break}console.log(q.green("Signature: "+t.output));break}case"> Back":return}await Z(e,t,a,r)},V=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new n.Separator("----------------------------------"),"> Back"],o=await st(r);if("> Back"===o)return;"> Send Tx"===o&&(a=await We("Input address to send tx",ot)),"> Search Accounts"===o&&(a=await We("Input part address to send tx",Qe));let s=t.account.getAccountLabel(a);if(null===s)return console.log(q.red("Account not found")),void await V(e,t);let i=s.account_label,l=mt(e,i);if(a=s.account_address,null===i)return console.log(q.red("Account not found")),void await V(e,t);const c=await Ze(e,i,a);if(null===c)return console.log(q.red("Account not found")),void await V(e,t);console.log(q.green(`Address found!\n address: ${a}\n account name: [${l}]\n account index: #${c}`)),(await se(e,i,t)).isLoginIn?(await Z(e,i,a,t),await V(e,t)):await V(e,t)},X=require("chalk");require("dotenv").config();const Q=require("cli-progress");require("wative-core");const Y={keystore_slug:"",default_account_index:0},ee=async e=>{const t=ne(e);let a=[];t.accounts&&(a=t.accounts);let n=await ht("Account Name",a);return null===n?null:{account_name:n,password:await kt(`Please set a password for Account [${n}]`),selected_default_network:await Oe(e)}},te=async(a,n,r,o,s,i,l)=>{let c=await Pe(a,s);"evm"!==I(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(X.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(X.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()},ae=async(a,r)=>{const o=["> Import Passphrase","> Import Private Key",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> Import Passphrase":await(async(a,n)=>{let r=await ee(a);if(!r)return;let o=await bt("Please enter a mnemonic [split by space]",tt);o=o.replace(/\s+/g," ");let s=wt(r.account_name);const i=n.account.generatePPAccount(s,o,r.password);if(!i.status)return void console.log(X.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 ee(a);if(!r)return;let o=await ft("Please enter a private key"),s=wt(r.account_name);await te(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()},ne=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8"))},re=(a,n)=>{const r=t.join(a,`accounts/${n}.json`);return JSON.parse(e.readFileSync(r,"utf8"))},oe=(a,n,r)=>{const o=t.join(a,`accounts/${n}.json`);e.writeFileSync(o,JSON.stringify(r,null,4))},se=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=mt(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 yt(`Please input the password for Account [${r}]`),!n)return console.log(X.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 st(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},ie=async(e,t)=>{const a=ne(e).accounts;let r=["> Back",new n.Separator("----------------------------------")];const o=a.length;if(0===o)return void console.log(X.red("No address here yet"));for(let t=0;t<o;t++){const n=a[t],o=wt(n),s=re(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 st(r,"Select an account");if("> Back"===s)return;const i=a[r.indexOf(s)-2],l=wt(i);console.log(X.green(`Keystore slug: [${l}]`));let c=await se(e,l,t);c.isLoginIn&&await ce(e,l,t,c.password),await ie(e,t)},le=async(e,t,a)=>{const r=await re(e,t);let o=["> Disabled Slots","> Add Single","> Add Range",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(X.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=Fe(e,l),m=Fe(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 st(s);if("> Back"===l)break;if(!await vt(`Are you sure to delete the ${l}?`,!0))break;let c=s.indexOf(l)-2;r.disabled_slots.splice(c,1),oe(e,t,r);break}case"> Add Single":{let a=await Ve(r,"Input address or index");if(null===a){console.log(X.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],oe(e,t,r);break}case"> Add Range":{let a=await He(r);if(!a){console.log(X.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],oe(e,t,r);break}}await le(e,t)},ce=async(a,r,o,s)=>{let i,l=await re(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 st(i)){case"> Address List":await ue(a,r,o);break;case"> Expand Address":{const e=await We("Expand accounts count",at);if(Number(e)>2e3){console.log(X.red("Too many accounts, please input less than 2000"));break}await pe(a,r,Number(e),o);break}case"> Import Private Key":await(async(a,n,r,o)=>{let s=await We("Please enter a private key"),i=t.join(a,`accounts/${r}.json`),l=JSON.parse(e.readFileSync(i,"utf8"));await te(a,n,r,s,l.default_network,o,!1)})(a,s,r,o);break;case"> Slice Address":{const e=await We("Please input last account number",nt);await me(a,r,Number(e),o);break}case"> Remove Address":await we(a,r,o);break;case"> Disable Address":await le(a,r);break;case"> Reset Account Password":{let e=mt(a,r);const t=await kt(`Please input new password for Account [${e}]`),n=await kt(`Please confirm new password for Account [${e}]`);if(!t||!n||t!==n){console.log(X.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 ge(a,r);case"> Back":return}await ce(a,r,o,s)},ue=async(e,t,a)=>{const r=await re(e,t);let o=["> Back",new n.Separator("----------------------------------")],s=r.disabled_slots,i=Be(e),l=r.default_network,c=Pe(e,l),u=I(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(X.yellow(`#${e.toString().padEnd(d)} ${Pt(t,i.fullAddr)} ${l}`))):o.push(`#${e.toString().padEnd(d)} ${Pt(t,i.fullAddr)} ${l}`)}let p,m=Y.keystore_slug===t?o[Y.account_index]:o[0],w=Y.keystore_slug===t&&Y.account_index>0,g=await Re(e,c.chainId.toString());if(w&&Y.account_index>15){let e=o.slice(0,Y.account_index-15);p=o.slice(Y.account_index-15).concat(e)}else p=o.slice(0);let h=await It(p,"evm"===u,e,g,c,i.gasToken,i.extendedToken,w,"Select an account",m);"> Back"!==h&&(Y.keystore_slug=t,Y.account_index=o.indexOf(h),await de(e,t,o.indexOf(h)-2,a),await ue(e,t,a))},de=async(e,t,a,r)=>{const o=await re(e,t);let s=o.default_network,i=Ae(e,t,a);const l=await Pe(e,s),c=await Te(i,e,s);c.status?console.log(X.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(X.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 st(d)){case"> Tools":await Z(e,t,i,r);break;case"> Show address":await _e(e,t,a);break;case"> Assets":await Je(e,s,i);break;case"> Reload balances":await Ue(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 We(n,Xe);o.data[a].tag=r.replace(/\s+/g," ").trim(),oe(e,t,o);break}case"> Dump private key":{let n=Ae(e,t,a),o=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",o);break}case"> Back":return}},pe=async(e,t,a,n)=>{const r=await re(e,t),o=r.data.length,s=new Q.SingleBar({},Q.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(X.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),oe(e,t,r),n.account.reloadAccount()},me=async(e,t,a,n)=>{const r=await re(e,t);r.data=r.data.slice(0,a+1),oe(e,t,r),n.account.reloadAccount()},we=async(e,t,a)=>{let n=await We("Please input the accountIndex to remove this account",Ye);if("0"===n)return void console.log(X.red("Can't remove the first account"));let r=await re(e,t);await vt(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),oe(e,t,r),a.account.reloadAccount())},ge=async(a,n)=>{let r=await We("Please input the account name to remove this account"),o=mt(a,n);if(r!==o)return void console.log(X.red("Can't remove this account"));if(!await vt(`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))},he=async(a,r)=>{const o=t.resolve(a,"accounts");e.existsSync(o)||e.mkdirSync(o);let s;switch(s=0===ne(a).accounts.length?["> Create a new account",new n.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new n.Separator("----------------------------------"),"> Back"],await st(s)){case"> Select an account":await ie(a,r);break;case"> Create a new account":await ae(a,r);break;case"> Back":return}await he(a,r)},fe=require("chalk"),ye=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 ct(n.chainId.toString(),`Rpc Url (default: ${n.rpcUrl})`,!0);else{if(u=await We(`Chain Name (default: ${n.name})`),u&&u!==n.name&&s.includes(u))return void console.log(fe.red("Chain Name already exists"));l=await lt(`Chain Id (default: ${n.chainId})`,!0),i=await ct(l||n.chainId,`RPC Url (default: ${n.rpcUrl})`,!0),c=await dt(`Symbol (default: ${n.nativeCurrency.symbol})`),d=await ut(n.multicallAddress?`Multicall Address (Optional) (default: ${n.multicallAddress})`:"Multicall Address (Optional)"),p=await pt(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=T(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))},be=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))},ke=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"===I(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 st(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(fe.green("Please input someting about network"));const s=await We("Chain Name");if(o.includes(s))return void console.log(fe.red("Chain Name already exists"));const i=await lt("Chain Id");if(!i)return;const l=await ct(i,"RPC Url");if(!l)return;const c=await dt("Symbol");if(!c)return;const u=await ut("Multicall Address (Optional)"),d=await pt("Color (Optional)");let p=T(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 st(a)){case"> Edit":await ye(e,t);break;case"> Remove":await be(e,t)}})(a,u),await ke(a)},ve=async e=>{let t=["> Enhanced Balance Display",new n.Separator("----------------------------------"),"> Back"];switch(await st(t)){case"> Enhanced Balance Display":await $e(e);break;case"> Back":return}await ve(e)},Se=async()=>{switch(await st(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},xe=(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8")).showTokens;return n in o?o[n]:[]},$e=async a=>{const r=["> Status","> Token List","> Add Token",new n.Separator("----------------------------------"),"> Back"];switch(await st(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 st(s);"> Back"!==i&&(i.includes("Full Address")?o.status.fullAddr=await Se():i.includes("Gas Token")?o.status.gasToken=await Se():i.includes("Extended Token")&&(o.status.extendedToken=await Se()),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(!Ot(i))return void console.log(fe.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=xe(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: ${fe.green(`${Pt(n.address).padEnd(45)}`)} Decimals: ${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: ${fe.green(`${Pt(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals?n.display_decimals:"4"}`)}}let p=await it(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 qe(a);break;case"> Back":return}await $e(a)},Ne=async e=>{let t=["> Networks","> Dataview",new n.Separator("----------------------------------"),"> Back"];switch(await st(t)){case"> Networks":await ke(e);break;case"> Dataview":await ve(e);break;case"> Back":return}await Ne(e)},Oe=async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks.map(e=>`> ${e.name}`);return(await st(r,"Please select a default network")).slice(2)},Fe=(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 I(t.chainId.toString())}return"unknown"},Pe=(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},Ae=(e,t,a)=>{const n=re(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Fe(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},_e=async(a,n,r)=>{const o=t.resolve(a,"network.json"),s=JSON.parse(e.readFileSync(o,"utf8")).networks,i=s.length;let l=re(a,n),c=l.default_network;const u=Fe(a,c);for(let e=0;e<i;e++){const t=s[e],n=Fe(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=re(a,r),u=["> Back",new n.Separator("----------------------------------")],d=c.default_network,p="";o||(p=c.ciphertexts.address);let m=[];const w=Fe(a,d);for(let e=0;e<l;e++){const t=i[e],n=Fe(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 st(u);if("> Back"===g)return;let h=u.indexOf(g);if(c.default_network=m[h-2],oe(a,r,c),!o){let e=c.default_network,t=Pe(a,e);console.log(fe.green(` Address No: #0\n Network: ${e}\n ${t.nativeCurrency.symbol} Balance: 0`))}},Te=async(e,t,a)=>{const n=Pe(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===I(n.chainId.toString())?await b(e,r):await y(e,r),s.status){let e=new g(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,g.ROUND_FLOOR)}return F(n.chainId.toString(),[e],["0"]),s},Ie=(e,t,a)=>{const n=re(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},Ce=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"===I(r[e].chainId.toString())&&s.push(r[e].name);return s},Be=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8")).status},je=require("chalk"),Re=async(a,n)=>{let r=t.join(a,"assets.json");if(!Ot(r))return[];const o=e.readFileSync(r).toString(),s=JSON.parse(o);return n in s?s[n]:[]},ze=async(e,t,a)=>{const n=await Re(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},Je=async(e,t,a)=>{const n=Pe(e,t),r=I(n.chainId.toString()),o=await Re(e,n.chainId.toString());if(!o)return void console.log(je.red("No asset found"));const s=await Ee(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(je.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(je.red("No asset found"))},Ue=async(e,t,a)=>{const n=Pe(e,t);let r=(await Re(e,n.chainId.toString())).map(e=>e.address);r.push("0"),F(n.chainId.toString(),[a],r)},qe=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 st(r)).split(".")[1].trim();const i=Fe(a,s),l=Pe(a,s),c=await We("Enter contract address",ot);let u;if("evm"===i){if(!(d=c).startsWith("0x")||42!==d.length)return void console.log(je.red("evm address format error"));u=await k(c,l.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(c))return void console.log(je.red("solana address format error"));u=await v(c,l.rpcUrl)}var d;if(!u.status)return void console.log(je.red(u.output));u.output.name||(u.output.name=await We("Please input token name")),u.output.symbol||(u.output.symbol=await We("Please input token symbol")),console.log(je.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let p=await We("Enter decimals for display",Ye);p=parseInt(p),await(async(a,n,r,o,s,i,l)=>{let c=t.join(a,"assets.json"),u={};if(Ot(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)},Ee=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(S(e,o.address,a)):"solana"===n&&s.push(x(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(je.red(i[a].output)),null;let s=new g(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,g.ROUND_FLOOR);l.push({address:n.address,symbol:n.symbol,balance:s}),F(r,[e],[n.address])}return F(r,[e],["0"]),l},De=async(e,t,a,n,r,o,s)=>{let i=a.length,l=Pe(e,r),c="evm"===I(l.chainId.toString());if(o&&await O(t,"0",l.chainId.toString(),n,c),s){let o=xe(e,r);for(let e=0;e<i;e++){let r=a[e].address;o.includes(r)&&await O(t,r,l.chainId.toString(),n,c)}}let u=((e,t,a,n)=>{let r={};if(!(e in h))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";h[e][n.address]&&(o in h[e][n.address]&&(s=new g(h[e][n.address][o]).dividedBy(10**n.decimals).toFixed(n.display_decimals||4,g.ROUND_FLOOR)),r[o]||(r[o]={}),r[o][n.symbol]=s)}}return r})(l.chainId.toString(),t,a,l);return u},Me=require("chalk"),Ge=process.env.HOME||process.env.USERPROFILE,Ke=`${Ge}/.wative`,We=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},He=async e=>{for(let t=0;t<5;t++){let t=await Ve(e,"Input start address or index");if(!t)return console.log(Me.red("Invalid start account index")),null;let a=await Ve(e,"Input end address or index");if(!a)return console.log(Me.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(Me.red("Invalid address range"))}return null},Ze=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},Ve=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 We(t,rt),a=Nt(e);if("unknown"===a){if(Number(e)>s){console.log(Me.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},Xe=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"),Qe=e=>!(e.length<6)||"Address length should be greater than 6",Ye=e=>!isNaN(Number(e))||"Value should be a number",et=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",tt=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===A.includes(t[e]))return"Passphrase word should be valid";return!0},at=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},nt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},rt=e=>!1===isNaN(Number(e))||ot(e),ot=e=>"unknown"!=Nt(e)||"Address should be valid",st=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()},it=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},lt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await We(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},ct=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await We(t);try{if(""===n&&a)return null;if("solana"===I(e.toString()))return n;const t=await f(n);if(!t.status){console.log(Me.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(Me.red("Rpc url not match chain id"))}catch(e){console.log(Me.red(e.message))}}return null},ut=async e=>{for(let t=0;t<5;t++){let t=await We(e);if(""===t)return null;""===t||42===t.length||console.log(Me.red("Multicall address length must be 42"))}return null},dt=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await We(e);if(""===a)return null;if(t.test(a))return a}return null},pt=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await We(e);if(""===a)return null;if(t.test(a))return a}return null},mt=(e,t)=>{const a=ne(e).accounts,n=gt(a).indexOf(t);return-1!==n?a[n]:t},wt=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),gt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(wt(e[a]));return t},ht=async(e,t)=>{let a=gt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await We(e);t=t.trim();let r=wt(t);if(n.test(r)){if(a.includes(r)){console.log(Me.red("Account name already exists"));continue}return t}}return null},ft=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},yt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await n.prompt(t);return a},bt=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()},kt=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=Me.green("✔"),s=Me.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},vt=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await n.prompt(a);return r},St=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await n.prompt(a);return r.trim().toString()},xt=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},$t=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},Nt=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",Ot=t=>(t=t.trim(),e.existsSync(t)),Ft=e=>new Promise(t=>setTimeout(t,e)),Pt=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),At=(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},_t=(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=At(e[n],t);a.push(r)}return a.concat(a)},Tt=(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}`}},It=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 Ft(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}=_t(w,e,a.length),s=a.slice(n,r);if(!P(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}=_t(w,e,n.length),d=n.slice(c,u);let h=await De(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;Tt(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 Ct=async(e,t)=>{switch(await st(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await Ne(e);break;case"> Accounts":await he(e,t);break;case"> Tools":await V(e,t);break;case"> Exit":return}await Ct(e,t)},{WativeCore:Bt}=require("wative-core"),jt=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:",jt.version),console.log(Me.green(a.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const n=await(async()=>{let t=await We(`Keystore storage located in (default: ${Ke})`);return t||(t=Ke),t=t.trim(),t=t.replace("~",Ge),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:_,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=wt(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=gt(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=gt(o.accounts);const i=new Bt(n,s,null,!0);await Ct(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{getAssociatedTokenAddressSync as u,getMint as d,createAssociatedTokenAccountInstruction as p,createTransferInstruction as m}from"@solana/spl-token";import{Metaplex as w}from"@metaplex-foundation/js";import{BigNumber as g}from"bignumber.js";const h={},f=async e=>{let t=new r(e);return await $t(t.eth.getChainId,[])},y=async(e,t)=>{const a=new r(t);return await $t(a.eth.getBalance,[e])},b=async(e,t)=>{const a=new o(t);return await $t(a.getBalance.bind(a),[new s(e)])},k=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 $t(a.methods.symbol().call.bind(a),[]),o=await $t(a.methods.name().call.bind(a),[]),s=await $t(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"}},v=async(e,t)=>{const a=new o(t),n=w.make(a),r=new s(e),i=await $t(d,[a,r]);let l={status:!0,output:{symbol:"",name:"",decimals:""}};if(!i.status)return{status:!1,output:"Failed to get token decimals"};l.output.decimals=i.output.decimals;try{const e=n.nfts().pdas().metadata({mint:r});if(await a.getAccountInfo(e)){const e=await n.nfts().findByMint({mintAddress:r});l.output.name=e.name,l.output.symbol=e.symbol}}catch(e){return{status:!1,output:"Failed to get token name"}}return l},S=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 $t(n.methods.balanceOf(e).call.bind(n),[]);return o.status?{status:!0,output:o.output}:{status:!1,output:"Failed to get token balance"}},x=async(e,t,a)=>{const n=new o(a),r=u(new s(t),new s(e));let i=await $t(n.getTokenAccountBalance.bind(n),[r]);return i.status?{status:!0,output:i.output.value.amount}:i.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},$=async e=>{const t=new o(e);let a=await $t(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}},N=async(e,t)=>{const a=new o(t);let n=await $t(a.getAccountInfo.bind(a),[new s(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},O=async(e,t,a,n,r)=>{let o;a in h?o=h[a][t]||{}:(h[a]={},o={});for(const a of e)if(a&&!(a in o)){let e;e="0"===t?r?await y(a,n):await b(a,n):r?await S(a,t,n):await x(a,t,n),e.status&&(o[a]=e.output),await Ft(200)}return h[a][t]=o,h},F=(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 h[e][n][r]}catch(e){}}}},P=(e,t)=>{let a=0;if(e in h&&"0"in h[e])for(let n=0;n<t.length;n++)t[n]in h[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},A=["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"],_=[{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"],T=e=>L.includes(e)?9:18,I=e=>L.includes(e)?"solana":"evm",{BN:C}=require("bn.js"),{stripHexPrefix:B}=require("ethereumjs-util"),{BigNumber:j}=require("bignumber.js");function R(e){return new C(B(e.toString("hex")),16)}const z=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function J(e){return z(e.toString(16))}class U{constructor(e){this.query=new r(r.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=J(function(e,t,a){const n=new C(t),r=new C(a);return e.mul(n).div(r)}(R(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 j(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=R(e),r=R(t).muln(.9),o=n.muln(a);return n.gt(r)?J(n):o.lt(r)?J(o):J(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(z(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const q=require("chalk");require("wative-core");const E=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 st(t),r=t.indexOf(a);return 1===r&&(e.from=await We("from",ot)),2===r&&(e.to=await We("to",ot)),3===r&&(e.nonce=await We("nonce")),4===r&&(e.gasPrice=await We("gasPrice")),5===r&&(e.data=await St("data")),6===r&&(e.value=await We("value")),7===r&&(e.gas=await We("gas")),9===r?e:10===r?null:await E(e)},D=async(e,t,a,n,o)=>{const s=await We("to",ot),i=new U(t),l=await i.getGasPrice(),c=new g(l.toString()).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR),u=await We(`Gas price (${c}), agree or enter`,et);let d=u||c;d=new g(d).multipliedBy(1e9).toFixed(0);let p,m,w,h=await(async(e,t)=>{const a=new r(t);let n=await $t(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(s,t);if(!h.status)return void console.log(q.red(h.output));if(p="42161"===e||"421614"===e?"1700000":"21000","0x"===h.output){m="0x";let e=await y(n,t);if(!e.status)return void console.log(q.red(e.output));let r=new g(e.output),o=new g(d),s=r.minus(o.multipliedBy(Number(p))).toFixed(0,g.ROUND_FLOOR),i=new g(s).dividedBy(1e18).toFixed(4,g.ROUND_FLOOR);if(new g(i)<new g(0))return void console.log(q.red("Not enough balance"));w=await G(i,s,a,18)}else m=await St("data",xt),w=await We("value",Ye);const f=await i.getTransactionCount(n),b=await We(`Nonce (${f}), agree or enter`);let k={from:n,to:s,nonce:b||f.toString(),gasPrice:d,data:m,value:w};if("0x"===m)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(q.red("Error: "+e))}k.gasPrice=e}if(k=await E(k),!k)return;const v=await o.account.signTransaction(n,k,t);v.status?(console.log(q.green(`Transaction hash: ${v.output.transactionHash}`)),o.account.sendSignedTransaction(n,v.output.rawTransaction,t),F(e,[n,s],["0"])):console.log(q.red(v.output))},M=async(e,t,a,n,r)=>{const u=await We("to",ot);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 $t(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(q.red(p.output));d.recentBlockhash=p.output.blockhash;const m=await r.account.simulateTransaction(n,t,d);if(!m.status)return void console.log(q.red(m.output));if(!m.output||!m.output.value||0===m.output.value.unitsConsumed||m.output.value.err)return console.log(q.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(m.output,null,4)),void console.log("==============================================");let w=new g(m.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,g.ROUND_CEIL),h=new g(w);const f=await $(t);if(!f.status)return void console.log(q.red(f.output));const y=new g(f.output.toString()),k=h.multipliedBy(y).dividedBy(1e6).toFixed(0,g.ROUND_CEIL),v=await b(n,t);if(!v.status)return void console.log(q.red(v.output));const S=new g(v.output).minus(5e3).minus(k);let x=new g(S).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR);if(new g(x)<new g(0))return void console.log(q.red("Not enough balance"));let N=await G(x,S.toString(),a,9),O=new i;O.add(c.setComputeUnitLimit({units:Number(h)})),O.add(c.setComputeUnitPrice({microLamports:Number(y)})),O.add(l.transfer({fromPubkey:new s(n),toPubkey:new s(u),lamports:Number(N)})),O.feePayer=new s(n),O.recentBlockhash=p.output.blockhash;const P=await r.account.signTransaction(n,O,t);if(!P.status)return void console.log(q.red(P.output));let A=await r.account.sendSignedTransaction(n,P.output,t);A.status?(F(e,[n,u],["0"]),console.log(q.green(`Transaction hash: ${A.output}`))):console.log(q.red(A.output))},G=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await st(r),s=r.indexOf(o),i="0";if(0===s){let e=await We("value",Ye);i=new g(e).multipliedBy(10**n).toFixed(0,g.ROUND_FLOOR)}else 1===s&&(i=t);return new g(i).isLessThanOrEqualTo(new g(t))?i:(console.log(q.red("Not enough balance")),G(e,t,a,n))},K=async(e,t,a,n,o)=>{let s,i,l;switch(await st(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":l=await We("token ticker");let r=await ze(e,a,l);if(0===r.length)return void console.log(q.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await S(n,r[e].address,t);if(!a.status)return void console.log(q.red(a.output));let s=new g(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,g.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 st(o);const u=r[o.indexOf(c)];s=u.address,i=Number(u.decimals);break;case"> Input token contract address":s=await We("token contract address",ot);let d=await k(s,t);if(!d.status)return void console.log(q.red(d.output));i=Number(d.output.decimals),l=d.output.name}const c=await We("Receipt",ot),u=await S(n,s,t);if(!u.status)return void console.log(q.red(u.output));const d=new U(t),p=await d.getGasPrice(),m=new g(p.toString()).dividedBy(1e9).toFixed(4,g.ROUND_FLOOR),w=await We(`Gas price (${m}), agree or enter`,et);let h=w||m;h=new g(h).multipliedBy(1e9).toFixed(0);let f=await W(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),v=await We(`Nonce (${b}), agree or enter`);let x={from:n,to:s,nonce:v||b.toString(),gasPrice:h,data:y,value:"0"};if("0x"===y)x.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=x.gasPrice;delete x.gasPrice;try{x.gas=(await d.estimateTxGas(x)).toString()}catch(e){return void console.log(q.red("Failed to estimate gas, "+e.message))}x.gasPrice=e}if(x=await E(x),!x)return;const $=await o.account.signTransaction(n,x,t);$.status?(console.log(q.green(`Transaction hash: ${$.output.transactionHash}`)),o.account.sendSignedTransaction(n,$.output.rawTransaction,t),F(a,[n,c],["0",s])):console.log(q.red($.output))},W=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new g(e).dividedBy(10**a).toFixed(4,g.ROUND_FLOOR)} ${t})`],r=await st(n),o=n.indexOf(r),s="0";if(0===o){let e=await We("amount",Ye);s=new g(e).multipliedBy(10**a).toFixed(0,g.ROUND_FLOOR)}else 1===o&&(s=e);return new g(s).isLessThanOrEqualTo(new g(e))?s:(console.log(q.red("Not enough balance")),W(e,t,a))},H=async(e,t,a,r)=>{let o=Ie(e,t,a),l=Fe(e,o),d=Nt(a);if(l!==d&&("evm"===d&&(o="Ethereum Mainnet"),"solana"===d&&(o="Solana Mainnet"),l=Fe(e,o)),"evm"===l){if(await vt(`Network (${o}), want a change?`,!1)){const t=Ce(e);o=await st(t,"Select a network")}}let w=await Te(a,e,o);if(!w.status)return void console.log(q.red(w.output));const h=Pe(e,o);console.log(q.green(` ${h.nativeCurrency.symbol} Balance: ${w.output}`));const f=["> Send Raw Tx","> Send Token",new n.Separator("----------------------------------"),"> Back"];switch(await st(f)){case"> Send Raw Tx":"evm"===d&&await D(h.chainId.toString(),h.rpcUrl,h.nativeCurrency.symbol,a,r),"solana"===d&&await M(h.chainId.toString(),h.rpcUrl,h.nativeCurrency.symbol,a,r);break;case"> Send Token":"evm"===d&&await K(e,h.rpcUrl,h.chainId.toString(),a,r),"solana"===d&&await(async(e,t,a,n,r)=>{let o,l,d;switch(await st(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":d=await We("token ticker");let r=await ze(e,a,d);if(0===r.length)return void console.log(q.red("Token not found"));let s=[];for(let e=0;e<r.length;e++){const a=await x(n,r[e].address,t);if(!a.status)return void console.log(q.red(a.output));let o=new g(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,g.ROUND_FLOOR);if(1===r.length){s.push(`> 1. ${d} Balance: ${o}`);break}s.push(`> ${e+1}. ${d} Balance: ${o}(${r[e].address})`),s.push(r[e].address)}let i=await st(s);const c=r[s.indexOf(i)];o=c.address,l=Number(c.decimals);break;case"> Input token contract address":o=await We("token contract address",ot);let u=await v(o,t);if(!u.status)return void console.log(q.red(u.output));l=Number(u.output.decimals),d=u.output.name}const w=await We("Receipt",ot),h=await x(n,o,t);if(!h.status)return void console.log(q.red(h.output));let f=await W(h.output,d,l),y=u(new s(o),new s(n),!0);const b=await N(y.toString(),t);if(!b.status)return void console.log(q.red(b.output));if(!b.output||b.output.owner.toString()===s.default)return void console.log(q.red("From token account not found"));let k=u(new s(o),new s(w),!1);const S=await N(k.toString(),t);if(!S.status)return void console.log(q.red(S.output));let O=new i,P=new i;S.output&&S.output.owner.toString()!==s.default||(O.add(p(new s(n),new s(k),new s(w),new s(o))),P.add(p(new s(n),new s(k),new s(w),new s(o)))),O.add(m(y,k,new s(n),Number(f))),O.add(c.setComputeUnitLimit({units:2e5})),O.add(c.setComputeUnitPrice({microLamports:1e3})),O.feePayer=new s(n);const A=await r.account.simulateTransaction(n,t,O);if(!A.status)return void console.log(q.red(A.output));if(!A.output||!A.output.value||0===A.output.value.unitsConsumed||A.output.value.err)return console.log(q.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(A.output,null,4)),void console.log("==============================================");let _=new g(A.output.value.unitsConsumed.toString());_=new g(Math.ceil(1.2*Number(_)));const L=await $(t);if(!L.status)return void console.log(q.red(L.output));const T=new g(L.output.toString());P.add(m(y,k,new s(n),Number(f))),P.add(c.setComputeUnitLimit({units:Number(_)})),P.add(c.setComputeUnitPrice({microLamports:Number(T)})),O.feePayer=new s(n);const I=await r.account.signTransaction(n,P,t);if(!I.status)return void console.log(q.red(I.output));let C=await r.account.sendSignedTransaction(n,I.output,t);C.status?(F(a,[n,w],["0",o]),console.log(q.green(`Transaction hash: ${C.output}`))):console.log(q.red(C.output))})(e,h.rpcUrl,h.chainId.toString(),a,r);break;case"> Back":return}},Z=async(e,t,a,r)=>{const o=["> SendTx","> SignMessage",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> SendTx":await H(e,t,a,r);break;case"> SignMessage":{const e=await St("Input the message to sign"),t=r.account.signMessage(a,e);if(!t.status){console.log(q.red(t.output));break}console.log(q.green("Signature: "+t.output));break}case"> Back":return}await Z(e,t,a,r)},V=async(e,t)=>{let a,r=["> Send Tx","> Search Accounts",new n.Separator("----------------------------------"),"> Back"],o=await st(r);if("> Back"===o)return;"> Send Tx"===o&&(a=await We("Input address to send tx",ot)),"> Search Accounts"===o&&(a=await We("Input part address to send tx",Qe));let s=t.account.getAccountLabel(a);if(null===s)return console.log(q.red("Account not found")),void await V(e,t);let i=s.account_label,l=mt(e,i);if(a=s.account_address,null===i)return console.log(q.red("Account not found")),void await V(e,t);const c=await Ze(e,i,a);if(null===c)return console.log(q.red("Account not found")),void await V(e,t);console.log(q.green(`Address found!\n address: ${a}\n account name: [${l}]\n account index: #${c}`)),(await se(e,i,t)).isLoginIn?(await Z(e,i,a,t),await V(e,t)):await V(e,t)},X=require("chalk");require("dotenv").config();const Q=require("cli-progress");require("wative-core");const Y={keystore_slug:"",default_account_index:0},ee=async e=>{const t=ne(e);let a=[];t.accounts&&(a=t.accounts);let n=await ht("Account Name",a);return null===n?null:{account_name:n,password:await kt(`Please set a password for Account [${n}]`),selected_default_network:await Oe(e)}},te=async(a,n,r,o,s,i,l)=>{let c=await Pe(a,s);"evm"!==I(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(X.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(X.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()},ae=async(a,r)=>{const o=["> Import Passphrase","> Import Private Key",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> Import Passphrase":await(async(a,n)=>{let r=await ee(a);if(!r)return;let o=await bt("Please enter a mnemonic [split by space]",tt);o=o.replace(/\s+/g," ");let s=wt(r.account_name);const i=n.account.generatePPAccount(s,o,r.password);if(!i.status)return void console.log(X.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 ee(a);if(!r)return;let o=await ft("Please enter a private key"),s=wt(r.account_name);await te(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()},ne=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8"))},re=(a,n)=>{const r=t.join(a,`accounts/${n}.json`);return JSON.parse(e.readFileSync(r,"utf8"))},oe=(a,n,r)=>{const o=t.join(a,`accounts/${n}.json`);e.writeFileSync(o,JSON.stringify(r,null,4))},se=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=mt(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 yt(`Please input the password for Account [${r}]`),!n)return console.log(X.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 st(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},ie=async(e,t)=>{const a=ne(e).accounts;let r=["> Back",new n.Separator("----------------------------------")];const o=a.length;if(0===o)return void console.log(X.red("No address here yet"));for(let t=0;t<o;t++){const n=a[t],o=wt(n),s=re(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 st(r,"Select an account");if("> Back"===s)return;const i=a[r.indexOf(s)-2],l=wt(i);console.log(X.green(`Keystore slug: [${l}]`));let c=await se(e,l,t);c.isLoginIn&&await ce(e,l,t,c.password),await ie(e,t)},le=async(e,t,a)=>{const r=await re(e,t);let o=["> Disabled Slots","> Add Single","> Add Range",new n.Separator("----------------------------------"),"> Back"];switch(await st(o)){case"> Back":return;case"> Disabled Slots":{let a=r.disabled_slots;if(!a||0===a.length){console.log(X.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=Fe(e,l),m=Fe(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 st(s);if("> Back"===l)break;if(!await vt(`Are you sure to delete the ${l}?`,!0))break;let c=s.indexOf(l)-2;r.disabled_slots.splice(c,1),oe(e,t,r);break}case"> Add Single":{let a=await Ve(r,"Input address or index");if(null===a){console.log(X.red("Invalid account index"));break}r.disabled_slots?r.disabled_slots.push({from:a,to:a}):r.disabled_slots=[{from:a,to:a}],oe(e,t,r);break}case"> Add Range":{let a=await He(r);if(!a){console.log(X.red("Invalid account range"));break}r.disabled_slots?r.disabled_slots.push(a):r.disabled_slots=[a],oe(e,t,r);break}}await le(e,t)},ce=async(a,r,o,s)=>{let i,l=await re(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 st(i)){case"> Address List":await ue(a,r,o);break;case"> Expand Address":{const e=await We("Expand accounts count",at);if(Number(e)>2e3){console.log(X.red("Too many accounts, please input less than 2000"));break}await pe(a,r,Number(e),o);break}case"> Import Private Key":await(async(a,n,r,o)=>{let s=await We("Please enter a private key"),i=t.join(a,`accounts/${r}.json`),l=JSON.parse(e.readFileSync(i,"utf8"));await te(a,n,r,s,l.default_network,o,!1)})(a,s,r,o);break;case"> Slice Address":{const e=await We("Please input last account number",nt);await me(a,r,Number(e),o);break}case"> Remove Address":await we(a,r,o);break;case"> Disable Address":await le(a,r);break;case"> Reset Account Password":{let e=mt(a,r);const t=await kt(`Please input new password for Account [${e}]`),n=await kt(`Please confirm new password for Account [${e}]`);if(!t||!n||t!==n){console.log(X.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 ge(a,r);case"> Back":return}await ce(a,r,o,s)},ue=async(e,t,a)=>{const r=await re(e,t);let o=["> Back",new n.Separator("----------------------------------")],s=r.disabled_slots,i=Be(e),l=r.default_network,c=Pe(e,l),u=I(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(X.yellow(`#${e.toString().padEnd(d)} ${Pt(t,i.fullAddr)} ${l}`))):o.push(`#${e.toString().padEnd(d)} ${Pt(t,i.fullAddr)} ${l}`)}let p,m=Y.keystore_slug===t?o[Y.account_index]:o[0],w=Y.keystore_slug===t&&Y.account_index>0,g=await Re(e,c.chainId.toString());if(w&&Y.account_index>15){let e=o.slice(0,Y.account_index-15);p=o.slice(Y.account_index-15).concat(e)}else p=o.slice(0);let h=await It(p,"evm"===u,e,g,c,i.gasToken,i.extendedToken,w,"Select an account",m);"> Back"!==h&&(Y.keystore_slug=t,Y.account_index=o.indexOf(h),await de(e,t,o.indexOf(h)-2,a),await ue(e,t,a))},de=async(e,t,a,r)=>{const o=await re(e,t);let s=o.default_network,i=Ae(e,t,a);const l=await Pe(e,s),c=await Te(i,e,s);c.status?console.log(X.green(` Address No: #${a}\n Network: ${s}\n ${l.nativeCurrency.symbol} Balance: ${c.output}`)):console.log(X.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 st(d)){case"> Tools":await Z(e,t,i,r);break;case"> Show address":await _e(e,t,a);break;case"> Assets":await Je(e,s,i);break;case"> Reload balances":await Ue(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 We(n,Xe);o.data[a].tag=r.replace(/\s+/g," ").trim(),oe(e,t,o);break}case"> Dump private key":{let n=Ae(e,t,a),o=await r.account.showPrivateKey(n);console.log("account: ",n),console.log("private key: ",o);break}case"> Back":return}},pe=async(e,t,a,n)=>{const r=await re(e,t),o=r.data.length,s=new Q.SingleBar({},Q.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(X.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),oe(e,t,r),n.account.reloadAccount()},me=async(e,t,a,n)=>{const r=await re(e,t);r.data=r.data.slice(0,a+1),oe(e,t,r),n.account.reloadAccount()},we=async(e,t,a)=>{let n=await We("Please input the accountIndex to remove this account",Ye);if("0"===n)return void console.log(X.red("Can't remove the first account"));let r=await re(e,t);await vt(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),oe(e,t,r),a.account.reloadAccount())},ge=async(a,n)=>{let r=await We("Please input the account name to remove this account"),o=mt(a,n);if(r!==o)return void console.log(X.red("Can't remove this account"));if(!await vt(`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))},he=async(a,r)=>{const o=t.resolve(a,"accounts");e.existsSync(o)||e.mkdirSync(o);let s;switch(s=0===ne(a).accounts.length?["> Create a new account",new n.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new n.Separator("----------------------------------"),"> Back"],await st(s)){case"> Select an account":await ie(a,r);break;case"> Create a new account":await ae(a,r);break;case"> Back":return}await he(a,r)},fe=require("chalk"),ye=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 ct(n.chainId.toString(),`Rpc Url (default: ${n.rpcUrl})`,!0);else{if(u=await We(`Chain Name (default: ${n.name})`),u&&u!==n.name&&s.includes(u))return void console.log(fe.red("Chain Name already exists"));l=await lt(`Chain Id (default: ${n.chainId})`,!0),i=await ct(l||n.chainId,`RPC Url (default: ${n.rpcUrl})`,!0),c=await dt(`Symbol (default: ${n.nativeCurrency.symbol})`),d=await ut(n.multicallAddress?`Multicall Address (Optional) (default: ${n.multicallAddress})`:"Multicall Address (Optional)"),p=await pt(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=T(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))},be=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))},ke=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"===I(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 st(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(fe.green("Please input someting about network"));const s=await We("Chain Name");if(o.includes(s))return void console.log(fe.red("Chain Name already exists"));const i=await lt("Chain Id");if(!i)return;const l=await ct(i,"RPC Url");if(!l)return;const c=await dt("Symbol");if(!c)return;const u=await ut("Multicall Address (Optional)"),d=await pt("Color (Optional)");let p=T(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 st(a)){case"> Edit":await ye(e,t);break;case"> Remove":await be(e,t)}})(a,u),await ke(a)},ve=async e=>{let t=["> Enhanced Balance Display",new n.Separator("----------------------------------"),"> Back"];switch(await st(t)){case"> Enhanced Balance Display":await $e(e);break;case"> Back":return}await ve(e)},Se=async()=>{switch(await st(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},xe=(a,n)=>{const r=t.resolve(a,"network.json");let o=JSON.parse(e.readFileSync(r,"utf8")).showTokens;return n in o?o[n]:[]},$e=async a=>{const r=["> Status","> Token List","> Add Token",new n.Separator("----------------------------------"),"> Back"];switch(await st(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 st(s);"> Back"!==i&&(i.includes("Full Address")?o.status.fullAddr=await Se():i.includes("Gas Token")?o.status.gasToken=await Se():i.includes("Extended Token")&&(o.status.extendedToken=await Se()),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(!Ot(i))return void console.log(fe.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=xe(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: ${fe.green(`${Pt(n.address).padEnd(45)}`)} Decimals: ${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: ${fe.green(`${Pt(n.address).padEnd(45)}`)} Decimals: ${n.display_decimals?n.display_decimals:"4"}`)}}let p=await it(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 qe(a);break;case"> Back":return}await $e(a)},Ne=async e=>{let t=["> Networks","> Dataview",new n.Separator("----------------------------------"),"> Back"];switch(await st(t)){case"> Networks":await ke(e);break;case"> Dataview":await ve(e);break;case"> Back":return}await Ne(e)},Oe=async a=>{const n=t.resolve(a,"network.json"),r=JSON.parse(e.readFileSync(n,"utf8")).networks.map(e=>`> ${e.name}`);return(await st(r,"Please select a default network")).slice(2)},Fe=(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 I(t.chainId.toString())}return"unknown"},Pe=(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},Ae=(e,t,a)=>{const n=re(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Fe(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},_e=async(a,n,r)=>{const o=t.resolve(a,"network.json"),s=JSON.parse(e.readFileSync(o,"utf8")).networks,i=s.length;let l=re(a,n),c=l.default_network;const u=Fe(a,c);for(let e=0;e<i;e++){const t=s[e],n=Fe(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=re(a,r),u=["> Back",new n.Separator("----------------------------------")],d=c.default_network,p="";o||(p=c.ciphertexts.address);let m=[];const w=Fe(a,d);for(let e=0;e<l;e++){const t=i[e],n=Fe(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 st(u);if("> Back"===g)return;let h=u.indexOf(g);if(c.default_network=m[h-2],oe(a,r,c),!o){let e=c.default_network,t=Pe(a,e);console.log(fe.green(` Address No: #0\n Network: ${e}\n ${t.nativeCurrency.symbol} Balance: 0`))}},Te=async(e,t,a)=>{const n=Pe(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===I(n.chainId.toString())?await b(e,r):await y(e,r),s.status){let e=new g(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,g.ROUND_FLOOR)}return F(n.chainId.toString(),[e],["0"]),s},Ie=(e,t,a)=>{const n=re(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},Ce=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"===I(r[e].chainId.toString())&&s.push(r[e].name);return s},Be=a=>{const n=t.resolve(a,"network.json");return JSON.parse(e.readFileSync(n,"utf8")).status},je=require("chalk"),Re=async(a,n)=>{let r=t.join(a,"assets.json");if(!Ot(r))return[];const o=e.readFileSync(r).toString(),s=JSON.parse(o);return n in s?s[n]:[]},ze=async(e,t,a)=>{const n=await Re(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},Je=async(e,t,a)=>{const n=Pe(e,t),r=I(n.chainId.toString()),o=await Re(e,n.chainId.toString());if(!o)return void console.log(je.red("No asset found"));const s=await Ee(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(je.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(je.red("No asset found"))},Ue=async(e,t,a)=>{const n=Pe(e,t);let r=(await Re(e,n.chainId.toString())).map(e=>e.address);r.push("0"),F(n.chainId.toString(),[a],r)},qe=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 st(r)).split(".")[1].trim();const i=Fe(a,s),l=Pe(a,s),c=await We("Enter contract address",ot);let u;if("evm"===i){if(!(d=c).startsWith("0x")||42!==d.length)return void console.log(je.red("evm address format error"));u=await k(c,l.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(c))return void console.log(je.red("solana address format error"));u=await v(c,l.rpcUrl)}var d;if(!u.status)return void console.log(je.red(u.output));u.output.name||(u.output.name=await We("Please input token name")),u.output.symbol||(u.output.symbol=await We("Please input token symbol")),console.log(je.green(`Token ${u.output.symbol}(${u.output.name}) loaded successfully.`));let p=await We("Enter decimals for display",Ye);p=parseInt(p),await(async(a,n,r,o,s,i,l)=>{let c=t.join(a,"assets.json"),u={};if(Ot(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)},Ee=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(S(e,o.address,a)):"solana"===n&&s.push(x(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(je.red(i[a].output)),null;let s=new g(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,g.ROUND_FLOOR);l.push({address:n.address,symbol:n.symbol,balance:s}),F(r,[e],[n.address])}return F(r,[e],["0"]),l},De=async(e,t,a,n,r,o,s)=>{let i=a.length,l=Pe(e,r),c="evm"===I(l.chainId.toString());if(o&&await O(t,"0",l.chainId.toString(),n,c),s){let o=xe(e,r);for(let e=0;e<i;e++){let r=a[e].address;o.includes(r)&&await O(t,r,l.chainId.toString(),n,c)}}let u=((e,t,a,n)=>{let r={};if(!(e in h))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";h[e][n.address]&&(o in h[e][n.address]&&(s=new g(h[e][n.address][o]).dividedBy(10**n.decimals).toFixed(n.display_decimals||4,g.ROUND_FLOOR)),r[o]||(r[o]={}),r[o][n.symbol]=s)}}return r})(l.chainId.toString(),t,a,l);return u},Me=require("chalk"),Ge=process.env.HOME||process.env.USERPROFILE,Ke=`${Ge}/.wative`,We=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},He=async e=>{for(let t=0;t<5;t++){let t=await Ve(e,"Input start address or index");if(!t)return console.log(Me.red("Invalid start account index")),null;let a=await Ve(e,"Input end address or index");if(!a)return console.log(Me.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(Me.red("Invalid address range"))}return null},Ze=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},Ve=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 We(t,rt),a=Nt(e);if("unknown"===a){if(Number(e)>s){console.log(Me.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},Xe=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"),Qe=e=>!(e.length<6)||"Address length should be greater than 6",Ye=e=>!isNaN(Number(e))||"Value should be a number",et=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",tt=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===A.includes(t[e]))return"Passphrase word should be valid";return!0},at=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},nt=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},rt=e=>!1===isNaN(Number(e))||ot(e),ot=e=>"unknown"!=Nt(e)||"Address should be valid",st=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()},it=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},lt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await We(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},ct=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await We(t);try{if(""===n&&a)return null;if("solana"===I(e.toString()))return n;const t=await f(n);if(!t.status){console.log(Me.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(Me.red("Rpc url not match chain id"))}catch(e){console.log(Me.red(e.message))}}return null},ut=async e=>{for(let t=0;t<5;t++){let t=await We(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(Me.red("Multicall address length must be 42"))}return null},dt=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await We(e);if(""===a)return null;if(t.test(a))return a}return null},pt=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await We(e);if(""===a)return null;if(t.test(a))return a}return null},mt=(e,t)=>{const a=ne(e).accounts,n=gt(a).indexOf(t);return-1!==n?a[n]:t},wt=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),gt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(wt(e[a]));return t},ht=async(e,t)=>{let a=gt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await We(e);t=t.trim();let r=wt(t);if(n.test(r)){if(a.includes(r)){console.log(Me.red("Account name already exists"));continue}return t}}return null},ft=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:r}=await n.prompt(a);return r.trim().toString()},yt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await n.prompt(t);return a},bt=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()},kt=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=Me.green("✔"),s=Me.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},vt=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:r}=await n.prompt(a);return r},St=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:r}=await n.prompt(a);return r.trim().toString()},xt=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},$t=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},Nt=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",Ot=t=>(t=t.trim(),e.existsSync(t)),Ft=e=>new Promise(t=>setTimeout(t,e)),Pt=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),At=(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},_t=(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=At(e[n],t);a.push(r)}return a.concat(a)},Tt=(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}`}},It=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 Ft(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}=_t(w,e,a.length),s=a.slice(n,r);if(!P(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}=_t(w,e,n.length),d=n.slice(c,u);let h=await De(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;Tt(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 Ct=async(e,t)=>{switch(await st(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await Ne(e);break;case"> Accounts":await he(e,t);break;case"> Tools":await V(e,t);break;case"> Exit":return}await Ct(e,t)},{WativeCore:Bt}=require("wative-core"),jt=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:",jt.version),console.log(Me.green(a.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const n=await(async()=>{let t=await We(`Keystore storage located in (default: ${Ke})`);return t||(t=Ke),t=t.trim(),t=t.replace("~",Ge),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:_,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=wt(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=gt(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=gt(o.accounts);const i=new Bt(n,s,null,!0);await Ct(n,i)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)});
|