ETH Price: $3,055.15 (+0.59%)

Transaction Decoder

Block:
14539682 at Apr-07-2022 04:05:12 PM +UTC
Transaction Fee:
0.3319722673942792 ETH $1,014.23
Gas Used:
2,223,260 Gas / 149.31778892 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x5fD7D0d6...ea0346d34
(Socket: Admin)
0.92908903070575126 Eth
Nonce: 19
0.59711676331147206 Eth
Nonce: 20
0.3319722673942792
0xb584D4bE...165204599
(Socket: GasMovr)
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 1952146864599800709029857630380216181539300949461371552119405984658050715122966530559351312190408594511062305793665136113406502988905263617816592954858205548168036416576151196039035466458906297120418145188632421165694628479774512280928793037658278590378891338211202215518449347295000845108980992219872049481304258023261774340423012336176756724710421578974822587815177708517291281411759744049701989459051020176202392594088384986744368719929808144745436726201686014487764363794999375470873559492744039920631289975423617091838484145297506287718429201761375036310553170041251414392424246011280915499404108335797596949292918717056396576533000430749226513522584037369849714098671185607464211940159005379850164544509885572731465430160530183669873584371853549583943718457603530041583838179928329804645299577925593934413779113506720200550007419117015879239614429736864674036838271472201740720196222870050457787018017096471740146481450028008027964318978343934594115444403441506944863840818894343939663868423348086606679304065570729158645946375190885915134729799181629440307927842086185402997290614060384675607643719822436996638591630147811860955796717320845437917399546607679908614103101313078125798316520102366141091434131966845004304210398308323245250645127576630555496312468162931816243151797393554950980191253063074448718538162138399468659207901293037158262013995871288449613393541490160329133844789186782669390836589762424584040079100742420232282020301738984526688914049754477711021811735908575284267350530467128635253250753554929384066868850902713903835411917815119935592077035357808033887132126397765742359621358508403849035680040870275061266080715911009348048568732325443447673685500064833012864790277434735426662162828937208268893536422046510581218235590452384841109066659190366535126482361125723085113407403938687746033596829621835524474544013652756605553667392119759133890539388141547883056783992822327850597293531253418182978379680641239485686533188024331067760180443772730590787290720507004570891651289765361931907380266608306483970047808588812451285489473478669522478295601631082982651360559291937914242720839382768610956432989135552178981357372327149797151197559386821217521654951809382231721899501989927938222866299011012651088188225360916125990920538710810072253527019838903002653894464700167931675535129364215700340382066099847287400171541900375490753750350322539481495584912107947990693585465448453897347961508716066172152280919301383952521833122861596149383640428868331535875646922486636127411724274754313184141728309172395633051546697180002346385189788965514296088685816824906178430684263650005293670206222325216295530979450205324772798482322908774011972106220169246578446003587465022156372712794303805056891500231041645894661491551112744081222775006033637999290269572445557159639956935235469683763002117799678990349907696339857756804496674848712679548952445920554639752393864143590988127911321251929384487886895664922390100716933958636783605039311133336084476130944931628329124173145900315758525860035651529119751197159299112047522548724427938647552728287966005675324073318302461958291900416635616619180918204665230171301218629605601302409035487823756768562867629334924727288189556810505400404267055966660129226389194493488327337624592515287301739080384637937640403083696760333781069607625596421551383624189844893554720640132681229960347567167840253822412427222390359912493097934537127699090526654944932197179611276227920258837813633247807726982597105090912406803063885235198214200219048107095908393338821601079865420762019988360633147499291168854435657337820057479027097232208958511544260992827356750457141255394816818189144447629471300506790902674913902528651389436260164783062297066473605504057213060135441723942627119416466413299410979869107461290119232422880201232442683788031769200123403104927435054409373276087630594063458344133933953513415556004637147605311501809948010270885099906065276320158606718976926476505726126745878098521164041711672581578678987113448721423422364105778928871370899228363729758018879802066980409962446747360462073407643536770952894689462405442097190709640877098902952237599756728664953638670962889184736886739732164901641481286249796368325166826716417587585157821207407265921638781350629619768084093122547337243055047906337443717163724675428439546330866528663736480215655019943292383193944677697933778594420100477863173617683904917344953045442210736812874614798686446091754676359746953442784001355282120985919574321750922839176004726108942242421243759328743413827949858972934488795329749186342318127174368467165582901180499799276188590362417707579969250346738365824992873291644969064989767049606709852261595109910693273940161288746097796766430214972555913252594349967141212675654539657526986105495523557555325184641481943285785719745660684728515728179589130779655569774262366708443353437274940200710730312673115011606052940536909868177628844759160252790271838109744886897557750170880137144679177604229986385315299017985833907623414568293443303272977373773793124544202955840009484863359357712015399574185172441849413584779259735189876874461784581815110797568649715652055199476011240414067067561280664093551686539898435800248674845386153308076527696232072886324628748290805000658012920800484959442774523252919110718335678215916482516079294070852882807239207580421014362708617312752656041814376160342023100957904649505504066485047944078828271178956794531930665652827113080652983382892832497431275185249994195610632361376541298923889883539205665072571762755871535447364467995027991379045684234441569754725882192079695221074839965683880495336075403859248509837106081839711523588302274995146253024146851227195888868251588935536968979750137812505668755721604002011918971962351448819215264428250294524158025397151358838492284106213122843812749376407305740218861198845782752148261629079062521205507337383053647214508782173477512860939799293502615969852934812797707679758333985523822948352340897350793921365030479421979108154735018637556501921734166166480504237939239583076284724299061312857261023287226648217520847684015860176630767158590450772091895642028921793545970336729800436139771253208782995410781993810456816301431173686643458391364191963873647097019840942396376212104085856138512295895574213231808464699545850200508853806805522037903871496353619899867761550563019159612320542182767966421697654933883721867441221610807254082104008311482119320760582099724895293739374311782123689417294132253562254816312230068241819374798944645333836358833810663514945129587702324423438482198015004554213292538306689487754111221742062788563461411954803581781647301679202819873047428934822977212401548299255206810469569484409520060432870487401625108959754369646861815302381394688407731255884613906099891792789224443023332299438139156325058852478807126161559103756202011992075732634321235357354480370090394168934789554717346809588075653944533514988034562963911536749532283891430422357717275469345171608310971643274202696375173931026117934474509032467010099989248213988502609449823002975007824134702398674143270054270248866182206497663320377100972710972192692849942866234930712289796276911855582535801428393485388787899502150993661999271234555505471001615889461716853900750834372310968032352075443462532144090277846168087861479466133774724223970844461562414070017503134228394457944184224994420589806633158165321458223834177590579575574117079641264986794578907221714295998795596220272876542545815185230266405939904040784373099525332529412291921040139013368917373062280277285137342936070963019971173717814298473977142427753347964267983461869314387601198170736563628332086924056849293658835022870929841475978910232494955081813759881713375227380874735392234277942591912028384065686409571300760673599937092557252534860133739794733028745962534128174135571235053169881363796804797991725994613142426102516689538126744266651217458658732922580281500045969711797619676265067596147095266630475626320043883844677883748526067034277210676304198614195215175976392511717537708357614693596946822974309016201978615848686700627345262825981135843199550893963167308847533818715426292156879610946992358053191797226508318143008521934654787463335013878209361053244827455297216825770251671562272980589512978379020086539509886781122769613614668316876687941684597149912338634313611341662342022545573885077171110971494229620828288708945879157959123403505368519156680047561545675942530207023897097279583374554093489017686062261641406509220010906560953138088885565353842257638529167500671723187852282263478050245103672349840951318028165703502278238523958151756472405386684706598556344945298010880140373364640435918042994272089667206877644692185178562771949844193769925562542727002834667470707548448203815936296895550528674888240378121195341442647040431272163887914329405383036115170367103214326803339173503920658650231854378784056792269951751415964509409594917226896146427359451269213057496103422987953271171984831640326676311666736384853674538234613487250828469089739484610362386470981406578686379745038930603639150514851647455539757939581898829781088153606270665722517210195077521012925568851446319370404843446479417613726227738575656316914971405696111703351220395305229791470004138961712067027428518381587970869704996553249517268284526255535372385341791694604216146391043387815108412137817242272924976760129673359870182310157999795286795512666081631836122597952631779218186082043869979840349180361535168599972265948749258370302035182093102736191417161202019671158812296369907085157932407784044921889686986631096837730562586715742918234890010086893194199189841603367641355399951036950055154551138645200701250409446512804159829205102489058582286871540990849644304033147972246995795165296817761233554206949431765023693661887080498566382204114821139365270169465566374336604330556684423780143435564904606355570233647936639648631735665690539632366831282732549964884854712541530066608738203938926386075410681316405079654095667709121626183685082391284078214572944702538332083831512631521965022958995977125083306993035050713163595005143708098153531240117404826796449844447776942229696032430418220979052988445040858426088896038475244159302386293048739221849494374551600981971635786820057207814734099606655283496085586833790057286582695913545956678291113347566246221043694142635042896977799093263718717361586520750586177623561230018106654078398668149515704081414387962397086252958189321155373115123653655409065537170212823354748607840486885846690915039477681132768203070118342996485508077283038807140552613044583235916336274990487140257596117505788119806258633110080967708507077080316599176096538262082169664328738639384918780043248223751963977248228552872892646584715577218635924911253382445177245135600259157266730363537663856841088824302275944083585068422751806283700252032884589142926159674350879297034321856015615164435337084142727854925944188155319528139742650863411066992732752423388024358462052559091935156758337278117659266244889048530332235043788044216121474648767665765393729320749797131853858968910037550426589346484270243717299355054595716891072475375515780595903170412481157839304385090468971085257767090324062951623025669246136400208101138830979753376954195644014563736216075336828712096498721830342921932636516603426546048454888034814778099002017186514088517897275865782275273825508941159594145068581015372449531965980318084722370067763388276576238985661777634176866857714112385125846058473245662720141216428876779727436821548405682610246506864119644147979037224275237514787368936457020076915787744188468629765109439318823550607905595667251101670290046598055201716674441494142708552600186983129888750720885321692747416128045713065709128286940743072907611601224115353893506298626238208446118340808268306966238401721530935437377290466503780495680642086296132732940273304407573902420136072131183858879241578205968459255243349650285230856780992942153382204569402825632381256185291908190705156251186227980713292756879196897618165133589220731743645123450365872899952984295809634656703795363216976161773507881758859548711923087297073715879686649210605679617729558520534198102354433751827407465209104134397844120305057177445608233598257573478669692449677449684573699221440819683963300621676015952714650758132461781370005476285542668463064246947633162331841185408293831522359816184007259906649705777304317380208674361911657444928177524293693839723430230767929683670650448195882040006126827684352730927267012297886734622517982395612678372303841319822535816265298909953612880606710768566135092588604130147052247449707898605388704523431477763378861454073919066326384923258477437047056023801982714457688146888069640819853052898032077121796251022397566985169783212212528861261217812569040994334092748506665726604090888962398201778675008221233039983853276097185929196177313151848506916562877996169622009395353292991120014948196930445865720236066950499088242641929931933284292577684952406285030892594741401477693810315893011713148603802427390071799793714418908089865543142959749635684060364252500922962949248106757177280469927766894985844413948229036253791890452177173463524938279051020147798300251378412411328404133195413095037257521489177969235463652294540985581179632427757793320475720805214744924683168657505377683706861126260148933949767905970739086374277552966005390505212981331287166974217759375911738157993015638084720418486711798316155179229039376142438947787514078848695815545066844868644014789827481169086746715009241680347704724177887258963440413153180412261244380438330370494075506278627780926197002538500291313213864044668635745579256213042437139981048897216125788581942302658056456246959074921648552647102560488661685177683673697341854410348599442724696566171515771935881453685094784174652316285201825049389659571374700757044507825375742295262226276181996264239633845196542915687048264610949904625279769154297378857035401564609863035317603854346778104992662955824898053425551727284232463877675855161128397830163380038440348750354409387264419972799828298061727696859461292326228050135770675020550678067250471424724558289185671425151932029530078756306506806535532740260861451194097646850905658417186919222250216847052587527446418305855990210620071443354642376273972518474203325834808903048566543984583252919300602652888233562509929422252920196099556380266539311494705671241271525932038025950018919059933956122562679365464662888819538408694085818028011356073738353695762319135596432864326352152081888371405815120868798865275910360481350319750379807547944538488832122885482447595808893109079373915604402564399957182343709275694172125356550190675099877091047213522002199242145427798394912747154249943051776994906184623235980216070808085899257756681457261128127999147687194280609114427507621578565507256581548778528661125223256025701968700371881013954258111572220908665074833227354354284888594255405691717808368629574941609324491921530416883427482056503207783497114701588835203556068392345731152265955373885870792603888288346539061046344223672992469738191322987217857529182969765323441461137387429357056176303078993402709492551907796879452331764216254722777019325510566394337561244454816132219339591915441468020892440605255188288638642608545413682608252779028532248885086109127157613079796920083510738054147112094036510722232331630602010488615915045593000182324956092369471069372354951009020612241909890828007408816736380443076578761860074453119848326278941381966579598982571570450560608420694903473345848599818516812533593998918672996343740610798835293075058941816015883886663096835873181768295997744343877492679083355047075439111924524592826676467925015399498820450839803321964755814305156152348528404375038086359643994553837837827229685374303766582888936557918403541192951114967380969545490203129944813416471947669103474950088434937055021844160358228801709403642086498052839878632992206355940589916968932012066603446343972023884492055984577322293962769064719559811306817956588901962097940353901208506335016781439845308518794329510288137666220527176830147446030868794131855735664064824216797328982107905409682509775932839775683378743071181115159022535631078898254151670863042986221866612691481337832131717141024896296914125251776361107522075480970621263116246663179419898214096094135388271839685036343390483194828178726343606376980313843223086849584439193923751114835858471081345767915905909149423339575089887966471940522220749099599410251094885397641934908125428549197944083224210289639765216842365923429669651531885678242424300384015414080346584082647090540950932528767096275734831103432917918979741152195567670269544916217523488958975735332380946838659862889362295604785372170901263408290354675128301514663318168297839807108484169270951798480066427477395281549575878868205843788639672380179968230445930736641722275102083517755810436514015999474522196910270774195797593250961852392672200869309243881537639274761423380608491636819473104279202250401874512562830341630868846794599847739535970505430020128588623630374969945903295345284636722206905704391127169492716462472275488854331997603465221514253062634775574474253685324626389549751207295513189975575634439301604014401741000458719578484609199762327328157605832123898389021789780732116351482664501134852677315799708006751517775336511138435856079222360460930936330695838225142238415551602897285886004190086318206496316459963323708981841901750432250675258508980780925367415863321252092395907795116279160281682068421763810901950987962289895797411186220473939105632175838894114484046721188556985328119698517480729919555086086995051225655560162252207455196772789766722988416521206736701987189833454354475201119759916365196161803256557563081685389382243084479453639899140284587432539121875439575156907871057973053242797395795893361344664697822529952292899556532685126279242360028431472353583203757218303360005188669947025182830763359788435156177272155622801353701701789245450592444147967300046993652300962503695276093363788119085040208657690738881431347999935812338293678279628005088427627443041787563673705354234596629549258674244732848557119190757370691807046353722997496446338426701240045431816289350213940536507755494614027343072048025301648054006234634449957148358600208626663320007805283924600346130557374396833510347133192732059243927212095823041328928942646663925975314261909861118750159127223590072557896890864594429172913848785982988631134572113929255182184345622289273785080406356557451751902491709494184117059687875485492558259728178047289302183774947863715087840946824575061825648493500661772045814794535425824100987291995189658099107768210646961693352222030112358946998320038298415322561221346916599585595426601299000895576280700658714721746165729335880051849256461510116730273752331855757465601640585867609562568707051409036615552007425138659602957407958550699670294009225971899495175854602993633828947302293392505011428677327222048674122910216724859043464266535391562398547771842093110322028053866587449435703230827799657015203621237201276890182076453528733258936730642548022043392602787145311169393998487269744458886726827952939523891047704356320916406261280849457929548295576606075461690546451943530715998977292736071662432782275743051421250256152349775961854875102645840069778836353487653266565056526296066973529112071545599165778768923339093188921020635190688566858193061692448927959060765364582000672286522788035339524591631926456423004484362787209139541644662138795297450523146044721048851241606230334287518423721462401470910950365577135581837405295153328235621404611239361358574301697717541942504352833145155406423991013135814857471351659061623142215109483907882779075295681524523555392494862981569989125358221896515319285463825929906480562956738348294141997467442631184143511589720500291335040922456590672008836950059203086631916498844934394952709866024235664587901384627935747478695420730153370883261517256965593210622678886268056065703143958081740167903234653128588738586335975828460936541794139649438395154633947944943457179032239930058748006325162805009175567743070701862121989999644059841109606956717738714675984881517358374363257226889508604332251643422234644886223061798921182446983793685045538230736529992074329917249284228108471107430459249135357213376318421064346393770432851650779459318212655026078471348425253089556288537532933817276746292439842294896808385284610403651857205255501097938905848945175045963541860605989278815011612593102811264210436835116095881009651789888865355088670367303322263059394128920478714203507580468769736174947718365729027646524391653808992294359215783157238665130708088789190181224528464493662028898738360471591033052420424840703178619968174122542573933325186291771235274978761128856971130872345884160873073695807612283545155964882256726035260247686375979013700313725192739883458537383531295498842358996549741677520736308453924795174307861528807540247732537817532218541696823124476201719607398743992547152205096218160830750462110303831713143438390657576250588046539424169314602286011003409915996697305470171410683438172343694597499623362831021866520150831762461175192206613503568538216886620442828515685097955200355484974741659206538933933402314516926962015093888613591845245588087056185949795520977620040614393272894564530523222712683842255035784095301101188942405045649652969885565884344328390998675843150457838667794479041862727994429802502950194370793028615401029569550240978878316313849269885625958666609569701108248909193764299172933602528510324972074570939056052229826142356123479470704134834147898394396555523942685054748402405752283089849268192638720655416262048390345849880954660545342469128971473941232016108883885860821541222576201504270510725492446991420907257370059231391302628068546117141336902630676291225463703471138330701535904848416424363825931967760031169000584885491399667613833665433080277790535589488714408039059686163806059817572237699005727171199491415208984122997017616751878588818943869580041107730483404229220126572927860685875931150484688415772695126171192641625343435628157631107567459253977694618269378747846953794106498049070700678943795411146064301002581463171532143102640763508619023441996804330685118403562831048745702121439168472270647279327350472874880985478849488720554162847376802182833146559570240180000053867384179680890512015517351671129916099490697258528826013343294466583592706634329673771986719419973820721589153870572899331781594408918232324497697447265820597413150015827521722867984991889112719451156203531073364826477579054761243560637971302512855947486562329868475945399571104016101537604055319822281565742307476383770449578715730375805329764027696962828848171352332576246612864315043681612879375146792510600895255686621674516608778048954537971804784336759726246637661675497220022091083884027395581083617869658207865202065267397935229787810424583029947427654531446888066303416236781249585153368801292441243448114051595082518797572870327608110889537467098645094787657004308280770120913420642002064996657873783801598865486438620206784363249358833101089238076946307384384003820801870481621535917338838540438622112586260851297671199271570371133713641324051783311313044177860449190795795042074814244010446293126704136461571104274519556602508518284858717575887293292772831177793536095460150348591954871486584099767474104433687385304315257871415751385977534365566029583764885255837733929381888775538019073234005252047674365441501929812932223237804650989270950345773358059150779607832835726801578824168097455278559555081589687437293713732531436075818581155157107401652227000710742928449389202754648675575857991355803916812250675501517718547361617893551352185250808690707331264616720654195471077676237977718988011578243738964591582553425590540387796237510807792693360312721598924639183208949936195663926892097305329681330606589622311245865830021856027890466160691
(KuCoin Pool)
518.272613412300819637 Eth518.275948302300819637 Eth0.00333489

