wative 1.2.11 → 1.2.12

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.
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("fs"),require("path"),require("figlet"),require("inquirer"),require("web3"),require("@solana/web3.js"),require("@solana/spl-token"),require("@metaplex-foundation/js"),require("bignumber.js")):"function"==typeof define&&define.amd?define(["fs","path","figlet","inquirer","web3","@solana/web3.js","@solana/spl-token","@metaplex-foundation/js","bignumber.js"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).fs,e.path,e.figlet,e.inquirer,e.Web3,e.web3_js,e.splToken,e.js,e.bignumber_js)}(this,function(e,t,a,n,r,o,s,i,l){"use strict";function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var n=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,n.get?n:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var d=u(e),p=u(t),m=u(a),g=c(n),w=c(r);const f={},h=[{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall.Call[]",name:"calls",type:"tuple[]"}],name:"aggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes[]",name:"returnData",type:"bytes[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"getEthBalance",outputs:[{internalType:"uint256",name:"balance",type:"uint256"}],stateMutability:"view",type:"function"}],y=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],b=async e=>{let t=new w.default(e);return await Bt(t.eth.getChainId,[])},k=async(e,t)=>{const a=new w.default(t);return await Bt(a.eth.getBalance,[e])},v=async(e,t)=>{const a=new o.Connection(t);return await Bt(a.getBalance.bind(a),[new o.PublicKey(e)])},S=async(e,t)=>{const a=new o.Connection(t),n=new o.PublicKey(e);let r=await Bt(a.getAccountInfo.bind(a),[n]);if(!r.status)return{status:!1,output:"Failed to get mint account info"};const s=r.output;if(!s)return{status:!1,output:"Mint account not found"};return{status:!0,output:s.owner.toBase58()}},x=async(e,t)=>{const a=new(new w.default(t).eth.Contract)([{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],e);let n=await Bt(a.methods.symbol().call.bind(a),[]),r=await Bt(a.methods.name().call.bind(a),[]),o=await Bt(a.methods.decimals().call.bind(a),[]);return n.status&&r.status&&o.status?{status:!0,output:{symbol:n.output,name:r.output,decimals:o.output}}:{status:!1,output:"Failed to get token info"}},N=async(e,t)=>{let a=await S(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const n=a.output,r=new o.Connection(t),l=i.Metaplex.make(r),c=new o.PublicKey(e);let u=await Bt(s.getMint,[r,c,"finalized",new o.PublicKey(n)]),d={status:!0,output:{symbol:"",name:"",decimals:""}};if(!u.status)return{status:!1,output:"Failed to get token decimals"};d.output.decimals=u.output.decimals;try{const e=l.nfts().pdas().metadata({mint:c});if(await r.getAccountInfo(e)){const e=await l.nfts().findByMint({mintAddress:c});d.output.name=e.name,d.output.symbol=e.symbol}else try{const e=await s.getTokenMetadata(r,c);e&&(e.name&&(d.output.name=e.name),e.symbol&&(d.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return d},$=async(e,t,a)=>{const n=new(new w.default(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let r=await Bt(n.methods.balanceOf(e).call.bind(n),[]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get token balance"}},P=async(e,t,a)=>{let n=await S(t,a);if(!n.status)return{status:!1,output:"Failed to get token program id"};const r=n.output,i=new o.Connection(a),l=s.getAssociatedTokenAddressSync(new o.PublicKey(t),new o.PublicKey(e),!1,new o.PublicKey(r));let c=await Bt(i.getTokenAccountBalance.bind(i),[l]);return c.status?{status:!0,output:c.output.value.amount}:c.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},B=async e=>{const t=new o.Connection(e);let a=await Bt(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}},O=async(e,t)=>{const a=new o.Connection(t);let n=await Bt(a.getAccountInfo.bind(a),[new o.PublicKey(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},A=async(e,t,a,n,r,o)=>{let s;if(e=e.filter(e=>e&&e.length>30),a in f?s=f[a][t]||{}:(f[a]={},s={}),o&&o.length>0&&r){let a=await(async(e,t,a,n)=>{let r=[];try{let o=[];const s=new w.default(a),i=new s.eth.Contract(h,n);for(const a of e)if("0"===t){const e=i.methods.getEthBalance(a).encodeABI();o.push({target:n,callData:e})}else{const e=new s.eth.Contract(y,t).methods.balanceOf(a).encodeABI();o.push({target:t,callData:e})}const{returnData:l}=await i.methods.aggregate(o).call();for(let e=0;e<l.length;e++){const t=s.eth.abi.decodeParameter("uint256",l[e]);r.push(t)}}catch(e){console.log("Multicall aggregate failed")}return r})(e,t,n,o);if(e.length===a.length)for(let t=0;t<e.length;t++)s[e[t]]=a[t]}else for(const a of e)if(a&&!(a in s)){let e;e="0"===t?r?await k(a,n):await v(a,n):r?await $(a,t,n):await P(a,t,n),e.status&&(s[a]=e.output),await Tt(200)}return f[a][t]=s,f},T=(e,t,a)=>{for(let n=0;n<t.length;n++){let r=t[n];for(let t=0;t<a.length;t++){let n=a[t];try{delete f[e][n][r]}catch(e){}}}},C=(e,t)=>{let a=0;if(e in f&&"0"in f[e])for(let n=0;n<t.length;n++)t[n]in f[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},F=["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}}],I=["901","902","903"],j=e=>I.includes(e)?9:18,L=e=>I.includes(e)?"solana":"evm",{BN:q}=require("bn.js"),{stripHexPrefix:R}=require("ethereumjs-util"),{BigNumber:z}=require("bignumber.js");function J(e){return new q(R(e.toString("hex")),16)}const K=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function U(e){return K(e.toString(16))}class E{constructor(e){this.query=new w.default(w.default.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=U(function(e,t,a){const n=new q(t),r=new q(a);return e.mul(n).div(r)}(J(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 z(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=J(e),r=J(t).muln(.9),o=n.muln(a);return n.gt(r)?U(n):o.lt(r)?U(o):U(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(K(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const M=require("chalk");require("wative-core");const D=async e=>{let t=[new g.default.Separator("————Tx Detail—————-"),`from: ${e.from}`,`to: ${e.to}`,`nonce: ${e.nonce}`,`gasPrice: ${e.gasPrice}`,`data: ${e.data}`,`value: ${e.value}`,`gas: ${e.gas}`,new g.default.Separator("——————————————-"),"Send it now","Back"],a=await ct(t),n=t.indexOf(a);return 1===n&&(e.from=await Ve("from",lt)),2===n&&(e.to=await Ve("to",lt)),3===n&&(e.nonce=await Ve("nonce")),4===n&&(e.gasPrice=await Ve("gasPrice")),5===n&&(e.data=await $t("data")),6===n&&(e.value=await Ve("value")),7===n&&(e.gas=await Ve("gas")),9===n?e:10===n?null:await D(e)},G=async(e,t,a,n,r)=>{const o=await Ve("to",lt),s=new E(t),i=await s.getGasPrice(),c=new l.BigNumber(i.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR),u=await Ve(`Gas price (${c}), agree or enter`,nt);let d=u||c;d=new l.BigNumber(d).multipliedBy(1e9).toFixed(0);let p,m,g,f=await(async(e,t)=>{const a=new w.default(t);let n=await Bt(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(o,t);if(!f.status)return void console.log(M.red(f.output));if(p="42161"===e||"421614"===e?"1700000":"21000","0x"===f.output){m="0x";let e=await k(n,t);if(!e.status)return void console.log(M.red(e.output));let r=new l.BigNumber(e.output),o=new l.BigNumber(d),s=r.minus(o.multipliedBy(Number(p))).toFixed(0,l.BigNumber.ROUND_FLOOR),i=new l.BigNumber(s).dividedBy(1e18).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(i)<new l.BigNumber(0))return void console.log(M.red("Not enough balance"));g=await H(i,s,a,18)}else m=await $t("data",Pt),g=await Ve("value",at);const h=await s.getTransactionCount(n),y=await Ve(`Nonce (${h}), agree or enter`);let b={from:n,to:o,nonce:y||h.toString(),gasPrice:d,data:m,value:g};if("0x"===m)b.gas=p;else{let e=b.gasPrice;delete b.gasPrice;try{b.gas=(await s.estimateTxGas(b)).toString()}catch(e){return void console.log(M.red("Error: "+e))}b.gasPrice=e}if(b=await D(b),!b)return;const v=await r.account.signTransaction(n,b,t);v.status?(console.log(M.green(`Transaction hash: ${v.output.transactionHash}`)),r.account.sendSignedTransaction(n,v.output.rawTransaction,t),T(e,[n,o],["0"])):console.log(M.red(v.output))},W=async(e,t,a,n,r)=>{const s=await Ve("to",lt);let i=(new o.Transaction).add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(n),toPubkey:new o.PublicKey(s),lamports:1e6}));i.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),i.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),i.feePayer=new o.PublicKey(n);let c=await(async e=>{const t=new o.Connection(e);let a=await Bt(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}})(t);if(!c.status)return void console.log(M.red(c.output));i.recentBlockhash=c.output.blockhash;const u=await r.account.simulateTransaction(n,t,i);if(!u.status)return void console.log(M.red(u.output));if(!u.output||!u.output.value||0===u.output.value.unitsConsumed||u.output.value.err)return console.log(M.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(u.output,null,4)),void console.log("==============================================");let d=new l.BigNumber(u.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,l.BigNumber.ROUND_CEIL),p=new l.BigNumber(d);const m=await B(t);if(!m.status)return void console.log(M.red(m.output));const g=new l.BigNumber(m.output.toString()),w=p.multipliedBy(g).dividedBy(1e6).toFixed(0,l.BigNumber.ROUND_CEIL),f=await v(n,t);if(!f.status)return void console.log(M.red(f.output));const h=new l.BigNumber(f.output).minus(5e3).minus(w);let y=new l.BigNumber(h).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(y)<new l.BigNumber(0))return void console.log(M.red("Not enough balance"));let b=await H(y,h.toString(),a,9),k=new o.Transaction;k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(p)})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(g)})),k.add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(n),toPubkey:new o.PublicKey(s),lamports:Number(b)})),k.feePayer=new o.PublicKey(n),k.recentBlockhash=c.output.blockhash;const S=await r.account.signTransaction(n,k,t);if(!S.status)return void console.log(M.red(S.output));let x=await r.account.sendSignedTransaction(n,S.output,t);x.status?(T(e,[n,s],["0"]),console.log(M.green(`Transaction hash: ${x.output}`))):console.log(M.red(x.output))},H=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await ct(r),s=r.indexOf(o),i="0";if(0===s){let e=await Ve("value",at);i=new l.BigNumber(e).multipliedBy(10**n).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===s&&(i=t);return new l.BigNumber(i).isLessThanOrEqualTo(new l.BigNumber(t))?i:(console.log(M.red("Not enough balance")),H(e,t,a,n))},Z=async(e,t,a,n,r)=>{let o,s,i;switch(await ct(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Ve("token ticker");let r=await Ke(e,a,i);if(0===r.length)return void console.log(M.red("Token not found"));let c=[];for(let e=0;e<r.length;e++){const a=await $(n,r[e].address,t);if(!a.status)return void console.log(M.red(a.output));let o=new l.BigNumber(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===r.length){c.push(`> 1. ${i} Balance: ${o}`);break}c.push(`> ${e+1}. ${i} Balance: ${o}(${r[e].address})`),c.push(r[e].address)}let u=await ct(c);const d=r[c.indexOf(u)];o=d.address,s=Number(d.decimals);break;case"> Input token contract address":o=await Ve("token contract address",lt);let p=await x(o,t);if(!p.status)return void console.log(M.red(p.output));s=Number(p.output.decimals),i=p.output.name}const c=await Ve("Receipt",lt),u=await $(n,o,t);if(!u.status)return void console.log(M.red(u.output));const d=new E(t),p=await d.getGasPrice(),m=new l.BigNumber(p.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR),g=await Ve(`Gas price (${m}), agree or enter`,nt);let f=g||m;f=new l.BigNumber(f).multipliedBy(1e9).toFixed(0);let h=await V(u.output,i,s);const y=await(async(e,t,a)=>new w.default(a).eth.abi.encodeFunctionCall({constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},[e,t]))(c,h,t),b=await d.getTransactionCount(n),k=await Ve(`Nonce (${b}), agree or enter`);let v={from:n,to:o,nonce:k||b.toString(),gasPrice:f,data:y,value:"0"};if("0x"===y)v.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=v.gasPrice;delete v.gasPrice;try{v.gas=(await d.estimateTxGas(v)).toString()}catch(e){return void console.log(M.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await D(v),!v)return;const S=await r.account.signTransaction(n,v,t);S.status?(console.log(M.green(`Transaction hash: ${S.output.transactionHash}`)),r.account.sendSignedTransaction(n,S.output.rawTransaction,t),T(a,[n,c],["0",o])):console.log(M.red(S.output))},V=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new l.BigNumber(e).dividedBy(10**a).toFixed(4,l.BigNumber.ROUND_FLOOR)} ${t})`],r=await ct(n),o=n.indexOf(r),s="0";if(0===o){let e=await Ve("amount",at);s=new l.BigNumber(e).multipliedBy(10**a).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===o&&(s=e);return new l.BigNumber(s).isLessThanOrEqualTo(new l.BigNumber(e))?s:(console.log(M.red("Not enough balance")),V(e,t,a))},X=async(e,t,a,n)=>{let r=Le(e,t,a),i=Te(e,r),c=Ot(a);if(i!==c&&("evm"===c&&(r="Ethereum Mainnet"),"solana"===c&&(r="Solana Mainnet"),i=Te(e,r)),"evm"===i){if(await Nt(`Network (${r}), want a change?`,!1)){const t=qe(e);r=await ct(t,"Select a network")}}let u=await je(a,e,r);if(!u.status)return void console.log(M.red(u.output));const d=Ce(e,r);console.log(M.green(` ${d.nativeCurrency.symbol} Balance: ${u.output}`));const p=["> Send Raw Tx","> Send Token",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(p)){case"> Send Raw Tx":"evm"===c&&await G(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,n),"solana"===c&&await W(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,n);break;case"> Send Token":"evm"===c&&await Z(e,d.rpcUrl,d.chainId.toString(),a,n),"solana"===c&&await(async(e,t,a,n,r)=>{let i,c,u;switch(await ct(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Ve("token ticker");let r=await Ke(e,a,u);if(0===r.length)return void console.log(M.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await P(n,r[e].address,t);if(!a.status)return void console.log(M.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===r.length){o.push(`> 1. ${u} Balance: ${s}`);break}o.push(`> ${e+1}. ${u} Balance: ${s}(${r[e].address})`),o.push(r[e].address)}let s=await ct(o);const d=r[o.indexOf(s)];i=d.address,c=Number(d.decimals);break;case"> Input token contract address":i=await Ve("token contract address",lt);let p=await N(i,t);if(!p.status)return void console.log(M.red(p.output));c=Number(p.output.decimals),u=p.output.name}const d=await Ve("Receipt",lt),p=await P(n,i,t);if(!p.status)return void console.log(M.red(p.output));let m=await V(p.output,u,c),g=await S(i,t);if(!g.status)return void console.log(M.red(g.output));const w=new o.PublicKey(g.output);let f=s.getAssociatedTokenAddressSync(new o.PublicKey(i),new o.PublicKey(n),!0,w);const h=await O(f.toString(),t);if(!h.status)return void console.log(M.red(h.output));if(!h.output||h.output.owner.toString()===o.PublicKey.default)return void console.log(M.red("From token account not found"));let y=s.getAssociatedTokenAddressSync(new o.PublicKey(i),new o.PublicKey(d),!1,w);const b=await O(y.toString(),t);if(!b.status)return void console.log(M.red(b.output));let k=new o.Transaction,v=new o.Transaction;b.output&&b.output.owner.toString()!==o.PublicKey.default||(k.add(s.createAssociatedTokenAccountInstruction(new o.PublicKey(n),new o.PublicKey(y),new o.PublicKey(d),new o.PublicKey(i),w)),v.add(s.createAssociatedTokenAccountInstruction(new o.PublicKey(n),new o.PublicKey(y),new o.PublicKey(d),new o.PublicKey(i),w))),k.add(s.createTransferInstruction(f,y,new o.PublicKey(n),Number(m),[],w)),k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),k.feePayer=new o.PublicKey(n);const x=await r.account.simulateTransaction(n,t,k);if(!x.status)return void console.log(M.red(x.output));if(!x.output||!x.output.value||0===x.output.value.unitsConsumed||x.output.value.err)return console.log(M.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(x.output,null,4)),void console.log("==============================================");let $=new l.BigNumber(x.output.value.unitsConsumed.toString());$=new l.BigNumber(Math.ceil(1.2*Number($)));const A=await B(t);if(!A.status)return void console.log(M.red(A.output));const C=new l.BigNumber(A.output.toString());v.add(s.createTransferInstruction(f,y,new o.PublicKey(n),Number(m),[],w)),v.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number($)})),v.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(C)})),k.feePayer=new o.PublicKey(n);const F=await r.account.signTransaction(n,v,t);if(!F.status)return void console.log(M.red(F.output));let _=await r.account.sendSignedTransaction(n,F.output,t);_.status?(T(a,[n,d],["0",i]),console.log(M.green(`Transaction hash: ${_.output}`))):console.log(M.red(_.output))})(e,d.rpcUrl,d.chainId.toString(),a,n);break;case"> Back":return}},Q=async(e,t,a,n)=>{const r=["> SendTx","> SignMessage",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> SendTx":await X(e,t,a,n);break;case"> SignMessage":{const e=await $t("Input the message to sign"),t=n.account.signMessage(a,e);if(!t.status){console.log(M.red(t.output));break}console.log(M.green("Signature: "+t.output));break}case"> Back":return}await Q(e,t,a,n)},Y=async(e,t)=>{let a,n=["> Send Tx","> Search Accounts",new g.default.Separator("----------------------------------"),"> Back"],r=await ct(n);if("> Back"===r)return;"> Send Tx"===r&&(a=await Ve("Input address to send tx",lt)),"> Search Accounts"===r&&(a=await Ve("Input part address to send tx",tt));let o=t.account.getAccountLabel(a);if(null===o)return console.log(M.red("Account not found")),void await Y(e,t);let s=o.account_label,i=ft(e,s);if(a=o.account_address,null===s)return console.log(M.red("Account not found")),void await Y(e,t);const l=await Qe(e,s,a);if(null===l)return console.log(M.red("Account not found")),void await Y(e,t);console.log(M.green(`Address found!\n address: ${a}\n account name: [${i}]\n account index: #${l}`)),(await ce(e,s,t)).isLoginIn?(await Q(e,s,a,t),await Y(e,t)):await Y(e,t)},ee=require("chalk");require("dotenv").config();const te=require("cli-progress");require("wative-core");const ae={keystore_slug:"",default_account_index:0},ne=async e=>{const t=se(e);let a=[];t.accounts&&(a=t.accounts);let n=await bt("Account Name",a);return null===n?null:{account_name:n,password:await xt(`Please set a password for Account [${n}]`),selected_default_network:await Ae(e)}},re=async(e,t,a,n,r,o,s)=>{let i=await Ce(e,r);"evm"!==L(i.chainId.toString())||n.startsWith("0x")||(n="0x"+n);let l=await o.account.generatePKAccount(a,n,t,i.chainId.toString(),s);if(!l.status)return void console.log(ee.red(l.output));let c,u=p.join(e,`accounts/${a}.json`);if(d.existsSync(u)){let e=JSON.parse(d.readFileSync(u,"utf8"));if("data"in e){if(e.data.map(e=>e.ciphertexts.address).includes(l.output.ciphertexts.address))return void console.log(ee.red("The account has already been imported"));e.data.push({ciphertexts:l.output.ciphertexts}),c=e}else e.data=[{ciphertexts:e.ciphertexts}],delete e.ciphertexts,e.data.push({ciphertexts:l.output.ciphertexts}),c=e}else l.output.data=[{ciphertexts:l.output.ciphertexts}],delete l.output.ciphertexts,l.output.default_network=r,c=l.output;d.writeFileSync(u,JSON.stringify(c,null,4)),o.account.reloadAccount()},oe=async(e,t)=>{const a=["> Import Passphrase","> Import Private Key",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(a)){case"> Import Passphrase":await(async(e,t)=>{let a=await ne(e);if(!a)return;let n=await St("Please enter a mnemonic [split by space]",rt);n=n.replace(/\s+/g," ");let r=ht(a.account_name);const o=t.account.generatePPAccount(r,n,a.password);if(!o.status)return void console.log(ee.red(o.output));let s=p.join(e,`accounts/${r}.json`);o.output.default_network=a.selected_default_network,d.writeFileSync(s,JSON.stringify(o.output,null,4));const i=p.resolve(e,"network.json"),l=JSON.parse(d.readFileSync(i,"utf8"));l.accounts.push(a.account_name),d.writeFileSync(i,JSON.stringify(l,null,4))})(e,t);break;case"> Import Private Key":await(async(e,t)=>{let a=await ne(e);if(!a)return;let n=await kt("Please enter a private key"),r=ht(a.account_name);await re(e,a.password,r,n,a.selected_default_network,t,!0);const o=p.resolve(e,"network.json"),s=JSON.parse(d.readFileSync(o,"utf8"));s.accounts.push(a.account_name),d.writeFileSync(o,JSON.stringify(s,null,4))})(e,t);break;case"> Back":return}t.account.reloadAccount()},se=e=>{const t=p.resolve(e,"network.json");return JSON.parse(d.readFileSync(t,"utf8"))},ie=(e,t)=>{const a=p.join(e,`accounts/${t}.json`);return JSON.parse(d.readFileSync(a,"utf8"))},le=(e,t,a)=>{const n=p.join(e,`accounts/${t}.json`);d.writeFileSync(n,JSON.stringify(a,null,4))},ce=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=ft(e,t),o="WATIVE_PASSWD_"+t;if(n=process.env[o]&&""!==process.env[o]?process.env[o]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await vt(`Please input the password for Account [${r}]`),!n)return console.log(ee.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 ct(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},ue=async(e,t)=>{const a=se(e).accounts;let n=["> Back",new g.default.Separator("----------------------------------")];const r=a.length;if(0===r)return void console.log(ee.red("No address here yet"));for(let t=0;t<r;t++){const r=a[t],o=ht(r),s=ie(e,o);"data"in s?n.push(`${t+1}) ${r} [${s.account_type}:${s.data.length}]`):n.push(`${t+1}) ${r} [${s.account_type}:1]`)}const o=await ct(n,"Select an account");if("> Back"===o)return;const s=a[n.indexOf(o)-2],i=ht(s);console.log(ee.green(`Keystore slug: [${i}]`));let l=await ce(e,i,t);l.isLoginIn&&await pe(e,i,t,l.password),await ue(e,t)},de=async(e,t,a)=>{const n=await ie(e,t);let r=["> Disabled Slots","> Add Single","> Add Range",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> Back":return;case"> Disabled Slots":{let a=n.disabled_slots;if(!a||0===a.length){console.log(ee.red("No disabled slots here yet"));break}let r=n.data,o=["> Back",new g.default.Separator("----------------------------------")],s=n.default_network;for(let t=0;t<a.length;t++){let n=a[t].from,i=a[t].to,l=s,c=s;"default_network"in r[n]&&(l=r[n].default_network),"default_network"in r[i]&&(c=r[i].default_network);let u,d,p=Te(e,l),m=Te(e,c);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==m&&"solana"!==m)throw new Error(`Invalid network type: ${m}`);u="evm"===p?r[n].ciphertexts.evm.address:r[i].ciphertexts.solana.address,d="evm"===m?r[i].ciphertexts.evm.address:r[i].ciphertexts.solana.address,n===i?o.push(`${t+1}. ${u}[${n}]`):o.push(`${t+1}. ${u}[${n}]-${d}[${i}]`)}let i=await ct(o);if("> Back"===i)break;if(!await Nt(`Are you sure to delete the ${i}?`,!0))break;let l=o.indexOf(i)-2;n.disabled_slots.splice(l,1),le(e,t,n);break}case"> Add Single":{let a=await Ye(n,"Input address or index");if(null===a){console.log(ee.red("Invalid account index"));break}n.disabled_slots?n.disabled_slots.push({from:a,to:a}):n.disabled_slots=[{from:a,to:a}],le(e,t,n);break}case"> Add Range":{let a=await Xe(n);if(!a){console.log(ee.red("Invalid account range"));break}n.disabled_slots?n.disabled_slots.push(a):n.disabled_slots=[a],le(e,t,n);break}}await de(e,t)},pe=async(e,t,a,n)=>{let r,o=await ie(e,t);r="PP"===o.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${o.default_network}]`,"> Remove",new g.default.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${o.default_network}]`,"> Remove",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> Address List":await me(e,t,a);break;case"> Expand Address":{const n=await Ve("Expand accounts count",ot);if(Number(n)>2e3){console.log(ee.red("Too many accounts, please input less than 2000"));break}await we(e,t,Number(n),a);break}case"> Import Private Key":await(async(e,t,a,n)=>{let r=await Ve("Please enter a private key"),o=p.join(e,`accounts/${a}.json`),s=JSON.parse(d.readFileSync(o,"utf8"));await re(e,t,a,r,s.default_network,n,!1)})(e,n,t,a);break;case"> Slice Address":{const n=await Ve("Please input last account number",st);await fe(e,t,Number(n),a);break}case"> Remove Address":await he(e,t,a);break;case"> Disable Address":await de(e,t);break;case"> Reset Account Password":{let n=ft(e,t);const r=await xt(`Please input new password for Account [${n}]`),o=await xt(`Please confirm new password for Account [${n}]`);if(!r||!o||r!==o){console.log(ee.red("Passwords do not match"));break}return void await a.account.resetPassword(t,r)}case`> Switch Networks [${o.default_network}]`:await Ie(e,t,!0);break;case"> Remove":return void await ye(e,t);case"> Back":return}await pe(e,t,a,n)},me=async(e,t,a)=>{const n=await ie(e,t);let r=["> Back",new g.default.Separator("----------------------------------")],o=n.disabled_slots,s=Re(e),i=n.default_network,l=Ce(e,i),c=L(l.chainId.toString()),u=n.data.length.toString().length+1;for(let e=0;e<n.data.length;e++){let t,i=n.data[e].tag?`(${n.data[e].tag})`:"",l=a.account.checkIsDisableAddress(o,e);t="PP"===n.account_type?"evm"===c?n.data[e].ciphertexts.evm.address:n.data[e].ciphertexts.solana.address:n.data[e].ciphertexts.address,l?r.push(new g.default.Separator(ee.yellow(`#${e.toString().padEnd(u)} ${Ct(t,s.fullAddr)} ${i}`))):r.push(`#${e.toString().padEnd(u)} ${Ct(t,s.fullAddr)} ${i}`)}let d,p=ae.keystore_slug===t?r[ae.account_index]:r[0],m=ae.keystore_slug===t&&ae.account_index>0,w=await Je(e,l.chainId.toString());if(m&&ae.account_index>15){let e=r.slice(0,ae.account_index-15);d=r.slice(ae.account_index-15).concat(e)}else d=r.slice(0);let f=await Lt(d,"evm"===c,e,w,l,s.gasToken,s.extendedToken,m,"Select an account",p);"> Back"!==f&&(ae.keystore_slug=t,ae.account_index=r.indexOf(f),await ge(e,t,r.indexOf(f)-2,a),await me(e,t,a))},ge=async(e,t,a,n)=>{const r=await ie(e,t);let o=r.default_network,s=Fe(e,t,a);const i=await Ce(e,o),l=await je(s,e,o);l.status?console.log(ee.green(` Address No: #${a}\n Network: ${o}\n ${i.nativeCurrency.symbol} Balance: ${l.output}`)):console.log(ee.green(` Address No: #${a}\n Network: ${o}\n ${i.nativeCurrency.symbol}`));let c="> Tag";"tag"in r.data[a]&&""!==r.data[a].tag&&(c=`> Tag(${r.data[a].tag})`);let u=["> Tools","> Show address","> Assets",c,"> Reload balances","> Dump private key",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(u)){case"> Tools":await Q(e,t,s,n);break;case"> Show address":await _e(e,t,a);break;case"> Assets":await Ue(e,o,s);break;case"> Reload balances":await Ee(e,o,s);break;case c:{let n="Current tag";"tag"in r.data[a]&&""!==r.data[a].tag&&(n=`Current tag (${r.data[a].tag})`);let o=await Ve(n,et);r.data[a].tag=o.replace(/\s+/g," ").trim(),le(e,t,r);break}case"> Dump private key":{let r=Fe(e,t,a),o=await n.account.showPrivateKey(r);console.log("account: ",r),console.log("private key: ",o);break}case"> Back":return}},we=async(e,t,a,n)=>{const r=await ie(e,t),o=r.data.length,s=new te.SingleBar({},te.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(ee.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),le(e,t,r),n.account.reloadAccount()},fe=async(e,t,a,n)=>{const r=await ie(e,t);r.data=r.data.slice(0,a+1),le(e,t,r),n.account.reloadAccount()},he=async(e,t,a)=>{let n=await Ve("Please input the accountIndex to remove this account",at);if("0"===n)return void console.log(ee.red("Can't remove the first account"));let r=await ie(e,t);await Nt(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),le(e,t,r),a.account.reloadAccount())},ye=async(e,t)=>{let a=await Ve("Please input the account name to remove this account"),n=ft(e,t);if(a!==n)return void console.log(ee.red("Can't remove this account"));if(!await Nt(`Are you sure you want to remove this account(${n})`,!0))return;let r=p.join(e,`accounts/${t}.json`);d.rmSync(r);const o=p.resolve(e,"network.json");if(!d.existsSync(o))return;const s=JSON.parse(d.readFileSync(o,"utf8"));let i=s.accounts.indexOf(n);s.accounts.splice(i,1),d.writeFileSync(o,JSON.stringify(s,null,2))},be=async(e,t)=>{const a=p.resolve(e,"accounts");d.existsSync(a)||d.mkdirSync(a);let n;switch(n=0===se(e).accounts.length?["> Create a new account",new g.default.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new g.default.Separator("----------------------------------"),"> Back"],await ct(n)){case"> Select an account":await ue(e,t);break;case"> Create a new account":await oe(e,t);break;case"> Back":return}await be(e,t)},ke=require("chalk"),ve=async(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));let r=[];for(let e=0;e<n.networks.length;e++){const t=n.networks[e];r.push(t.name)}let o=t.rpcUrl,s=t.chainId.toString(),i=t.nativeCurrency.symbol,l=t.name,c=t.multicallAddress,u=t.color;if("Ethereum Mainnet"===t.name||"Solana Mainnet"===t.name)o=await pt(t.chainId.toString(),`Rpc Url (default: ${t.rpcUrl})`,!0);else{if(l=await Ve(`Chain Name (default: ${t.name})`),l&&l!==t.name&&r.includes(l))return void console.log(ke.red("Chain Name already exists"));s=await dt(`Chain Id (default: ${t.chainId})`,!0),o=await pt(s||t.chainId,`RPC Url (default: ${t.rpcUrl})`,!0),i=await gt(`Symbol (default: ${t.nativeCurrency.symbol})`),c=await mt(t.multicallAddress?`Multicall Address (Optional) (default: ${t.multicallAddress})`:"Multicall Address (Optional)"),u=await wt(t.color?`Color (Optional): (default: ${t.color})`:"Color (Optional)")}o=o||t.rpcUrl,s=s||t.chainId.toString(),i=i||t.nativeCurrency.symbol,l=l||t.name,c=c||t.multicallAddress,u=u||t.color;let m=j(s.toString()),g={name:l||t.name,chainId:Number(s)||t.chainId,rpcUrl:o||t.rpcUrl,nativeCurrency:{name:i||t.nativeCurrency.symbol,symbol:i||t.nativeCurrency.symbol,decimals:m||t.nativeCurrency.decimals}};(c||t.multicallAddress)&&(g.multicallAddress=c||t.multicallAddress),(u||t.color)&&(g.color=u||t.color);for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===t.name){n.networks[e]=g;break}d.writeFileSync(a,JSON.stringify(n,null,2))},Se=async(e,t)=>{const a=p.resolve(e,"network.json");let n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===t.name){n.networks.splice(e,1);break}t.name===n.currentNetwork&&(n.currentNetwork="Ethereum Mainnet"),d.writeFileSync(a,JSON.stringify(n,null,2))},xe=async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=[],r=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];"solana"===L(t.chainId.toString())?r.push(e):n.push(e)}let o=["> Back","+ Add Network",new g.default.Separator("----Networks(evm)----")];for(let e=0;e<n.length;e++){const t=n[e];let r=`${e+1}.${a.networks[t].name}`;0===e&&(r+=" 🔒"),o.push(r)}o.push(new g.default.Separator("----Networks(solana)----"));for(let e=0;e<r.length;e++){const t=r[e];let n=`${e+1}.${a.networks[t].name}`;0===e&&(n+=" 🔒"),o.push(n)}const s=await ct(o);if("> Back"===s)return;if("+ Add Network"===s)return void await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];n.push(t.name)}console.log(ke.green("Please input someting about network"));const r=await Ve("Chain Name");if(n.includes(r))return void console.log(ke.red("Chain Name already exists"));const o=await dt("Chain Id");if(!o)return;const s=await pt(o,"RPC Url");if(!s)return;const i=await gt("Symbol");if(!i)return;const l=await mt("Multicall Address (Optional)"),c=await wt("Color (Optional)");let u=j(o.toString()),m={name:r,chainId:Number(o),rpcUrl:s,nativeCurrency:{name:i,symbol:i,decimals:u}};l&&(m.multicallAddress=l),c&&(m.color=c),a.networks.push(m),d.writeFileSync(t,JSON.stringify(a,null,2))})(e);let i,l=o.indexOf(s);i=l<n.length+3?a.networks[n[l-3]]:a.networks[r[l-n.length-4]],await(async(e,t)=>{let a=["> Edit"];switch("Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new g.default.Separator("----------------------------------")),a.push("> Back"),await ct(a)){case"> Edit":await ve(e,t);break;case"> Remove":await Se(e,t)}})(e,i),await xe(e)},Ne=async e=>{let t=["> Enhanced Balance Display",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Enhanced Balance Display":await Be(e);break;case"> Back":return}await Ne(e)},$e=async()=>{switch(await ct(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},Pe=(e,t)=>{const a=p.resolve(e,"network.json");let n=JSON.parse(d.readFileSync(a,"utf8")).showTokens;return t in n?n[t]:[]},Be=async e=>{const t=["> Status","> Token List","> Add Token",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Status":await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));"status"in a||(a.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let n=[`> Show Full Address [${a.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${a.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${a.status.extendedToken?"ON":"OFF"}]`,new g.default.Separator("----------------------------------"),"> Back"];const r=await ct(n);"> Back"!==r&&(r.includes("Full Address")?a.status.fullAddr=await $e():r.includes("Gas Token")?a.status.gasToken=await $e():r.includes("Extended Token")&&(a.status.extendedToken=await $e()),d.writeFileSync(t,JSON.stringify(a,null,2)))})(e);break;case"> Token List":await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n={};for(let e of a.networks)n[e.chainId.toString()]=e.name;const r=p.resolve(e,"assets.json");if(!At(r))return void console.log(ke.red("No asset here yet"));const o=JSON.parse(d.readFileSync(r,"utf8"));let s=[],i=[],l={};for(let t in o){l[s.length]={name:n[t],address:null},s.push(new g.default.Separator(`----- Networks (${n[t]}) -------`));let a=Pe(e,n[t]),r=o[t].length;for(let e=0;e<r;e++){let r=o[t][e];a.includes(r.address)&&i.push(`${e+1}.${r.symbol.padEnd(6)} CA: ${ke.green(`${Ct(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals?r.display_decimals:"4"}`),l[s.length]={name:n[t],address:r.address},s.push(`${e+1}.${r.symbol.padEnd(6)} CA: ${ke.green(`${Ct(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals?r.display_decimals:"4"}`)}}let c=await ut(s,"Choose Tokens",i),u={};for(let e=0;e<c.length;e++){let t=c[e],a=l[s.indexOf(t)];a.name in u?u[a.name].push(a.address):u[a.name]=[a.address]}a.showTokens=u,d.writeFileSync(t,JSON.stringify(a,null,2))})(e);break;case"> Add Token":await Me(e);break;case"> Back":return}await Be(e)},Oe=async e=>{let t=["> Networks","> Dataview",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Networks":await xe(e);break;case"> Dataview":await Ne(e);break;case"> Back":return}await Oe(e)},Ae=async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8")).networks.map(e=>`> ${e.name}`);return(await ct(a,"Please select a default network")).slice(2)},Te=(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++){const a=n.networks[e];if(a.name===t)return L(a.chainId.toString())}return"unknown"},Ce=(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++){const a=n.networks[e];if(a.name===t)return a}return null},Fe=(e,t,a)=>{const n=ie(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Te(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},_e=async(e,t,a)=>{const n=p.resolve(e,"network.json"),r=JSON.parse(d.readFileSync(n,"utf8")).networks,o=r.length;let s=ie(e,t),i=s.default_network;const l=Te(e,i);for(let t=0;t<o;t++){const n=r[t],o=Te(e,n.name);if("PK"===s.account_type&&l!==o)continue;let c;c="PK"===s.account_type?s.data[a].ciphertexts.address:"evm"===o?s.data[a].ciphertexts.evm.address:s.data[a].ciphertexts.solana.address,n.name===i?console.log(`● ${c} [${n.name}]`):console.log(`○ ${c} [${n.name}]`)}},Ie=async(e,t,a)=>{const n=p.resolve(e,"network.json"),r=JSON.parse(d.readFileSync(n,"utf8")).networks,o=r.length;let s=ie(e,t),i=["> Back",new g.default.Separator("----------------------------------")],l=s.default_network,c="";a||(c=s.ciphertexts.address);let u=[];const m=Te(e,l);for(let t=0;t<o;t++){const n=r[t],o=Te(e,n.name);"PK"===s.account_type&&m!==o||(n.name===l?a?i.push(`● ${n.name}`):i.push(`● ${c} [${n.name}]`):a?i.push(`○ ${n.name}`):i.push(`○ ${c} [${n.name}]`),u.push(n.name))}const w=await ct(i);if("> Back"===w)return;let f=i.indexOf(w);if(s.default_network=u[f-2],le(e,t,s),!a){let t=s.default_network,a=Ce(e,t);console.log(ke.green(` Address No: #0\n Network: ${t}\n ${a.nativeCurrency.symbol} Balance: 0`))}},je=async(e,t,a)=>{const n=Ce(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===L(n.chainId.toString())?await v(e,r):await k(e,r),s.status){let e=new l.BigNumber(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,l.BigNumber.ROUND_FLOOR)}return T(n.chainId.toString(),[e],["0"]),s},Le=(e,t,a)=>{const n=ie(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},qe=e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8")).networks,n=a.length;let r=[];for(let e=0;e<n;e++)"evm"===L(a[e].chainId.toString())&&r.push(a[e].name);return r},Re=e=>{const t=p.resolve(e,"network.json");return JSON.parse(d.readFileSync(t,"utf8")).status},ze=require("chalk"),Je=async(e,t)=>{let a=p.join(e,"assets.json");if(!At(a))return[];const n=d.readFileSync(a).toString(),r=JSON.parse(n);return t in r?r[t]:[]},Ke=async(e,t,a)=>{const n=await Je(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},Ue=async(e,t,a)=>{const n=Ce(e,t),r=L(n.chainId.toString()),o=await Je(e,n.chainId.toString());if(!o)return void console.log(ze.red("No asset found"));const s=await De(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(ze.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(ze.red("No asset found"))},Ee=async(e,t,a)=>{const n=Ce(e,t);let r=(await Je(e,n.chainId.toString())).map(e=>e.address);r.push("0"),T(n.chainId.toString(),[a],r)},Me=async e=>{const t=p.resolve(e,"network.json");let a=[],n=JSON.parse(d.readFileSync(t,"utf8")).networks;for(let e=0;e<n.length;e++)a.push(`${e+1}. ${n[e].name}`);let r=(await ct(a)).split(".")[1].trim();const o=Te(e,r),s=Ce(e,r),i=await Ve("Enter contract address",lt);let l;if("evm"===o){if(!(c=i).startsWith("0x")||42!==c.length)return void console.log(ze.red("evm address format error"));l=await x(i,s.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(i))return void console.log(ze.red("solana address format error"));l=await N(i,s.rpcUrl)}var c;if(!l.status)return void console.log(ze.red(l.output));l.output.name||(l.output.name=await Ve("Please input token name")),l.output.symbol||(l.output.symbol=await Ve("Please input token symbol")),console.log(ze.green(`Token ${l.output.symbol}(${l.output.name}) loaded successfully.`));let u=await Ve("Enter decimals for display",at);u=parseInt(u),await(async(e,t,a,n,r,o,s)=>{let i=p.join(e,"assets.json"),l={};if(At(i)){const e=d.readFileSync(i).toString();l=JSON.parse(e)}void 0===l[t]&&(l[t]=[]);for(let e=0;e<l[t].length;e++)if(l[t][e].address.toLocaleLowerCase()===a.toLocaleLowerCase()||l[t][e].symbol.toLocaleLowerCase()===n.toLocaleLowerCase())return l[t][e]={address:a,symbol:n,name:r,decimals:o,display_decimals:s},void d.writeFileSync(i,JSON.stringify(l,null,4));l[t].push({address:a,symbol:n,name:r,decimals:o,display_decimals:s}),d.writeFileSync(i,JSON.stringify(l,null,4))})(e,s.chainId.toString(),i,l.output.symbol,l.output.name,l.output.decimals,u)},De=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($(e,o.address,a)):"solana"===n&&s.push(P(e,o.address,a))}let i=await Promise.all(s),c=[];for(let a=0;a<o;a++){let n=t[a],o=n.decimals;if(!i[a].status)return console.log(ze.red(i[a].output)),null;let s=new l.BigNumber(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,l.BigNumber.ROUND_FLOOR);c.push({address:n.address,symbol:n.symbol,balance:s}),T(r,[e],[n.address])}return T(r,[e],["0"]),c},Ge=async(e,t,a,n,r,o,s)=>{let i=a.length,c=Ce(e,r),u="evm"===L(c.chainId.toString());if(o&&await A(t,"0",c.chainId.toString(),n,u,c.multicallAddress?c.multicallAddress:""),s){let o=Pe(e,r);for(let e=0;e<i;e++){let r=a[e].address;o.includes(r)&&await A(t,r,c.chainId.toString(),n,u,c.multicallAddress?c.multicallAddress:"")}}let d=((e,t,a,n)=>{let r={};if(!(e in f))return r;a.unshift({address:"0",name:n.nativeCurrency.name,symbol:n.nativeCurrency.symbol,decimals:n.nativeCurrency.decimals,display_decimals:4});let o=t.length;for(let n=0;n<o;n++){let o=t[n];if(o)for(let t=0;t<a.length;t++){let n=a[t],s="0";f[e][n.address]&&(o in f[e][n.address]&&(s=new l.BigNumber(f[e][n.address][o]).dividedBy(10**n.decimals).toFixed(n.display_decimals||4,l.BigNumber.ROUND_FLOOR)),r[o]||(r[o]={}),r[o][n.symbol]=s)}}return r})(c.chainId.toString(),t,a,c);return d},We=require("chalk"),He=process.env.HOME||process.env.USERPROFILE,Ze=`${He}/.wative`,Ve=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:n}=await g.default.prompt(a);return n.trim().toString()},Xe=async e=>{for(let t=0;t<5;t++){let t=await Ye(e,"Input start address or index");if(!t)return console.log(We.red("Invalid start account index")),null;let a=await Ye(e,"Input end address or index");if(!a)return console.log(We.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(We.red("Invalid address range"))}return null},Qe=async(e,t,a)=>{let n=p.join(e,`accounts/${t}.json`);if(!d.existsSync(n))return null;let r=JSON.parse(d.readFileSync(n,"utf8")),o=r.data,s=r.account_type,i=o.length;if(0===i)return null;for(let e=0;e<i;e++){if("PK"===s&&o[e].ciphertexts.address.toLocaleLowerCase()===a.toLocaleLowerCase())return e.toString();if("PP"===s&&(o[e].ciphertexts.evm.address.toLocaleLowerCase()===a.toLocaleLowerCase()||o[e].ciphertexts.solana.address.toLocaleLowerCase()===a.toLocaleLowerCase()))return e.toString()}return null},Ye=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 Ve(t,it),a=Ot(e);if("unknown"===a){if(Number(e)>s){console.log(We.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},et=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"),tt=e=>!(e.length<6)||"Address length should be greater than 6",at=e=>!isNaN(Number(e))||"Value should be a number",nt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",rt=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===F.includes(t[e]))return"Passphrase word should be valid";return!0},ot=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},st=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},it=e=>!1===isNaN(Number(e))||lt(e),lt=e=>"unknown"!=Ot(e)||"Address should be valid",ct=async(e,t,a)=>{const n=[{type:"list",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:r}=await g.default.prompt(n);return r.toString()},ut=async(e,t,a)=>{const n=[{type:"checkbox",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:r}=await g.default.prompt(n);return r},dt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Ve(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},pt=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await Ve(t);try{if(""===n&&a)return null;if("solana"===L(e.toString()))return n;const t=await b(n);if(!t.status){console.log(We.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(We.red("Rpc url not match chain id"))}catch(e){console.log(We.red(e.message))}}return null},mt=async e=>{for(let t=0;t<5;t++){let t=await Ve(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(We.red("Multicall address length must be 42"))}return null},gt=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Ve(e);if(""===a)return null;if(t.test(a))return a}return null},wt=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Ve(e);if(""===a)return null;if(t.test(a))return a}return null},ft=(e,t)=>{const a=se(e).accounts,n=yt(a).indexOf(t);return-1!==n?a[n]:t},ht=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),yt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(ht(e[a]));return t},bt=async(e,t)=>{let a=yt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Ve(e);t=t.trim();let r=ht(t);if(n.test(r)){if(a.includes(r)){console.log(We.red("Account name already exists"));continue}return t}}return null},kt=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:n}=await g.default.prompt(a);return n.trim().toString()},vt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await g.default.prompt(t);return a},St=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:n}=await g.default.prompt(a);return n.trim().toString()},xt=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=We.green("✔"),s=We.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 g.default.prompt(t);return a},Nt=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:n}=await g.default.prompt(a);return n},$t=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:n}=await g.default.prompt(a);return n.trim().toString()},Pt=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},Bt=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},Ot=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",At=e=>(e=e.trim(),d.existsSync(e)),Tt=e=>new Promise(t=>setTimeout(t,e)),Ct=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),Ft=(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}},It=(e,t)=>{const a=[];for(let n=0;n<e.length;n++){const r=Ft(e[n],t);a.push(r)}return a.concat(a)},jt=(e,t,a,n,r,o,s,i,l)=>{for(let c=i;c<l;c++){let i=c>=t.length/2?c-t.length/2:c,l=e[i];if(!l.name)continue;let u=l.name,d=t[c],p="";if(!d)continue;for(let e in a[d])(o||e!==r)&&(s||e===r)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(n[e])} `));let m=u.split("(");if(m.length>1){let t=m[1];e[i].name=m[0]+` ${p}`+`(${t}`}else e[i].name=m[0]+` ${p}`}},Lt=async(e,t,a,n,r,o,s,i,l,c)=>{const u=[{type:"list",name:"inputText",message:l||"Choose an option",choices:e,pageSize:30,default:c,loop:!0,filter:e=>e}],d=g.default.prompt(u);let p,m=0,w=0;for(;!d.ui.activePrompt.answers[d.ui.activePrompt.opt.name];){if(i||await Tt(1e3),p===d.ui.activePrompt.selected)continue;if(m===d.ui.activePrompt.selected?w+=1:(w=0,m=d.ui.activePrompt.selected),i){w=6,i=!1;const e=d.ui.activePrompt.opt.pageSize,a=It(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:n,toIndex:o}=_t(m,e,a.length),s=a.slice(n,o);if(!C(r.chainId.toString(),s)){w=0;continue}}if(w<5)continue;w=0;const e=d.ui.activePrompt.opt.pageSize,l=It(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:c,toIndex:u}=_t(m,e,l.length),g=l.slice(c,u);let f=await Ge(a,g,n,r.rpcUrl,r.name,o,s),h={};for(let e in f)for(let t in f[e]){let a=f[e][t].length+1;h[t]?h[t]<a&&(h[t]=a):h[t]=a}const y=r.nativeCurrency.symbol;jt(d.ui.activePrompt.opt.choices.choices,l,f,h,y,o,s,c,u),d.ui.activePrompt.screen.render(""),d.ui.activePrompt.render(),p=m}return d.ui.activePrompt.answers[d.ui.activePrompt.opt.name]};require("wative-core");const qt=async(e,t)=>{switch(await ct(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await Oe(e);break;case"> Accounts":await be(e,t);break;case"> Tools":await Y(e,t);break;case"> Exit":return}await qt(e,t)},{WativeCore:Rt}=require("wative-core"),zt=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:",zt.version),console.log(We.green(m.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const e=await(async()=>{let e=await Ve(`Keystore storage located in (default: ${Ze})`);return e||(e=Ze),e=e.trim(),e=e.replace("~",He),d.existsSync(e)||d.mkdirSync(e,{recursive:!0}),e})();await(async e=>{const t=p.resolve(e,"network.json");if(d.existsSync(t))return;const a={networks:_,currentNetwork:"Ethereum Mainnet",accounts:[]};d.writeFileSync(t,JSON.stringify(a,null,2))})(e),(e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));a.status||(a.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),a.showTokens||(a.showTokens={});let n=a.accounts.length;for(let t=0;t<n;t++){let r=a.accounts[n-1-t],o=ht(r),s=p.resolve(e,`accounts/${o}.json`);d.existsSync(s)||a.accounts.splice(n-1-t,1)}d.writeFileSync(t,JSON.stringify(a,null,4));let r=a.accounts,o=yt(r);for(let t=0;t<o.length;t++){let a=p.resolve(e,`accounts/${o[t]}.json`),n=JSON.parse(d.readFileSync(a,"utf8"));"PP"!==n.account_type&&("data"in n||(n.data=[{ciphertexts:n.ciphertexts}],delete n.ciphertexts,d.writeFileSync(a,JSON.stringify(n,null,4))))}})(e);const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=yt(a.accounts);const r=new Rt(e,n,null,!0);await qt(e,r)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("fs"),require("path"),require("figlet"),require("inquirer"),require("web3"),require("@solana/web3.js"),require("@solana/spl-token"),require("@metaplex-foundation/js"),require("bignumber.js")):"function"==typeof define&&define.amd?define(["fs","path","figlet","inquirer","web3","@solana/web3.js","@solana/spl-token","@metaplex-foundation/js","bignumber.js"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).fs,e.path,e.figlet,e.inquirer,e.Web3,e.web3_js,e.splToken,e.js,e.bignumber_js)}(this,function(e,t,a,n,r,o,s,i,l){"use strict";function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var n=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,n.get?n:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var d=u(e),p=u(t),m=u(a),g=c(n),w=c(r);const f={},h=[{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall.Call[]",name:"calls",type:"tuple[]"}],name:"aggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes[]",name:"returnData",type:"bytes[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"getEthBalance",outputs:[{internalType:"uint256",name:"balance",type:"uint256"}],stateMutability:"view",type:"function"}],y=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],b=async e=>{let t=new w.default(e);return await Bt(t.eth.getChainId,[])},k=async(e,t)=>{const a=new w.default(t);return await Bt(a.eth.getBalance,[e])},v=async(e,t)=>{const a=new o.Connection(t);return await Bt(a.getBalance.bind(a),[new o.PublicKey(e)])},S=async(e,t)=>{const a=new o.Connection(t),n=new o.PublicKey(e);let r=await Bt(a.getAccountInfo.bind(a),[n]);if(!r.status)return{status:!1,output:"Failed to get mint account info"};const s=r.output;if(!s)return{status:!1,output:"Mint account not found"};return{status:!0,output:s.owner.toBase58()}},x=async(e,t)=>{const a=new(new w.default(t).eth.Contract)([{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],e);let n=await Bt(a.methods.symbol().call.bind(a),[]),r=await Bt(a.methods.name().call.bind(a),[]),o=await Bt(a.methods.decimals().call.bind(a),[]);return n.status&&r.status&&o.status?{status:!0,output:{symbol:n.output,name:r.output,decimals:o.output}}:{status:!1,output:"Failed to get token info"}},N=async(e,t)=>{let a=await S(e,t);if(!a.status)return{status:!1,output:"Failed to get token program id"};const n=a.output,r=new o.Connection(t),l=i.Metaplex.make(r),c=new o.PublicKey(e);let u=await Bt(s.getMint,[r,c,"finalized",new o.PublicKey(n)]),d={status:!0,output:{symbol:"",name:"",decimals:""}};if(!u.status)return{status:!1,output:"Failed to get token decimals"};d.output.decimals=u.output.decimals;try{const e=l.nfts().pdas().metadata({mint:c});if(await r.getAccountInfo(e)){const e=await l.nfts().findByMint({mintAddress:c});d.output.name=e.name,d.output.symbol=e.symbol}else try{const e=await s.getTokenMetadata(r,c);e&&(e.name&&(d.output.name=e.name),e.symbol&&(d.output.symbol=e.symbol))}catch(e){}}catch(e){return{status:!1,output:"Failed to get token name"}}return d},$=async(e,t,a)=>{const n=new(new w.default(a).eth.Contract)([{constant:!0,inputs:[{name:"who",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}],t);let r=await Bt(n.methods.balanceOf(e).call.bind(n),[]);return r.status?{status:!0,output:r.output}:{status:!1,output:"Failed to get token balance"}},P=async(e,t,a)=>{let n=await S(t,a);if(!n.status)return{status:!1,output:"Failed to get token program id"};const r=n.output,i=new o.Connection(a),l=s.getAssociatedTokenAddressSync(new o.PublicKey(t),new o.PublicKey(e),!1,new o.PublicKey(r));let c=await Bt(i.getTokenAccountBalance.bind(i),[l]);return c.status?{status:!0,output:c.output.value.amount}:c.output.includes("could not find account")?{status:!0,output:"0"}:{status:!1,output:"Failed to get token balance"}},B=async e=>{const t=new o.Connection(e);let a=await Bt(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}},O=async(e,t)=>{const a=new o.Connection(t);let n=await Bt(a.getAccountInfo.bind(a),[new o.PublicKey(e.toString())]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get account info"}},A=async(e,t,a,n,r,o)=>{let s;if(e=e.filter(e=>e&&e.length>30),a in f?s=f[a][t]||{}:(f[a]={},s={}),o&&o.length>0&&r){let a=await(async(e,t,a,n)=>{let r=[];try{let o=[];const s=new w.default(a),i=new s.eth.Contract(h,n);for(const a of e)if("0"===t){const e=i.methods.getEthBalance(a).encodeABI();o.push({target:n,callData:e})}else{const e=new s.eth.Contract(y,t).methods.balanceOf(a).encodeABI();o.push({target:t,callData:e})}const{returnData:l}=await i.methods.aggregate(o).call();for(let e=0;e<l.length;e++){const t=s.eth.abi.decodeParameter("uint256",l[e]);r.push(t)}}catch(e){console.log("Multicall aggregate failed")}return r})(e,t,n,o);if(e.length===a.length)for(let t=0;t<e.length;t++)s[e[t]]=a[t]}else for(const a of e)if(a&&!(a in s)){let e;e="0"===t?r?await k(a,n):await v(a,n):r?await $(a,t,n):await P(a,t,n),e.status&&(s[a]=e.output),await Tt(200)}return f[a][t]=s,f},T=(e,t,a)=>{for(let n=0;n<t.length;n++){let r=t[n];for(let t=0;t<a.length;t++){let n=a[t];try{delete f[e][n][r]}catch(e){}}}},C=(e,t)=>{let a=0;if(e in f&&"0"in f[e])for(let n=0;n<t.length;n++)t[n]in f[e][0]&&(a+=1);return 0!==a&&a/t.length>.8},F=["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}}],I=["901","902","903"],j=e=>I.includes(e)?9:18,L=e=>I.includes(e)?"solana":"evm",{BN:q}=require("bn.js"),{stripHexPrefix:R}=require("ethereumjs-util"),{BigNumber:z}=require("bignumber.js");function J(e){return new q(R(e.toString("hex")),16)}const K=e=>e.match(/^-?0x/u)?e:e.match(/^-?0X/u)?e.replace("0X","0x"):e.startsWith("-")?e.replace("-","-0x"):`0x${e}`;function U(e){return K(e.toString(16))}class E{constructor(e){this.query=new w.default(w.default.givenProvider||e).eth}async analyzeGasUsage(e){const t=await this.query.getBlock("latest",!1);let a,n=U(function(e,t,a){const n=new q(t),r=new q(a);return e.mul(n).div(r)}(J(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 z(t.toString()).multipliedBy(1.3).toFixed(0),t}addGasBuffer(e,t,a=1.3){const n=J(e),r=J(t).muln(.9),o=n.muln(a);return n.gt(r)?U(n):o.lt(r)?U(o):U(r)}async getBufferedGasLimit(e,t){const{blockGasLimit:a,estimatedGasHex:n,simulationFails:r}=await this.analyzeGasUsage(e);return{gasLimit:this.addGasBuffer(K(n),a,t),simulationFails:r}}async getGasPrice(){return await this.query.getGasPrice()}async getTransactionCount(e){return await this.query.getTransactionCount(e)}}const M=require("chalk");require("wative-core");const D=async e=>{let t=[new g.default.Separator("————Tx Detail—————-"),`from: ${e.from}`,`to: ${e.to}`,`nonce: ${e.nonce}`,`gasPrice: ${e.gasPrice}`,`data: ${e.data}`,`value: ${e.value}`,`gas: ${e.gas}`,new g.default.Separator("——————————————-"),"Send it now","Back"],a=await ct(t),n=t.indexOf(a);return 1===n&&(e.from=await Ve("from",lt)),2===n&&(e.to=await Ve("to",lt)),3===n&&(e.nonce=await Ve("nonce")),4===n&&(e.gasPrice=await Ve("gasPrice")),5===n&&(e.data=await $t("data")),6===n&&(e.value=await Ve("value")),7===n&&(e.gas=await Ve("gas")),9===n?e:10===n?null:await D(e)},G=async(e,t,a,n,r)=>{const o=await Ve("to",lt),s=new E(t),i=await s.getGasPrice(),c=new l.BigNumber(i.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR),u=await Ve(`Gas price (${c}), agree or enter`,nt);let d=u||c;d=new l.BigNumber(d).multipliedBy(1e9).toFixed(0);let p,m,g,f=await(async(e,t)=>{const a=new w.default(t);let n=await Bt(a.eth.getCode.bind(a),[e]);return n.status?{status:!0,output:n.output}:{status:!1,output:"Failed to get code"}})(o,t);if(!f.status)return void console.log(M.red(f.output));if(p="42161"===e||"421614"===e?"1700000":"21000","0x"===f.output){m="0x";let e=await k(n,t);if(!e.status)return void console.log(M.red(e.output));let r=new l.BigNumber(e.output),o=new l.BigNumber(d),s=r.minus(o.multipliedBy(Number(p))).toFixed(0,l.BigNumber.ROUND_FLOOR),i=new l.BigNumber(s).dividedBy(1e18).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(i)<new l.BigNumber(0))return void console.log(M.red("Not enough balance"));g=await H(i,s,a,18)}else m=await $t("data",Pt),g=await Ve("value",at);const h=await s.getTransactionCount(n),y=await Ve(`Nonce (${h}), agree or enter`);let b={from:n,to:o,nonce:y||h.toString(),gasPrice:d,data:m,value:g};if("0x"===m)b.gas=p;else{let e=b.gasPrice;delete b.gasPrice;try{b.gas=(await s.estimateTxGas(b)).toString()}catch(e){return void console.log(M.red("Error: "+e))}b.gasPrice=e}if(b=await D(b),!b)return;const v=await r.account.signTransaction(n,b,t);v.status?(console.log(M.green(`Transaction hash: ${v.output.transactionHash}`)),r.account.sendSignedTransaction(n,v.output.rawTransaction,t),T(e,[n,o],["0"])):console.log(M.red(v.output))},W=async(e,t,a,n,r)=>{const s=await Ve("to",lt);let i=(new o.Transaction).add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(n),toPubkey:new o.PublicKey(s),lamports:1e6}));i.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),i.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),i.feePayer=new o.PublicKey(n);let c=await(async e=>{const t=new o.Connection(e);let a=await Bt(t.getLatestBlockhash.bind(t),[{commitment:"finalized"}]);return a.status?{status:!0,output:a.output}:{status:!1,output:"Failed to get latest blockhash"}})(t);if(!c.status)return void console.log(M.red(c.output));i.recentBlockhash=c.output.blockhash;const u=await r.account.simulateTransaction(n,t,i);if(!u.status)return void console.log(M.red(u.output));if(!u.output||!u.output.value||0===u.output.value.unitsConsumed||u.output.value.err)return console.log(M.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(u.output,null,4)),void console.log("==============================================");let d=new l.BigNumber(u.output.value.unitsConsumed.toString()).multipliedBy(1.2).toFixed(0,l.BigNumber.ROUND_CEIL),p=new l.BigNumber(d);const m=await B(t);if(!m.status)return void console.log(M.red(m.output));const g=new l.BigNumber(m.output.toString()),w=p.multipliedBy(g).dividedBy(1e6).toFixed(0,l.BigNumber.ROUND_CEIL),f=await v(n,t);if(!f.status)return void console.log(M.red(f.output));const h=new l.BigNumber(f.output).minus(5e3).minus(w);let y=new l.BigNumber(h).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR);if(new l.BigNumber(y)<new l.BigNumber(0))return void console.log(M.red("Not enough balance"));let b=await H(y,h.toString(),a,9),k=new o.Transaction;k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number(p)})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(g)})),k.add(o.SystemProgram.transfer({fromPubkey:new o.PublicKey(n),toPubkey:new o.PublicKey(s),lamports:Number(b)})),k.feePayer=new o.PublicKey(n),k.recentBlockhash=c.output.blockhash;const S=await r.account.signTransaction(n,k,t);if(!S.status)return void console.log(M.red(S.output));let x=await r.account.sendSignedTransaction(n,S.output,t);x.status?(T(e,[n,s],["0"]),console.log(M.green(`Transaction hash: ${x.output}`))):console.log(M.red(x.output))},H=async(e,t,a,n)=>{let r=["> Input value",`> Total Balance (${e} ${a})`],o=await ct(r),s=r.indexOf(o),i="0";if(0===s){let e=await Ve("value",at);i=new l.BigNumber(e).multipliedBy(10**n).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===s&&(i=t);return new l.BigNumber(i).isLessThanOrEqualTo(new l.BigNumber(t))?i:(console.log(M.red("Not enough balance")),H(e,t,a,n))},Z=async(e,t,a,n,r)=>{let o,s,i;switch(await ct(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":i=await Ve("token ticker");let r=await Ke(e,a,i);if(0===r.length)return void console.log(M.red("Token not found"));let c=[];for(let e=0;e<r.length;e++){const a=await $(n,r[e].address,t);if(!a.status)return void console.log(M.red(a.output));let o=new l.BigNumber(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===r.length){c.push(`> 1. ${i} Balance: ${o}`);break}c.push(`> ${e+1}. ${i} Balance: ${o}(${r[e].address})`),c.push(r[e].address)}let u=await ct(c);const d=r[c.indexOf(u)];o=d.address,s=Number(d.decimals);break;case"> Input token contract address":o=await Ve("token contract address",lt);let p=await x(o,t);if(!p.status)return void console.log(M.red(p.output));s=Number(p.output.decimals),i=p.output.name}const c=await Ve("Receipt",lt),u=await $(n,o,t);if(!u.status)return void console.log(M.red(u.output));const d=new E(t),p=await d.getGasPrice(),m=new l.BigNumber(p.toString()).dividedBy(1e9).toFixed(4,l.BigNumber.ROUND_FLOOR),g=await Ve(`Gas price (${m}), agree or enter`,nt);let f=g||m;f=new l.BigNumber(f).multipliedBy(1e9).toFixed(0);let h=await V(u.output,i,s);const y=await(async(e,t,a)=>new w.default(a).eth.abi.encodeFunctionCall({constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},[e,t]))(c,h,t),b=await d.getTransactionCount(n),k=await Ve(`Nonce (${b}), agree or enter`);let v={from:n,to:o,nonce:k||b.toString(),gasPrice:f,data:y,value:"0"};if("0x"===y)v.gas="42161"===a||"421614"===a?"1700000":"21000";else{let e=v.gasPrice;delete v.gasPrice;try{v.gas=(await d.estimateTxGas(v)).toString()}catch(e){return void console.log(M.red("Failed to estimate gas, "+e.message))}v.gasPrice=e}if(v=await D(v),!v)return;const S=await r.account.signTransaction(n,v,t);S.status?(console.log(M.green(`Transaction hash: ${S.output.transactionHash}`)),r.account.sendSignedTransaction(n,S.output.rawTransaction,t),T(a,[n,c],["0",o])):console.log(M.red(S.output))},V=async(e,t,a)=>{let n=["> Input amount",`> Total Balance (${new l.BigNumber(e).dividedBy(10**a).toFixed(4,l.BigNumber.ROUND_FLOOR)} ${t})`],r=await ct(n),o=n.indexOf(r),s="0";if(0===o){let e=await Ve("amount",at);s=new l.BigNumber(e).multipliedBy(10**a).toFixed(0,l.BigNumber.ROUND_FLOOR)}else 1===o&&(s=e);return new l.BigNumber(s).isLessThanOrEqualTo(new l.BigNumber(e))?s:(console.log(M.red("Not enough balance")),V(e,t,a))},X=async(e,t,a,n)=>{let r=Le(e,t,a),i=Te(e,r),c=Ot(a);if(i!==c&&("evm"===c&&(r="Ethereum Mainnet"),"solana"===c&&(r="Solana Mainnet"),i=Te(e,r)),"evm"===i){if(await Nt(`Network (${r}), want a change?`,!1)){const t=qe(e);r=await ct(t,"Select a network")}}let u=await je(a,e,r);if(!u.status)return void console.log(M.red(u.output));const d=Ce(e,r);console.log(M.green(` ${d.nativeCurrency.symbol} Balance: ${u.output}`));const p=["> Send Raw Tx","> Send Token",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(p)){case"> Send Raw Tx":"evm"===c&&await G(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,n),"solana"===c&&await W(d.chainId.toString(),d.rpcUrl,d.nativeCurrency.symbol,a,n);break;case"> Send Token":"evm"===c&&await Z(e,d.rpcUrl,d.chainId.toString(),a,n),"solana"===c&&await(async(e,t,a,n,r)=>{let i,c,u;switch(await ct(["> Input token ticker","> Input token contract address"])){case"> Input token ticker":u=await Ve("token ticker");let r=await Ke(e,a,u);if(0===r.length)return void console.log(M.red("Token not found"));let o=[];for(let e=0;e<r.length;e++){const a=await P(n,r[e].address,t);if(!a.status)return void console.log(M.red(a.output));let s=new l.BigNumber(a.output).dividedBy(10**Number(r[e].decimals)).toFixed(4,l.BigNumber.ROUND_FLOOR);if(1===r.length){o.push(`> 1. ${u} Balance: ${s}`);break}o.push(`> ${e+1}. ${u} Balance: ${s}(${r[e].address})`),o.push(r[e].address)}let s=await ct(o);const d=r[o.indexOf(s)];i=d.address,c=Number(d.decimals);break;case"> Input token contract address":i=await Ve("token contract address",lt);let p=await N(i,t);if(!p.status)return void console.log(M.red(p.output));c=Number(p.output.decimals),u=p.output.name}const d=await Ve("Receipt",lt),p=await P(n,i,t);if(!p.status)return void console.log(M.red(p.output));let m=await V(p.output,u,c),g=await S(i,t);if(!g.status)return void console.log(M.red(g.output));const w=new o.PublicKey(g.output);let f=s.getAssociatedTokenAddressSync(new o.PublicKey(i),new o.PublicKey(n),!0,w);const h=await O(f.toString(),t);if(!h.status)return void console.log(M.red(h.output));if(!h.output||h.output.owner.toString()===o.PublicKey.default)return void console.log(M.red("From token account not found"));let y=s.getAssociatedTokenAddressSync(new o.PublicKey(i),new o.PublicKey(d),!1,w);const b=await O(y.toString(),t);if(!b.status)return void console.log(M.red(b.output));let k=new o.Transaction,v=new o.Transaction;b.output&&b.output.owner.toString()!==o.PublicKey.default||(k.add(s.createAssociatedTokenAccountInstruction(new o.PublicKey(n),new o.PublicKey(y),new o.PublicKey(d),new o.PublicKey(i),w)),v.add(s.createAssociatedTokenAccountInstruction(new o.PublicKey(n),new o.PublicKey(y),new o.PublicKey(d),new o.PublicKey(i),w))),k.add(s.createTransferInstruction(f,y,new o.PublicKey(n),Number(m),[],w)),k.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:2e5})),k.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:1e3})),k.feePayer=new o.PublicKey(n);const x=await r.account.simulateTransaction(n,t,k);if(!x.status)return void console.log(M.red(x.output));if(!x.output||!x.output.value||0===x.output.value.unitsConsumed||x.output.value.err)return console.log(M.red("Simulate error")),console.log("==================reason====================="),console.log(JSON.stringify(x.output,null,4)),void console.log("==============================================");let $=new l.BigNumber(x.output.value.unitsConsumed.toString());$=new l.BigNumber(Math.ceil(1.2*Number($)));const A=await B(t);if(!A.status)return void console.log(M.red(A.output));const C=new l.BigNumber(A.output.toString());v.add(s.createTransferInstruction(f,y,new o.PublicKey(n),Number(m),[],w)),v.add(o.ComputeBudgetProgram.setComputeUnitLimit({units:Number($)})),v.add(o.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Number(C)})),k.feePayer=new o.PublicKey(n);const F=await r.account.signTransaction(n,v,t);if(!F.status)return void console.log(M.red(F.output));let _=await r.account.sendSignedTransaction(n,F.output,t);_.status?(T(a,[n,d],["0",i]),console.log(M.green(`Transaction hash: ${_.output}`))):console.log(M.red(_.output))})(e,d.rpcUrl,d.chainId.toString(),a,n);break;case"> Back":return}},Q=async(e,t,a,n)=>{const r=["> SendTx","> SignMessage",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> SendTx":await X(e,t,a,n);break;case"> SignMessage":{const e=await $t("Input the message to sign"),t=n.account.signMessage(a,e);if(!t.status){console.log(M.red(t.output));break}console.log(M.green("Signature: "+t.output));break}case"> Back":return}await Q(e,t,a,n)},Y=async(e,t)=>{let a,n=["> Send Tx","> Search Accounts",new g.default.Separator("----------------------------------"),"> Back"],r=await ct(n);if("> Back"===r)return;"> Send Tx"===r&&(a=await Ve("Input address to send tx",lt)),"> Search Accounts"===r&&(a=await Ve("Input part address to send tx",tt));let o=t.account.getAccountLabel(a);if(null===o)return console.log(M.red("Account not found")),void await Y(e,t);let s=o.account_label,i=ft(e,s);if(a=o.account_address,null===s)return console.log(M.red("Account not found")),void await Y(e,t);const l=await Qe(e,s,a);if(null===l)return console.log(M.red("Account not found")),void await Y(e,t);console.log(M.green(`Address found!\n address: ${a}\n account name: [${i}]\n account index: #${l}`)),(await ce(e,s,t)).isLoginIn?(await Q(e,s,a,t),await Y(e,t)):await Y(e,t)},ee=require("chalk");require("dotenv").config();const te=require("cli-progress");require("wative-core");const ae={keystore_slug:"",default_account_index:0},ne=async e=>{const t=se(e);let a=[];t.accounts&&(a=t.accounts);let n=await bt("Account Name",a);return null===n?null:{account_name:n,password:await xt(`Please set a password for Account [${n}]`),selected_default_network:await Ae(e)}},re=async(e,t,a,n,r,o,s)=>{let i=await Ce(e,r);"evm"!==L(i.chainId.toString())||n.startsWith("0x")||(n="0x"+n);let l=await o.account.generatePKAccount(a,n,t,i.chainId.toString(),s);if(!l.status)return void console.log(ee.red(l.output));let c,u=p.join(e,`accounts/${a}.json`);if(d.existsSync(u)){let e=JSON.parse(d.readFileSync(u,"utf8"));if("data"in e){if(e.data.map(e=>e.ciphertexts.address).includes(l.output.ciphertexts.address))return void console.log(ee.red("The account has already been imported"));e.data.push({ciphertexts:l.output.ciphertexts}),c=e}else e.data=[{ciphertexts:e.ciphertexts}],delete e.ciphertexts,e.data.push({ciphertexts:l.output.ciphertexts}),c=e}else l.output.data=[{ciphertexts:l.output.ciphertexts}],delete l.output.ciphertexts,l.output.default_network=r,c=l.output;d.writeFileSync(u,JSON.stringify(c,null,4)),o.account.reloadAccount()},oe=async(e,t)=>{const a=["> Import Passphrase","> Import Private Key",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(a)){case"> Import Passphrase":await(async(e,t)=>{let a=await ne(e);if(!a)return;let n=await St("Please enter a mnemonic [split by space]",rt);n=n.replace(/\s+/g," ");let r=ht(a.account_name);const o=t.account.generatePPAccount(r,n,a.password);if(!o.status)return void console.log(ee.red(o.output));let s=p.join(e,`accounts/${r}.json`);o.output.default_network=a.selected_default_network,d.writeFileSync(s,JSON.stringify(o.output,null,4));const i=p.resolve(e,"network.json"),l=JSON.parse(d.readFileSync(i,"utf8"));l.accounts.push(a.account_name),d.writeFileSync(i,JSON.stringify(l,null,4))})(e,t);break;case"> Import Private Key":await(async(e,t)=>{let a=await ne(e);if(!a)return;let n=await kt("Please enter a private key"),r=ht(a.account_name);await re(e,a.password,r,n,a.selected_default_network,t,!0);const o=p.resolve(e,"network.json"),s=JSON.parse(d.readFileSync(o,"utf8"));s.accounts.push(a.account_name),d.writeFileSync(o,JSON.stringify(s,null,4))})(e,t);break;case"> Back":return}t.account.reloadAccount()},se=e=>{const t=p.resolve(e,"network.json");return JSON.parse(d.readFileSync(t,"utf8"))},ie=(e,t)=>{const a=p.join(e,`accounts/${t}.json`);return JSON.parse(d.readFileSync(a,"utf8"))},le=(e,t,a)=>{const n=p.join(e,`accounts/${t}.json`);d.writeFileSync(n,JSON.stringify(a,null,4))},ce=async(e,t,a)=>{if(a.account.isLogin(t))return{isLoginIn:!0};for(let n=0;n<3;n++){let n,r=ft(e,t),o="WATIVE_PASSWD_"+t;if(n=process.env[o]&&""!==process.env[o]?process.env[o]:process.env.WativePassword&&""!==process.env.WativePassword?process.env.WativePassword:await vt(`Please input the password for Account [${r}]`),!n)return console.log(ee.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 ct(i,s.output);if("> Back"===l)return{isLoginIn:!1}}return{isLoginIn:!1}},ue=async(e,t)=>{const a=se(e).accounts;let n=["> Back",new g.default.Separator("----------------------------------")];const r=a.length;if(0===r)return void console.log(ee.red("No address here yet"));for(let t=0;t<r;t++){const r=a[t],o=ht(r),s=ie(e,o);"data"in s?n.push(`${t+1}) ${r} [${s.account_type}:${s.data.length}]`):n.push(`${t+1}) ${r} [${s.account_type}:1]`)}const o=await ct(n,"Select an account");if("> Back"===o)return;const s=a[n.indexOf(o)-2],i=ht(s);console.log(ee.green(`Keystore slug: [${i}]`));let l=await ce(e,i,t);l.isLoginIn&&await pe(e,i,t,l.password),await ue(e,t)},de=async(e,t,a)=>{const n=await ie(e,t);let r=["> Disabled Slots","> Add Single","> Add Range",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> Back":return;case"> Disabled Slots":{let a=n.disabled_slots;if(!a||0===a.length){console.log(ee.red("No disabled slots here yet"));break}let r=n.data,o=["> Back",new g.default.Separator("----------------------------------")],s=n.default_network;for(let t=0;t<a.length;t++){let n=a[t].from,i=a[t].to,l=s,c=s;"default_network"in r[n]&&(l=r[n].default_network),"default_network"in r[i]&&(c=r[i].default_network);let u,d,p=Te(e,l),m=Te(e,c);if("evm"!==p&&"solana"!==p)throw new Error(`Invalid network type: ${p}`);if("evm"!==m&&"solana"!==m)throw new Error(`Invalid network type: ${m}`);u="evm"===p?r[n].ciphertexts.evm.address:r[i].ciphertexts.solana.address,d="evm"===m?r[i].ciphertexts.evm.address:r[i].ciphertexts.solana.address,n===i?o.push(`${t+1}. ${u}[${n}]`):o.push(`${t+1}. ${u}[${n}]-${d}[${i}]`)}let i=await ct(o);if("> Back"===i)break;if(!await Nt(`Are you sure to delete the ${i}?`,!0))break;let l=o.indexOf(i)-2;n.disabled_slots.splice(l,1),le(e,t,n);break}case"> Add Single":{let a=await Ye(n,"Input address or index");if(null===a){console.log(ee.red("Invalid account index"));break}n.disabled_slots?n.disabled_slots.push({from:a,to:a}):n.disabled_slots=[{from:a,to:a}],le(e,t,n);break}case"> Add Range":{let a=await Xe(n);if(!a){console.log(ee.red("Invalid account range"));break}n.disabled_slots?n.disabled_slots.push(a):n.disabled_slots=[a],le(e,t,n);break}}await de(e,t)},pe=async(e,t,a,n)=>{let r,o=await ie(e,t);r="PP"===o.account_type?["> Address List","> Expand Address","> Slice Address","> Disable Address","> Reset Account Password",`> Switch Networks [${o.default_network}]`,"> Remove",new g.default.Separator("----------------------------------"),"> Back"]:["> Address List","> Import Private Key","> Remove Address","> Reset Account Password",`> Switch Networks [${o.default_network}]`,"> Remove",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(r)){case"> Address List":await me(e,t,a);break;case"> Expand Address":{const n=await Ve("Expand accounts count",ot);if(Number(n)>2e3){console.log(ee.red("Too many accounts, please input less than 2000"));break}await we(e,t,Number(n),a);break}case"> Import Private Key":await(async(e,t,a,n)=>{let r=await Ve("Please enter a private key"),o=p.join(e,`accounts/${a}.json`),s=JSON.parse(d.readFileSync(o,"utf8"));await re(e,t,a,r,s.default_network,n,!1)})(e,n,t,a);break;case"> Slice Address":{const n=await Ve("Please input last account number",st);await fe(e,t,Number(n),a);break}case"> Remove Address":await he(e,t,a);break;case"> Disable Address":await de(e,t);break;case"> Reset Account Password":{let n=ft(e,t);const r=await xt(`Please input new password for Account [${n}]`),o=await xt(`Please confirm new password for Account [${n}]`);if(!r||!o||r!==o){console.log(ee.red("Passwords do not match"));break}return void await a.account.resetPassword(t,r)}case`> Switch Networks [${o.default_network}]`:await Ie(e,t,!0);break;case"> Remove":return void await ye(e,t);case"> Back":return}await pe(e,t,a,n)},me=async(e,t,a)=>{const n=await ie(e,t);let r=["> Back",new g.default.Separator("----------------------------------")],o=n.disabled_slots,s=Re(e),i=n.default_network,l=Ce(e,i),c=L(l.chainId.toString()),u=n.data.length.toString().length+1;for(let e=0;e<n.data.length;e++){let t,i=n.data[e].tag?`(${n.data[e].tag})`:"",l=a.account.checkIsDisableAddress(o,e);t="PP"===n.account_type?"evm"===c?n.data[e].ciphertexts.evm.address:n.data[e].ciphertexts.solana.address:n.data[e].ciphertexts.address,l?r.push(new g.default.Separator(ee.yellow(`#${e.toString().padEnd(u)} ${Ct(t,s.fullAddr)} ${i}`))):r.push(`#${e.toString().padEnd(u)} ${Ct(t,s.fullAddr)} ${i}`)}let d,p=ae.keystore_slug===t?r[ae.account_index]:r[0],m=ae.keystore_slug===t&&ae.account_index>0,w=await Je(e,l.chainId.toString());if(m&&ae.account_index>15){let e=r.slice(0,ae.account_index-15);d=r.slice(ae.account_index-15).concat(e)}else d=r.slice(0);let f=await Lt(d,"evm"===c,e,w,l,s.gasToken,s.extendedToken,m,"Select an account",p);"> Back"!==f&&(ae.keystore_slug=t,ae.account_index=r.indexOf(f),await ge(e,t,r.indexOf(f)-2,a),await me(e,t,a))},ge=async(e,t,a,n)=>{const r=await ie(e,t);let o=r.default_network,s=Fe(e,t,a);const i=await Ce(e,o),l=await je(s,e,o);l.status?console.log(ee.green(` Address No: #${a}\n Network: ${o}\n ${i.nativeCurrency.symbol} Balance: ${l.output}`)):console.log(ee.green(` Address No: #${a}\n Network: ${o}\n ${i.nativeCurrency.symbol}`));let c="> Tag";"tag"in r.data[a]&&""!==r.data[a].tag&&(c=`> Tag(${r.data[a].tag})`);let u=["> Tools","> Show address","> Assets",c,"> Reload balances","> Dump private key",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(u)){case"> Tools":await Q(e,t,s,n);break;case"> Show address":await _e(e,t,a);break;case"> Assets":await Ue(e,o,s);break;case"> Reload balances":await Ee(e,o,s);break;case c:{let n="Current tag";"tag"in r.data[a]&&""!==r.data[a].tag&&(n=`Current tag (${r.data[a].tag})`);let o=await Ve(n,et);r.data[a].tag=o.replace(/\s+/g," ").trim(),le(e,t,r);break}case"> Dump private key":{let r=Fe(e,t,a),o=await n.account.showPrivateKey(r);console.log("account: ",r),console.log("private key: ",o);break}case"> Back":return}},we=async(e,t,a,n)=>{const r=await ie(e,t),o=r.data.length,s=new te.SingleBar({},te.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(ee.red(a.output));r.data.push({ciphertexts:a.output}),s.increment()}s.stop(),le(e,t,r),n.account.reloadAccount()},fe=async(e,t,a,n)=>{const r=await ie(e,t);r.data=r.data.slice(0,a+1),le(e,t,r),n.account.reloadAccount()},he=async(e,t,a)=>{let n=await Ve("Please input the accountIndex to remove this account",at);if("0"===n)return void console.log(ee.red("Can't remove the first account"));let r=await ie(e,t);await Nt(`Are you sure you want to remove this account(${r.data[n].ciphertexts.address})`,!0)&&(r.data.splice(Number(n),1),le(e,t,r),a.account.reloadAccount())},ye=async(e,t)=>{let a=await Ve("Please input the account name to remove this account"),n=ft(e,t);if(a!==n)return void console.log(ee.red("Can't remove this account"));if(!await Nt(`Are you sure you want to remove this account(${n})`,!0))return;let r=p.join(e,`accounts/${t}.json`);d.rmSync(r);const o=p.resolve(e,"network.json");if(!d.existsSync(o))return;const s=JSON.parse(d.readFileSync(o,"utf8"));let i=s.accounts.indexOf(n);s.accounts.splice(i,1),d.writeFileSync(o,JSON.stringify(s,null,2))},be=async(e,t)=>{const a=p.resolve(e,"accounts");d.existsSync(a)||d.mkdirSync(a);let n;switch(n=0===se(e).accounts.length?["> Create a new account",new g.default.Separator("----------------------------------"),"> Back"]:["> Select an account","> Create a new account",new g.default.Separator("----------------------------------"),"> Back"],await ct(n)){case"> Select an account":await ue(e,t);break;case"> Create a new account":await oe(e,t);break;case"> Back":return}await be(e,t)},ke=require("chalk"),ve=async(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));let r=[];for(let e=0;e<n.networks.length;e++){const t=n.networks[e];r.push(t.name)}let o=t.rpcUrl,s=t.chainId.toString(),i=t.nativeCurrency.symbol,l=t.name,c=t.multicallAddress,u=t.color;if("Ethereum Mainnet"===t.name||"Solana Mainnet"===t.name)o=await pt(t.chainId.toString(),`Rpc Url (default: ${t.rpcUrl})`,!0);else{if(l=await Ve(`Chain Name (default: ${t.name})`),l&&l!==t.name&&r.includes(l))return void console.log(ke.red("Chain Name already exists"));s=await dt(`Chain Id (default: ${t.chainId})`,!0),o=await pt(s||t.chainId,`RPC Url (default: ${t.rpcUrl})`,!0),i=await gt(`Symbol (default: ${t.nativeCurrency.symbol})`),c=await mt(t.multicallAddress?`Multicall Address (Optional) (default: ${t.multicallAddress})`:"Multicall Address (Optional)"),u=await wt(t.color?`Color (Optional): (default: ${t.color})`:"Color (Optional)")}o=o||t.rpcUrl,s=s||t.chainId.toString(),i=i||t.nativeCurrency.symbol,l=l||t.name,c=c||t.multicallAddress,u=u||t.color;let m=j(s.toString()),g={name:l||t.name,chainId:Number(s)||t.chainId,rpcUrl:o||t.rpcUrl,nativeCurrency:{name:i||t.nativeCurrency.symbol,symbol:i||t.nativeCurrency.symbol,decimals:m||t.nativeCurrency.decimals}};(c||t.multicallAddress)&&(g.multicallAddress=c||t.multicallAddress),(u||t.color)&&(g.color=u||t.color);for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===t.name){n.networks[e]=g;break}d.writeFileSync(a,JSON.stringify(n,null,2))},Se=async(e,t)=>{const a=p.resolve(e,"network.json");let n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++)if(n.networks[e].name===t.name){n.networks.splice(e,1);break}t.name===n.currentNetwork&&(n.currentNetwork="Ethereum Mainnet"),d.writeFileSync(a,JSON.stringify(n,null,2))},xe=async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=[],r=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];"solana"===L(t.chainId.toString())?r.push(e):n.push(e)}let o=["> Back","+ Add Network",new g.default.Separator("----Networks(evm)----")];for(let e=0;e<n.length;e++){const t=n[e];let r=`${e+1}.${a.networks[t].name}`;0===e&&(r+=" 🔒"),o.push(r)}o.push(new g.default.Separator("----Networks(solana)----"));for(let e=0;e<r.length;e++){const t=r[e];let n=`${e+1}.${a.networks[t].name}`;0===e&&(n+=" 🔒"),o.push(n)}const s=await ct(o);if("> Back"===s)return;if("+ Add Network"===s)return void await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=[];for(let e=0;e<a.networks.length;e++){const t=a.networks[e];n.push(t.name)}console.log(ke.green("Please input someting about network"));const r=await Ve("Chain Name");if(n.includes(r))return void console.log(ke.red("Chain Name already exists"));const o=await dt("Chain Id");if(!o)return;const s=await pt(o,"RPC Url");if(!s)return;const i=await gt("Symbol");if(!i)return;const l=await mt("Multicall Address (Optional)"),c=await wt("Color (Optional)");let u=j(o.toString()),m={name:r,chainId:Number(o),rpcUrl:s,nativeCurrency:{name:i,symbol:i,decimals:u}};l&&(m.multicallAddress=l),c&&(m.color=c),a.networks.push(m),d.writeFileSync(t,JSON.stringify(a,null,2))})(e);let i,l=o.indexOf(s);i=l<n.length+3?a.networks[n[l-3]]:a.networks[r[l-n.length-4]],await(async(e,t)=>{let a=["> Edit"];switch("Ethereum Mainnet"!==t.name&&"Solana Mainnet"!==t.name&&a.push("> Remove"),a.push(new g.default.Separator("----------------------------------")),a.push("> Back"),await ct(a)){case"> Edit":await ve(e,t);break;case"> Remove":await Se(e,t)}})(e,i),await xe(e)},Ne=async e=>{let t=["> Enhanced Balance Display",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Enhanced Balance Display":await Be(e);break;case"> Back":return}await Ne(e)},$e=async()=>{switch(await ct(["> On","> Off"])){case"> On":return!0;case"> Off":return!1}},Pe=(e,t)=>{const a=p.resolve(e,"network.json");let n=JSON.parse(d.readFileSync(a,"utf8")).showTokens;return t in n?n[t]:[]},Be=async e=>{const t=["> Status","> Token List","> Add Token",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Status":await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));"status"in a||(a.status={fullAddr:!1,gasToken:!1,extendedToken:!1});let n=[`> Show Full Address [${a.status.fullAddr?"ON":"OFF"}]`,`> Show Gas Token [${a.status.gasToken?"ON":"OFF"}]`,`> Show Extended Token[${a.status.extendedToken?"ON":"OFF"}]`,new g.default.Separator("----------------------------------"),"> Back"];const r=await ct(n);"> Back"!==r&&(r.includes("Full Address")?a.status.fullAddr=await $e():r.includes("Gas Token")?a.status.gasToken=await $e():r.includes("Extended Token")&&(a.status.extendedToken=await $e()),d.writeFileSync(t,JSON.stringify(a,null,2)))})(e);break;case"> Token List":await(async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n={};for(let e of a.networks)n[e.chainId.toString()]=e.name;const r=p.resolve(e,"assets.json");if(!At(r))return void console.log(ke.red("No asset here yet"));const o=JSON.parse(d.readFileSync(r,"utf8"));let s=[],i=[],l={};for(let t in o){l[s.length]={name:n[t],address:null},s.push(new g.default.Separator(`----- Networks (${n[t]}) -------`));let a=Pe(e,n[t]),r=o[t].length;for(let e=0;e<r;e++){let r=o[t][e];a.includes(r.address)&&i.push(`${e+1}.${r.symbol.padEnd(6)} CA: ${ke.green(`${Ct(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`),l[s.length]={name:n[t],address:r.address},s.push(`${e+1}.${r.symbol.padEnd(6)} CA: ${ke.green(`${Ct(r.address).padEnd(45)}`)} Decimals: ${r.display_decimals||0===Number(r.display_decimals)?r.display_decimals:"4"}`)}}let c=await ut(s,"Choose Tokens",i),u={};for(let e=0;e<c.length;e++){let t=c[e],a=l[s.indexOf(t)];a.name in u?u[a.name].push(a.address):u[a.name]=[a.address]}a.showTokens=u,d.writeFileSync(t,JSON.stringify(a,null,2))})(e);break;case"> Add Token":await Me(e);break;case"> Back":return}await Be(e)},Oe=async e=>{let t=["> Networks","> Dataview",new g.default.Separator("----------------------------------"),"> Back"];switch(await ct(t)){case"> Networks":await xe(e);break;case"> Dataview":await Ne(e);break;case"> Back":return}await Oe(e)},Ae=async e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8")).networks.map(e=>`> ${e.name}`);return(await ct(a,"Please select a default network")).slice(2)},Te=(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++){const a=n.networks[e];if(a.name===t)return L(a.chainId.toString())}return"unknown"},Ce=(e,t)=>{const a=p.resolve(e,"network.json"),n=JSON.parse(d.readFileSync(a,"utf8"));for(let e=0;e<n.networks.length;e++){const a=n.networks[e];if(a.name===t)return a}return null},Fe=(e,t,a)=>{const n=ie(e,t);if("PK"===n.account_type)return n.data[a].ciphertexts.address;let r=n.default_network,o=Te(e,r);return"solana"===o?n.data[a].ciphertexts.solana.address:"evm"===o?n.data[a].ciphertexts.evm.address:null},_e=async(e,t,a)=>{const n=p.resolve(e,"network.json"),r=JSON.parse(d.readFileSync(n,"utf8")).networks,o=r.length;let s=ie(e,t),i=s.default_network;const l=Te(e,i);for(let t=0;t<o;t++){const n=r[t],o=Te(e,n.name);if("PK"===s.account_type&&l!==o)continue;let c;c="PK"===s.account_type?s.data[a].ciphertexts.address:"evm"===o?s.data[a].ciphertexts.evm.address:s.data[a].ciphertexts.solana.address,n.name===i?console.log(`● ${c} [${n.name}]`):console.log(`○ ${c} [${n.name}]`)}},Ie=async(e,t,a)=>{const n=p.resolve(e,"network.json"),r=JSON.parse(d.readFileSync(n,"utf8")).networks,o=r.length;let s=ie(e,t),i=["> Back",new g.default.Separator("----------------------------------")],l=s.default_network,c="";a||(c=s.ciphertexts.address);let u=[];const m=Te(e,l);for(let t=0;t<o;t++){const n=r[t],o=Te(e,n.name);"PK"===s.account_type&&m!==o||(n.name===l?a?i.push(`● ${n.name}`):i.push(`● ${c} [${n.name}]`):a?i.push(`○ ${n.name}`):i.push(`○ ${c} [${n.name}]`),u.push(n.name))}const w=await ct(i);if("> Back"===w)return;let f=i.indexOf(w);if(s.default_network=u[f-2],le(e,t,s),!a){let t=s.default_network,a=Ce(e,t);console.log(ke.green(` Address No: #0\n Network: ${t}\n ${a.nativeCurrency.symbol} Balance: 0`))}},je=async(e,t,a)=>{const n=Ce(t,a),r=n.rpcUrl,o=n.nativeCurrency.decimals;let s;if(s="solana"===L(n.chainId.toString())?await v(e,r):await k(e,r),s.status){let e=new l.BigNumber(s.output.toString());s.output=e.dividedBy(Math.pow(10,o)).toFixed(4,l.BigNumber.ROUND_FLOOR)}return T(n.chainId.toString(),[e],["0"]),s},Le=(e,t,a)=>{const n=ie(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},qe=e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8")).networks,n=a.length;let r=[];for(let e=0;e<n;e++)"evm"===L(a[e].chainId.toString())&&r.push(a[e].name);return r},Re=e=>{const t=p.resolve(e,"network.json");return JSON.parse(d.readFileSync(t,"utf8")).status},ze=require("chalk"),Je=async(e,t)=>{let a=p.join(e,"assets.json");if(!At(a))return[];const n=d.readFileSync(a).toString(),r=JSON.parse(n);return t in r?r[t]:[]},Ke=async(e,t,a)=>{const n=await Je(e,t);let r=[];for(let e=0;e<n.length;e++)n[e].symbol.toLocaleLowerCase()===a.toLocaleLowerCase()&&r.push(n[e]);return r},Ue=async(e,t,a)=>{const n=Ce(e,t),r=L(n.chainId.toString()),o=await Je(e,n.chainId.toString());if(!o)return void console.log(ze.red("No asset found"));const s=await De(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(ze.green(`${i}. ${s[e].symbol} Balance: ${s[e].balance}`)),i+=1);1===i&&console.log(ze.red("No asset found"))},Ee=async(e,t,a)=>{const n=Ce(e,t);let r=(await Je(e,n.chainId.toString())).map(e=>e.address);r.push("0"),T(n.chainId.toString(),[a],r)},Me=async e=>{const t=p.resolve(e,"network.json");let a=[],n=JSON.parse(d.readFileSync(t,"utf8")).networks;for(let e=0;e<n.length;e++)a.push(`${e+1}. ${n[e].name}`);let r=(await ct(a)).split(".")[1].trim();const o=Te(e,r),s=Ce(e,r),i=await Ve("Enter contract address",lt);let l;if("evm"===o){if(!(c=i).startsWith("0x")||42!==c.length)return void console.log(ze.red("evm address format error"));l=await x(i,s.rpcUrl)}else{if(!(e=>/^[A-HJ-NP-Za-km-z1-9]*$/.test(e))(i))return void console.log(ze.red("solana address format error"));l=await N(i,s.rpcUrl)}var c;if(!l.status)return void console.log(ze.red(l.output));l.output.name||(l.output.name=await Ve("Please input token name")),l.output.symbol||(l.output.symbol=await Ve("Please input token symbol")),console.log(ze.green(`Token ${l.output.symbol}(${l.output.name}) loaded successfully.`));let u=await Ve("Enter decimals for display",at);u=parseInt(u),await(async(e,t,a,n,r,o,s)=>{let i=p.join(e,"assets.json"),l={};if(At(i)){const e=d.readFileSync(i).toString();l=JSON.parse(e)}void 0===l[t]&&(l[t]=[]);for(let e=0;e<l[t].length;e++)if(l[t][e].address.toLocaleLowerCase()===a.toLocaleLowerCase()||l[t][e].symbol.toLocaleLowerCase()===n.toLocaleLowerCase())return l[t][e]={address:a,symbol:n,name:r,decimals:o,display_decimals:s},void d.writeFileSync(i,JSON.stringify(l,null,4));l[t].push({address:a,symbol:n,name:r,decimals:o,display_decimals:s}),d.writeFileSync(i,JSON.stringify(l,null,4))})(e,s.chainId.toString(),i,l.output.symbol,l.output.name,l.output.decimals,u)},De=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($(e,o.address,a)):"solana"===n&&s.push(P(e,o.address,a))}let i=await Promise.all(s),c=[];for(let a=0;a<o;a++){let n=t[a],o=n.decimals;if(!i[a].status)return console.log(ze.red(i[a].output)),null;let s=new l.BigNumber(i[a].output).dividedBy(Math.pow(10,o)).toFixed(4,l.BigNumber.ROUND_FLOOR);c.push({address:n.address,symbol:n.symbol,balance:s}),T(r,[e],[n.address])}return T(r,[e],["0"]),c},Ge=async(e,t,a,n,r,o,s)=>{let i=a.length,c=Ce(e,r),u="evm"===L(c.chainId.toString());if(o&&await A(t,"0",c.chainId.toString(),n,u,c.multicallAddress?c.multicallAddress:""),s){let o=Pe(e,r);for(let e=0;e<i;e++){let r=a[e].address;o.includes(r)&&await A(t,r,c.chainId.toString(),n,u,c.multicallAddress?c.multicallAddress:"")}}let d=((e,t,a,n)=>{let r={};if(!(e in f))return r;a.unshift({address:"0",name:n.nativeCurrency.name,symbol:n.nativeCurrency.symbol,decimals:n.nativeCurrency.decimals,display_decimals:4});let o=t.length;for(let n=0;n<o;n++){let o=t[n];if(o)for(let t=0;t<a.length;t++){let n=a[t],s="0";f[e][n.address]&&(o in f[e][n.address]&&(s=new l.BigNumber(f[e][n.address][o]).dividedBy(10**n.decimals).toFixed(n.display_decimals||0===Number(n.display_decimals)?n.display_decimals:4,l.BigNumber.ROUND_FLOOR)),r[o]||(r[o]={}),r[o][n.symbol]=s)}}return r})(c.chainId.toString(),t,a,c);return d},We=require("chalk"),He=process.env.HOME||process.env.USERPROFILE,Ze=`${He}/.wative`,Ve=async(e,t)=>{const a=[{name:"inputText",type:"input",message:`${e}:`,validate:t}],{inputText:n}=await g.default.prompt(a);return n.trim().toString()},Xe=async e=>{for(let t=0;t<5;t++){let t=await Ye(e,"Input start address or index");if(!t)return console.log(We.red("Invalid start account index")),null;let a=await Ye(e,"Input end address or index");if(!a)return console.log(We.red("Invalid end account index")),null;if(!(t>a))return{from:t,to:a};console.log(We.red("Invalid address range"))}return null},Qe=async(e,t,a)=>{let n=p.join(e,`accounts/${t}.json`);if(!d.existsSync(n))return null;let r=JSON.parse(d.readFileSync(n,"utf8")),o=r.data,s=r.account_type,i=o.length;if(0===i)return null;for(let e=0;e<i;e++){if("PK"===s&&o[e].ciphertexts.address.toLocaleLowerCase()===a.toLocaleLowerCase())return e.toString();if("PP"===s&&(o[e].ciphertexts.evm.address.toLocaleLowerCase()===a.toLocaleLowerCase()||o[e].ciphertexts.solana.address.toLocaleLowerCase()===a.toLocaleLowerCase()))return e.toString()}return null},Ye=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 Ve(t,it),a=Ot(e);if("unknown"===a){if(Number(e)>s){console.log(We.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},et=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"),tt=e=>!(e.length<6)||"Address length should be greater than 6",at=e=>!isNaN(Number(e))||"Value should be a number",nt=e=>!(isNaN(Number(e))||Number(e)>1e3)||"Value should be a number",rt=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===F.includes(t[e]))return"Passphrase word should be valid";return!0},ot=e=>{let t=Number(e);return isNaN(t)?"Amount should be a number":!(t>2e3)||"Amount should be less than 2000"},st=e=>{let t=Number(e);return!isNaN(t)||"Last account no should be a number"},it=e=>!1===isNaN(Number(e))||lt(e),lt=e=>"unknown"!=Ot(e)||"Address should be valid",ct=async(e,t,a)=>{const n=[{type:"list",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:r}=await g.default.prompt(n);return r.toString()},ut=async(e,t,a)=>{const n=[{type:"checkbox",name:"inputText",message:t||"Choose an option",default:a,choices:e,pageSize:30,filter:e=>e}],{inputText:r}=await g.default.prompt(n);return r},dt=async(e,t=!1)=>{for(let a=0;a<5;a++){const a=await Ve(e);if(""===a&&t)return null;if(/^[0-9]*$/g.test(a))return a}return null},pt=async(e,t,a=!1)=>{for(let n=0;n<5;n++){let n=await Ve(t);try{if(""===n&&a)return null;if("solana"===L(e.toString()))return n;const t=await b(n);if(!t.status){console.log(We.red(t.output));continue}if(t.output.toString()===e.toString())return n;console.log(We.red("Rpc url not match chain id"))}catch(e){console.log(We.red(e.message))}}return null},mt=async e=>{for(let t=0;t<5;t++){let t=await Ve(e);if(""===t)return null;if(""===t||42===t.length)return t;console.log(We.red("Multicall address length must be 42"))}return null},gt=async e=>{let t=/^[A-Za-z][0-9a-zA-Z]*$/g;for(let a=0;a<5;a++){let a=await Ve(e);if(""===a)return null;if(t.test(a))return a}return null},wt=async e=>{let t=/^#[0-9A-Fa-f]{6}$/g;for(let a=0;a<5;a++){let a=await Ve(e);if(""===a)return null;if(t.test(a))return a}return null},ft=(e,t)=>{const a=se(e).accounts,n=yt(a).indexOf(t);return-1!==n?a[n]:t},ht=e=>e=(e=(e=(e=e.trim()).toLocaleLowerCase()).replace(/\s+/g,"-").trim()).replace(/\-+/g,"-").trim(),yt=e=>{let t=[];for(let a=0;a<e.length;a++)t.push(ht(e[a]));return t},bt=async(e,t)=>{let a=yt(t),n=/^(?![-_])[a-zA-Z0-9_-]{4,40}(?<![-_])$/g;for(let t=0;t<5;t++){let t=await Ve(e);t=t.trim();let r=ht(t);if(n.test(r)){if(a.includes(r)){console.log(We.red("Account name already exists"));continue}return t}}return null},kt=async(e,t)=>{const a=[{name:"inputText",type:"password",mask:"#",message:`${e}:`,validate:t}],{inputText:n}=await g.default.prompt(a);return n.trim().toString()},vt=async e=>{const t=[{name:"password",type:"password",mask:"#",message:`${e}:`}];let{password:a}=await g.default.prompt(t);return a},St=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:n}=await g.default.prompt(a);return n.trim().toString()},xt=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=We.green("✔"),s=We.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 g.default.prompt(t);return a},Nt=async(e,t=!0)=>{const a=[{name:"confirm",type:"confirm",message:`${e}`,default:t}],{confirm:n}=await g.default.prompt(a);return n},$t=async(e,t)=>{const a=[{name:"editor",type:"editor",message:`${e}`,validate:t}],{editor:n}=await g.default.prompt(a);return n.trim().toString()},Pt=function(e){return!!/^0x[0-9a-fA-F]*$/g.test(e.trim())},Bt=async(e,t)=>{let a;try{a={status:!0,output:await e(...t)}}catch(e){a={status:!1,output:e.toString()}}return a},Ot=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",At=e=>(e=e.trim(),d.existsSync(e)),Tt=e=>new Promise(t=>setTimeout(t,e)),Ct=(e,t=!0)=>t?e:e.startsWith("0x")?e.slice(0,8)+"..."+e.slice(-6):e.slice(0,6)+"..."+e.slice(-6),Ft=(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}},It=(e,t)=>{const a=[];for(let n=0;n<e.length;n++){const r=Ft(e[n],t);a.push(r)}return a.concat(a)},jt=(e,t,a,n,r,o,s,i,l)=>{for(let c=i;c<l;c++){let i=c>=t.length/2?c-t.length/2:c,l=e[i];if(!l.name)continue;let u=l.name,d=t[c],p="";if(!d)continue;for(let e in a[d])(o||e!==r)&&(s||e===r)&&(u.includes(e)||(p+=`${e}:${a[d][e].padEnd(n[e])} `));let m=u.split("(");if(m.length>1){let t=m[1];e[i].name=m[0]+` ${p}`+`(${t}`}else e[i].name=m[0]+` ${p}`}},Lt=async(e,t,a,n,r,o,s,i,l,c)=>{const u=[{type:"list",name:"inputText",message:l||"Choose an option",choices:e,pageSize:30,default:c,loop:!0,filter:e=>e}],d=g.default.prompt(u);let p,m=0,w=0;for(;!d.ui.activePrompt.answers[d.ui.activePrompt.opt.name];){if(i||await Tt(1e3),p===d.ui.activePrompt.selected)continue;if(m===d.ui.activePrompt.selected?w+=1:(w=0,m=d.ui.activePrompt.selected),i){w=6,i=!1;const e=d.ui.activePrompt.opt.pageSize,a=It(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:n,toIndex:o}=_t(m,e,a.length),s=a.slice(n,o);if(!C(r.chainId.toString(),s)){w=0;continue}}if(w<5)continue;w=0;const e=d.ui.activePrompt.opt.pageSize,l=It(d.ui.activePrompt.opt.choices.choices,t),{fromIndex:c,toIndex:u}=_t(m,e,l.length),g=l.slice(c,u);let f=await Ge(a,g,n,r.rpcUrl,r.name,o,s),h={};for(let e in f)for(let t in f[e]){let a=f[e][t].length+1;h[t]?h[t]<a&&(h[t]=a):h[t]=a}const y=r.nativeCurrency.symbol;jt(d.ui.activePrompt.opt.choices.choices,l,f,h,y,o,s,c,u),d.ui.activePrompt.screen.render(""),d.ui.activePrompt.render(),p=m}return d.ui.activePrompt.answers[d.ui.activePrompt.opt.name]};require("wative-core");const qt=async(e,t)=>{switch(await ct(["> System & Settings","> Accounts","> Tools","> Exit"])){case"> System & Settings":await Oe(e);break;case"> Accounts":await be(e,t);break;case"> Tools":await Y(e,t);break;case"> Exit":return}await qt(e,t)},{WativeCore:Rt}=require("wative-core"),zt=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:",zt.version),console.log(We.green(m.textSync("Wative",{font:"ANSI Shadow",horizontalLayout:"default",verticalLayout:"default"})));const e=await(async()=>{let e=await Ve(`Keystore storage located in (default: ${Ze})`);return e||(e=Ze),e=e.trim(),e=e.replace("~",He),d.existsSync(e)||d.mkdirSync(e,{recursive:!0}),e})();await(async e=>{const t=p.resolve(e,"network.json");if(d.existsSync(t))return;const a={networks:_,currentNetwork:"Ethereum Mainnet",accounts:[]};d.writeFileSync(t,JSON.stringify(a,null,2))})(e),(e=>{const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));a.status||(a.status={fullAddr:!0,gasToken:!1,extendedToken:!1}),a.showTokens||(a.showTokens={});let n=a.accounts.length;for(let t=0;t<n;t++){let r=a.accounts[n-1-t],o=ht(r),s=p.resolve(e,`accounts/${o}.json`);d.existsSync(s)||a.accounts.splice(n-1-t,1)}d.writeFileSync(t,JSON.stringify(a,null,4));let r=a.accounts,o=yt(r);for(let t=0;t<o.length;t++){let a=p.resolve(e,`accounts/${o[t]}.json`),n=JSON.parse(d.readFileSync(a,"utf8"));"PP"!==n.account_type&&("data"in n||(n.data=[{ciphertexts:n.ciphertexts}],delete n.ciphertexts,d.writeFileSync(a,JSON.stringify(n,null,4))))}})(e);const t=p.resolve(e,"network.json"),a=JSON.parse(d.readFileSync(t,"utf8"));let n=yt(a.accounts);const r=new Rt(e,n,null,!0);await qt(e,r)})().then(()=>process.exit(0)).catch(e=>{console.log(e.message),process.exit(1)})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wative",
3
- "version": "1.2.11",
3
+ "version": "1.2.12",
4
4
  "description": "An agile keystore management toolkit",
5
5
  "main": "lib/index.umd.js",
6
6
  "types": "lib/index.d.ts",