Execution Trace

GasMovr.60806040( )
// SPDX-License-Identifier: MIT
pragma solidity >0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract GasMovr is Ownable, Pausable {
    /* 
        Variables
    */
    mapping(uint256 => ChainData) public chainConfig;
    mapping(bytes32 => bool) public processedHashes;
    mapping(address => bool) public senders;
    struct ChainData {
        uint256 chainId;
        bool isEnabled;
    }
    /* 
        Events
    */
    event Deposit(
        address indexed destinationReceiver,
        uint256 amount,
        uint256 indexed destinationChainId
    );
    event Withdrawal(address indexed receiver, uint256 amount);
    event Donation(address sender, uint256 amount);
    event Send(address receiver, uint256 amount, bytes32 srcChainTxHash);
    event GrantSender(address sender);
    event RevokeSender(address sender);
    modifier onlySender() {
        require(senders[msg.sender], "Sender role required");
        _;
    }
    constructor() {
        _grantSenderRole(msg.sender);
    }
    receive() external payable {
        emit Donation(msg.sender, msg.value);
    }
    function depositNativeToken(uint256 destinationChainId, address _to)
        public
        payable
        whenNotPaused
    {
        require(
            chainConfig[destinationChainId].isEnabled,
            "Chain is currently disabled"
        );
        emit Deposit(_to, msg.value, destinationChainId);
    }
    function withdrawBalance(address _to, uint256 _amount) public onlyOwner {
        _withdrawBalance(_to, _amount);
    }
    function withdrawFullBalance(address _to) public onlyOwner {
        _withdrawBalance(_to, address(this).balance);
    }
    function _withdrawBalance(address _to, uint256 _amount) private {
        (bool success, ) = _to.call{value: _amount}("");
        require(success, "Failed to send Ether");
        emit Withdrawal(_to, _amount);
    }
    function setIsEnabled(uint256 chainId, bool _isEnabled)
        public
        onlyOwner
        returns (bool)
    {
        chainConfig[chainId].isEnabled = _isEnabled;
        return chainConfig[chainId].isEnabled;
    }
    function setPause() public onlyOwner returns (bool) {
        _pause();
        return paused();
    }
    function setUnPause() public onlyOwner returns (bool) {
        _unpause();
        return paused();
    }
    function addRoutes(ChainData[] calldata _routes) external onlyOwner {
        for (uint256 i = 0; i < _routes.length; i++) {
            chainConfig[_routes[i].chainId] = _routes[i];
        }
    }
    function getChainData(uint256 chainId)
        public
        view
        returns (ChainData memory)
    {
        return (chainConfig[chainId]);
    }
    function batchSendNativeToken(
        address payable[] memory receivers,
        uint256[] memory amounts,
        bytes32[] memory srcChainTxHashes,
        uint256 perUserGasAmount,
        uint256 maxLimit
    ) public onlySender {
        require(
            receivers.length == amounts.length &&
                receivers.length == srcChainTxHashes.length,
            "Input length mismatch"
        );
        uint256 gasPrice;
        assembly {
            gasPrice := gasprice()
        }
        for (uint256 i = 0; i < receivers.length; i++) {
            uint256 _gasFees = amounts[i] > maxLimit
                ? (amounts[i] - maxLimit + (gasPrice * perUserGasAmount))
                : gasPrice * perUserGasAmount;
            _sendNativeToken(
                receivers[i],
                amounts[i],
                srcChainTxHashes[i],
                _gasFees
            );
        }
    }
    function sendNativeToken(
        address payable receiver,
        uint256 amount,
        bytes32 srcChainTxHash,
        uint256 perUserGasAmount,
        uint256 maxLimit
    ) public onlySender {
        uint256 gasPrice;
        assembly {
            gasPrice := gasprice()
        }
        uint256 _gasFees = amount > maxLimit
            ? (amount - maxLimit + (gasPrice * perUserGasAmount))
            : gasPrice * perUserGasAmount;
        _sendNativeToken(receiver, amount, srcChainTxHash, _gasFees);
    }
    function _sendNativeToken(
        address payable receiver,
        uint256 amount,
        bytes32 srcChainTxHash,
        uint256 gasFees
    ) private {
        if (processedHashes[srcChainTxHash]) return;
        processedHashes[srcChainTxHash] = true;
        uint256 sendAmount = amount - gasFees;
        emit Send(receiver, sendAmount, srcChainTxHash);
        (bool success, ) = receiver.call{value: sendAmount, gas: 5000}("");
        require(success, "Failed to send Ether");
    }
    function grantSenderRole(address sender) public onlyOwner {
        _grantSenderRole(sender);
    }
    function revokeSenderRole(address sender) public onlyOwner {
        _revokeSenderRole(sender);
    }
    function _grantSenderRole(address sender) private {
        senders[sender] = true;
        emit GrantSender(sender);
    }
    function _revokeSenderRole(address sender) private {
        senders[sender] = false;
        emit RevokeSender(sender);
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);
    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);
    bool private _paused;
    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }
    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }
    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }
    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }
    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }
    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}