ETH Price: $2,424.16 (-1.45%)

Transaction Decoder

Block:
17111560 at Apr-23-2023 09:02:47 PM +UTC
Transaction Fee:
0.157457670779945745 ETH $381.70
Gas Used:
3,395,709 Gas / 46.369600805 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
(Coinbase: MEV Builder)
0.037207090059173758 Eth0.040670713239173758 Eth0.00346362318
0x4c988ACA...4dF4F57f1
1.48940743 Eth
Nonce: 0
1.331949759220054255 Eth
Nonce: 1
0.157457670779945745
0x56019aE6...3de333436
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 958415312198829217864647576346740761708839842824134303986532867505155286424588288253720463736507209186901534769825395451766164155168460637155279300936515150285444085921424467642602381184438368497120560788377360183334550480457250920019782156241017378427086393697536823717673745373915303305688569750555620595921662772783127564423209245407999579640533229013912602935621270159873187297471460991394693164610555910348944820303753680169560825521657108937341996871112891849993321794407424049706454861492622148531428259433717528385852529811776282763873132260049141247438916884738911251769584189276338746787264508558565356020176974592283512132245709461100369923589798484107857039989601888677947278622867811724133390434369601802272988785698535563789320618541949295275768178670809866931356000330640533842461626476565685870559677929393321197454637064638706299997022070802590495481947797555529599618165497591663057025062656685050367858125686628729245569530906187964311417667096859401454516983848394389602946475054607891238128068168607937898850294090703363492104410827027680876292196028939755211339812881249308118217185446493783918446993563991236510525008930143024693291486685832282289291362138080081298823802267023708886712677363221211609890459333205296752510975829716371541787640850494910577085187621574457449861930650864384333967540200724328497581480522431859470308900944906642255015088454734003728235676616580679747622346570979243338621467827918964062547926874055961941025028088251874819774187302710199323131719559933067394017835154524597802397474984038509542533567022896196480834718951076984602866093959973640480994229027215881512181248395666889041584907080970427182265102377813970795021645745347985206724225035547136673502446402280992853039572819093889119442207169670124848874964071052118149629369882594098005185334548806702316203009423170377842264582089037941725446715126057341154974698046131545916942728238995443161486669740790257425123171571527660326586067244411161746554997625081175535214496346326862556059410210204360551580979378631254308165445642083717227900420301993908089476959663002803974226341278617357383378605688792229100432023073676750914524846783120042702942765876642412411840010418081051711324546289850815307056215563625610456822693537196565312784011635516693469724121236276991672433605732844220588615339521576127830863468193018180845663504766262225405904669939184398459255817958831826329662397363090405491867910991024742357047734567960536040414878939353499270149342893975097201612082929747860248352207403759903122503710981942753783006001512896042589459317223347007019671395437137250517520063972047920974639601916453787974602301021666663822021705362295543240902839638995578247334479338023381584022958044612687808584877316631204592185742241123519031696447885957420066723435238400990802000675703732789139499762897771887766034381772712259487710252951208421660329494753473104470043850888650266330466682208499496856934073247067332939976862971005476736061341464846917325290634282163471642677384240259578283422387062071227306989093070113380702955083277729216583822543247419189515883924667809489731515884681703577043651916635346158275096577307445046214509622997740135709846523354166999615064816709167274364891624390717585579794301282609344263926741756717354092924769615495793370599102725264175970921100131324682328532067102829796808909696488527879310117185955436517594519691621132154611364626999046812113144193538412382516221033807155451497387413248174423847144780456583278039085991096473323609274496712541731986589460944729000482685188340289709051124410779129483751272364630808238643518241970796607473501716013265668732879906573546415557552676837142291050536125575079506966218612196408387488508944369958803392251440143888909276436356647368703133485258213516968690815997738434317815719758767207669575587396781619124310141024055005666702423510383515345637333304534943007213778479903597899849897123836477627066569930283093777572596035629471172660545598880895657482563446922609037947962980118047568503351906486872317591699497154777612136908443041795306089281900736399569885716591288853961770641955573414679187724850294464812283405846369216284607734822598448269672174379545019160428944000734110299361590613737100948328837240264690210145916275395876936093279010379164367425812725565988343292505042397309267974495225299665592103306971526460502197974069122223838257739703584460403582302963626626590613639324179582008477473150676456269139183431694551848118720474135416973765687894015737726002900262807440625435954298260620499867448691930541830690645089868260277475144029312525796021748606572446868505667352617768804654875298891425741943840970404676028867688743109989540566479169074113064586747303675221222818793647803996379855718445519355583833010044171222404948662130264227840490374494844291701589303562190611873662629391226177602049332189674796581526122194803837829166774619519522404994800822511102132032955763276445209884319316735475739761416603632091540849268434177418692414905062217927360360154527404374193742050519737676891451606596106592478255866652398063171769615932057995203940163316398949046654389605865424951840519778927473161916946644120927536930629140836791528785262889692295035182388576286301647636719552359756141611389363293541697027543358855712237958305203046642183577537932365139559338931024826253532231184328030849245874213941217532795431578957209691433330901534867452928177942712908783050879057976216511536301212007651725903785919389034638803124338586831131773730897137933222724562720607417953624356009766685243203281760553430214332904192173427668498433082729061694639059173205155047312937451953482819109762396618769641669139336959689921805142253638404339440082688312067171314529427249841319644128484115573835768685562402466316340571343033581431908536174414562455908584372827303728790760344091857566298126674160032907665730947705831252881004928752299490548157637455100890776123332353509525411465099369875695490592899466700880944646735909787921534791256159689945187759513529102927284030780644858809109018002861823577717033610379055690190880251048132965828762560841977182365285476714531062835997029757945906334774441932115552779487509177417863655022597514069817231995282318473882033422813137047893791272679648364570846197141199970406746083270921355049789594771774931281953986099205950331971984869651105037796744253584077519748698188586009201520063524611143310377397444541836708298351679227729757493339207925199400034173467486007311395956889887689033796376828154832113660669367078175921949789535072299667017997961853363861173924228849178011293291454903971915467771558280576399210165184897321069756443849363959274013158963568319376961415944662450562509604525499822833773864563700443531862305982671386568139871871084955617861191672225579744643143508049091152833146499587513487326167062847599843980148912517024195132345271930090032711659742220174444118680161754671715053290313013400512804546963157362870701528481611464650700623988514952932277986260025395
0x5C69bEe7...B9cc5aA6f
(Uniswap V2: Factory Contract)
0xdA8e9F95...9449e533c
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 6764290092513726222696113229074677300582406292993807811641041491451546652663832946268808145007286701968245238241127816432125602389017184726413726136050937847590796869894293811024043065599757516383598439860933528181090300335935280589560730897350622577558550967496327315713176388796307993199725684602376921455805779296510030374220885547509444868710798529805028727005768714365783259716828657385948829505091458413475079524481325004020131382310615246750211606259678290998829940259225530128665275112971113196802097677938777250683881132049859974062111934820441863780430250758355797637960750640892756709980889465478442266956369721727910472098733251357727588359505324099520987734779471153904088146904451113253009478829999518384731907276109897019974128585672047901928474161019609964254665696537118224989521679461638527674308793226417841604722503832053048532902743307744389924362467024979767299820841938001585847957650624642000220240301706785324856386702055650610854315204968583184480811083415429779248827536575359465411506177177445379390515456000159118002404098500273143828586469646146990732293811248260866404603448208714816779792930708637924585785344923086689220023494975479986597804741972532125496013912821587981468924357235612524376639419312183883107468017190276067925579537757182722154167251792251293467252920429282802741817458964167964250178698451250777244768530559299419515124597360317799947936425995024904777435541609134244762412649594375866318483434878329518971411551066386725769756347738476890766956758257170230921029118937851662167147785392125813193563910941558943591672789492960140897136645764649800443959007902537470461773031419538777723327284464018316420780337409842568888985000488447839658062527760095682586164775773214642810659950442674255315187351133219595503239984805187885057741209994719667251209388778069364361415301923124931799752866448084739197681034988561589076201577647621468568479848613173121320183097946088463308654506843928283535527795375336708379201694478390364822689103678655730058935721861270429978304410891962229017129803257390918323840648004285775706484187924048493162476273980415864540574125705878836618285576167457968612731352121332774607452845505315606948482016799746025821947900616429589340542397646412597175206797007211195539013896690130035550363648156843285087910735824004198865927580262828335941064623092413322301962233201566480061682912328546536953004420417214309810243482480379230346095966959109164429110341332451732713814747175172369733954829327244006229439107670350706716504118905719655739745414004105313534003211265953607468408682381484813134628064385347448612228488546068815684868943136925228466482662307586209541232941634702763150423361005273125768860359321003070498329113152304044687311484369591886826286849241492714746035453530985760826074202224328680534075056788780527355850537526507990425706923533192637414998552174291800105823508026545279963231113518342895385291117933231995145145452361617497189515110310877530569115535492435194594584350568641552418631024789844590572990241425360787270142022501098410402040759002817599798496709518641266931956940271586933881608794762860972357074333620000074482790947589178384739181209133451809354582793752274745523208872446938433121740875395933730975169916652974709460068802648678902520835579588544048994083237923468544353056358980354473986903440319386298931321751165434975108960230688774040300045910090185787247588132844114599051255052017617203763570020643980184460642425997380706939760721292671508756597075746922214664039831793061824906191427981111798963319671103105682516044128013644490508952038196950395775123309117732986401317399418753541902793032595083149403966845032349974555993774125382550395142080476019329977201288431302910516579749086814871044331826687561445526814857627505768646136097744557146538034074086772572657530335192950240723439893641016921774546927888540880657938036705233151583642660012962859784691791384878223191473627119947438517852764440971828961508452478940789109988117017692387321165609467031954503412355042274226115369747525054603510429981061723610769942555565153661401943161583038218788194845730510475525890705549828114256751060625497255614079889706354664318409524618711645393755865535736265419894209216588826891584654729343750713800564534728044555813377838103874981231171485140733266263299075026059236429164119695778164125060523337408702214716847466436355994236419462579542555885431275282744454622219328312809704544575841800103951253833159611958531352158489434753375547341984551477139873587620077923891601356185237161111728906276435402989046268121585153012726606548147957843971499826751460265151332607569832201390696106196200752739297898595139623159042244745256456626142684727660272442966410634822047683300319330400559169761628065756808063467026781859272204072788017738137691590428849940404623797624164623418991251701730339746049083454229761375529668033180050831851989098602590190931556465251664831913405722385646847081246713251764160201651313440050983794542297240590895258738842148628156159843174422928120719239842890992552053714524427740845567993163667220733781561399513872561597174177415211111516690920796797771245920805360003960884760200848694231187480984290755084028272394277514358038092541096254350991713995371201841149362979043223407550175185349343481527598607799904721345357534500289318086908178164448654142236064067691303983660544761075017470810256587690335468605289643045740854389048200262275242835132671999817265060762054164020094958990758782725058621840857637716990971046700297483747224874784380940725167238503937445236580528704977883116876684784812105248904836687347634087630789939736208878631432723279309619974220517971118933133332688040703721111084237405651633296969394952616986454772780782236477757818719241494505270490966054772513455627624630005101236682719525270803450503064376334200110077160546253677571419685815620663851070433904622739183540407694134892752836360832538907800130968377752994239951195784527074784186282221747636104636183157750815793451098991297791149668131506205209201338229284164964425750495059737706472549130820257914073143963770346648275653428733160833088538926684699923331640831574696709585862529131456577383480549391857703708838362649800221591036103647730485858022409440661539159192819497548828260828265538529533585508530470524989669001456733688955602622011860883640745452161988954591994125158616967790239030532336904388115367138662490449272650392238721799165071127153267098924288572207943567511660222463941209767332737839662227704940675417351084427436840529259503839007120450489208106621466626535066474865241562379856926344618852106808758097146079191799559319324463443117408712851590498042748419485714349296486390727760496977457722407596889880244120109608420478707801123486119654774232164143858381932711394509013839366882817856528086301231703477837632979266247673310145586602843728627791338776429883562245482454731619584945684936774315483861743673537783429630514215175251343860831343750903112114643957727299881604440299342607613370350603554504965249353808640005017526991925625166547716534038743792145754791681799372563214582732227397669366844361480483684424805049433824559921611895043946309368453026303526413556206774758337691102052148025558145429495060173330866402500693439731960967682169923931093691165858343836190590627360643853508749006236909428207026806495798765936494138323438961022814367473195404043719041907722447918404463260294688120986507063786298949067678950587962569110366612944641472612249173325809273011809698490557178553703028099562680938490396991797809963662352651174475171566062249784396222183324190302655760704229086980771663717844883911607269853698488457417825326539890406983009667814030907614840230105466135803386012608272054670844544529233478939341199346844515817283532802858042261501258009187082544649243558206678780997844437677330123470837465964557746228151937679921791178421215505735405575109056703216581188108652321249735290951499523192020938070710596952169566673256866090961908741957987268407494787371646949696885460919597216876116734929493588469220898091636159208073924384748954733200741628862487985418847666920265644376986825100469311209100338844849634350799853250141080141439713530624083898238798384028550063131897703658759872633810114112211904230734928611739554815204378080824416532752023553763725404567832013292304011997587857200530668930543557965136872372038500689077196872554532514941590492199908458415237082874255428025959779181075920338933105636812221073846658213726279205486919814667929367517219591351704444216162645682210790295421213989754380776085340989180683297671834937134685581195970714439656380247591905970357101417644632261624573751397652987080256022888790428388170130596807031932132567258880599336656131280183093634513676634099779187050352955040932386269069409030491683437740316198301759703346847040697132809216509269188576981188481741208454290436912477712961809883892946931850332143093113557947073073133493193388622663546816814788273516833660139858434029297726609646054004528695805557241526096026425782919507511150973467162816008336604564396099493571849684779129558232640291170728034253643668090897057239052493579545550876007696733317790505751519268633365330580596948616182551659835202221530689455005320864149002153702371478418387283150611210937475882684628893586308705327111168523564383017267243549454185080188917394912629834165963293642939668750235743119572767010423093845038857669576684825897647730323198876163735426894119250229192676495876824482984885795916905361913128771993068480935628050923924974584330675387263238833952316293420405834941410462863024715845898529451002644013034384563143684303106305161730964862516380513513090041544289358036475789754179412107753713818133862537184289678333722961982780632695650705391830567533815093460343368020719438594303931918672539611806165551633361245531509631236294368693797776521963029847564800771278896901887004240218288632377404180749260673412974247077635951291505763690546251206522916341842345669355128111378530730869540686202792860720935596082760553179364451197915910611110567650554133274329286409222985812687698305482062478735481606757775081597155727056354128088556845159443149791829183447651390691077037066885114632862380245151818802470147991099053065256475671018585152952510427035235768890000240568699799353803923346267868222127672252791506337485684174168291083367095515792125626919342586740255104560164716640656979255450418721100238157374349012708264095594721446771077927904131757020744005879471560707024285793308799890377664446444696497209154923522940451976298189530823002220368432891315784150231254903747610042319247999373104561708514248138593425334599202349780452157320167937780340833840631249982408812299987763184216682052627937304738624267660662701449679993556542526953378088820247150468272072500478794185627944260702384965595234547001740574036772121761440909255539749642143706818941013959174681627333589863243791277341202978458183403356702498325291841283674258989071026904599657742857304672848082430957801852056769792469060717881606830909552639167367917564753559780204903737906441237879329789257546182683727127115322069903727988518726110079487404802020511607781618242819429420089952618150015040687309724351057995254644909643659990306397987893792742104471221429087651215923455299368785921472186226973526837488985286754201722930812143157835538240691117506250865065552583960649312199939316137384317909190607335893017385837967547842296802921051846592655112401573859844970186624205609802519691311319580168923392745867891477530622283207438643706944844182931366782297825149926316168536706894781550067076846798287139321147716449014900948126256408680150117024107354911091639037923916870958931724969659784830893556188082349300933778002187943506706189874297445002341661863262596175000304290153490229027560721282756675903899241091327321366868580075450986013686336217170613325953994216424905427651509439749792881592559295908667468735054423414491972009886466126864152276099810447557792865414484656309040180366937046161097203440184665847528107800687246106911748090241663738456905982879374776075826959890272052180911167815484802956453480223451905817815986200072019409312539479823240160294321013861415879683806480801121789543612632313267996424801440213290141569842478416267842583260933194565280731409546914798090907553328802639824695214079484968171492697700379843722620536081593766292525747024078145041540762535961046108970476047624974467617855630429990419642577116238310295258739009426864254518359941258619669364910191558743007389886211816286196547873549687195782980562303703078573352594869126358338535037338805457363813251893303645464748981203623384313310961935292872592540227301085345487567774295253486990810557590474460766110088256031465649867454049853978297832594858855014974959336921139992518398181902049967081705968623560219572355863834361863471356250645288809768553450722282913136962139196770878174924662518413835493044338285511312064129458061417425546441052239857727919702750008526239403176283339977442776563759906879945240605716588949012391858531007821799081844774002926691165725398471759618939120110836523329075262746740205006111913597393479191016572068644428228987329788148073618409742903036359992252826967196736715853093241408814752240618996799914233025576124689956507192938159861315392870711114529172834682750923700691299302307091440461395567404959734546062323894683998564701325833780437972604515976543418379956273057791668270649085702563814683440555349713940149719583840350120611028746945759657158941161739867833561483855003986868221117048736066314604088328030661386531830410862233747563258660020168458151556224026399759857986377768247124506223149604283135886628157441527562119288646712952460396440504473459450281587445391042122888567151597019928644771358604352684544774935692179968419852667976358094993557306305707419215110575870945588263060469008491925224318282601381674202182173728957441525967610005976462159108522672830249929861580309760229880209135107975447950965042249069114272498472606685519158398158453321784839571604335975368386293498007880573774972375151343318757759313906444462507800881443403355944761990200754208207198799285296196346580918143110892255583375606232498498012951522497829857129603412429391961614266045627069206365540727104498529828934706571552828383708993671660464792189355298715143407340870872358594769225567216055125795403038204258550090209261330851021368362078057721856147374553849563949375115536641606704630492897628219114592144363440885459110530247622582729306865142917105722134947601821711203226459176453715017863010371070757960935996090769414578499774698669946986350926671071042854576601011366168897075862963672120256379385521792802219280102756704362425092489027354535128401379693457583486620083746346919952717415398289879545576791175596331980251055644363911476175866157131634981722476769928979368073205939840936175115011825949712794754653888124936432262451159209764190344727238444218782067344785409399030749605849827080389953074761160641751950570538370153836773652282726102554259264427693292321974445565627079614854146581971964907609310454007234972380632303011178287096851137085917612044812344029102122520241255957806216666303087431463563974309540831177242119479128498547771931445380854759092949483851131239054459865790851900684225462824192483995475613054141630410172806769615180410729667817089704751911056456677963218229821052414968249575434204967548620375472100120764911399759157804380112274413996979953080530104063887812121642791624865021264460575745152658825176211337355375215156591268395207756569707380560320092748178809799073339153230150034322085144911763682467095911370450349164758389754765586762878049407888245724744997259471226819014336205993096651941082526644438023616442252857259378196219549408643195769871481026822483366960574488594693968271839301044267519918792385119346946618421990742392525567922849361033531333805519730841344139181961493930292592996589203790067448478224852023114971309611190820049902449210217615039080815730321968206066273891054387712140472093819738851210013833169379888609322428782561798139632187196699467741521068025507678736717203500114231556600519408737185508687511648395357402867651420892204151924136721668678630024991088672030413564951109092273806676284039452762124791584401296908648577431795282151848609140677037158571634794256502974594080577051686545556607498563485575753220960188781517809196230752373214710394358039533163169617372187457387153267514083070126303564919376479352851093866957502237542568706783257636820706106108543628139943620018429812153561332433978007417707091769054907284256718739540419327974667810716324771807074714411001699627572361666561394311276795560562246665890864958873815526831202811626923143681151579565737037626125401361487764835059771789324392137787656573861045829581920926182106170924802248205210923977095643289062610442919240870817953861349045675660555743663471182466546550738791294218992391377190444533440256177379995195637948807579165828507324509817934081700873549199054102598134174353968867595536343788602057212645711438052815864631188644532808337558063531421690328361261797425915803646385226849947799314850075738099393024556559586598418486569945993940595599610421864983614160605357943378648746126216934831129225929649092647080940979590144629216790913108186529982531947043971176869001683334503721088119660410247222823993681585537060306066899978076043057006842394029407830570752837868854143748244327765879558911200445296922850606598449733576220037596751306793117637814814809076810845581417107313487016190564088533464760175004410185349388706290948209020160331438702929747073999847911118242833998223855365334396209318469891158283547361012469232412673861463373831580213501865381255459320842625964676283986839323490997347790280779452514393074121873199156736715297115525804657940825539490991870952667132301281577104602808814514128093505020837391894164020288471138795477040145388474319619392418098844411457844344819636186288456991613799098163655435691413390581981106571611895891201523136728583002598132487530756221719409491432807052471320078749886276696346612425562335751618843061820207958589248251388419925830408982049731166352978177948440428855441035114829894027933768638096795622311990754643642480765220362374685474649398930111424624448993795547342615533717486701347279636474653171996896393993368399863331665562215305249505267582371991400653319112920715332232758174189257897347694206759810504816446459474642119433419595162514440673307551153917538908166473350118859508873388530270664623206129931418203638930963504423648212659991557243720147089819330189481547071239197946872847625158599050136589167109285310355708139805992886967304372128960120035967249856357985567636821419394779738398877938830971857460363878028357603108815804963909581297635715785122151423880623773510841971615872803004278642115677963438463253762180232265937947081428266873403895540343919541476927014762194185492670808213544577235318524626246205222199361132226793766369092405517901071044730579717493193636382009225072042699611589560849956219463933960444297456575794501931201486158834650719432996973656166841633140568712552992556866001892529589818015555320895607177709927456997843290736960333353802274207489150830583171173705976004003107514003499465961116447093038082140585883937643933388792177032332218127105001727447931351542830607832894808097709620837338541162401423241512159501853485273279316730369992363869969225480880372360850909133908359268538979263740761556579312997137274133094210727646154323040783981629410776223181612579812269502289673006076335556442960275642545765809876321258349338855242165453266668192859843679302831204761733283555830152779768092212434108894692633188732656616583708483211581534054289656198028419314646068520533699052369935109596354059478321396462107045158833659465676928637081198271492329630655513648119023734788052785747161074690566974763166744678116781942000400111809228361957776009325581890949387597571502880481238340269550093307775796102685085389516433410129171154321214056625937377834950543338245769030728829686017765144121191389484230565540447998095571881807639116241688980698457024057575129917234058983003295689268394838410607777712617223662791727452205745512815120135984661065715443604245724759729285538406223337844757875890584073570306115883988628480307537668569448581617467225188207875557290340880770862900594880870117713053526725446506721252669210690565757714982078916751033501987993507497886816908544535597782196537857661163168155467385231328756517638903073024522691471339954497875543455667671985687448196140903029844662112739516577389964702597777881879993188026579813526544373361467779703880035148161793831657996452289088988522078211549544941838341834659304849012857143375279646957622743539224286047512273646332738104354913432398751748776303436846678966737226795105947612660521210081857614304545802066532878159368902513121832477063393728646315903978978417725275377348336144382751206934808050336979183524073794363047059385366779695905936629565082668113436200002418552053501464147822716125951281081626449240687659782254096702247173274030119312003388671204470634487632896966522413113840196090168852873355299545907209039594132662263644199792639947500528853310081332377374094851463951990568475406889477545808304306982496125598774597516586418367649826915662877921875008851206415137210039577704357395960346164807887222893276558135799917992928510520762055279104747028210243378548127981504554300707979744916854332552979917885832790667265044227405833453983668996089259368000307363521342399016262305708676959119169445587028414141955444948115995225305706296148863946137017386527581705688480724801384344873811707621661613344562603289741284272299897079266751049976714703508088142837932878218409481059544647608343939397072490861604856512692294673663501165974600903234374254958619853088409488384962249431050362437755006792017222959434090043517413275112525686727202978167056469344307721340393172024546351300590425624001762505968945684644452868541122431308825575090259003803988358747027552498793920080110531559696802247025637451944890330258593960525701673937396964882129178145848898022077127853695850659153067533344750863905302557586864631698795335648642767540381253600764485888136959036833458442899051670933635246235444940404864480258845215235709451374866006822468230680421430834387766942713246358107886822658197035105088441365359965313625033118899161404193255455091163078685115342371141956649836799214235346377328795589150643012681169368490997815232600626993419188485240522829565986637518590293323207473875662607965068345913236158900084544667342293172284971759916782537619534171798229625688783566586310211543500163083352362076280555201116023875712391718884540760495007589219975257210992338254907941933783504169445277177653286048162788882065426772485232673663980835703951031403135955662287308137499161744399289229660191063712741021250091844557410821866536848770205944334376289295504617899128188723974573843540376369170934713069944183448819370368544447717296284928789609546924988805850894814137794682086321514492249263072226835615740386402495007851784437979239584454196848083951501751533965002333499623410436536517933069298040066251487779961573311424830426862245268411668151962291842870408784529588808672984894998068948478328659484085037639397445471646830202692405398794942311367047631000902453589198781642261873174886387293172615195053771249178974991969115652438013993645217367329179328448469251298195258586410111546463321686023921891948064390932677400045694884140480157629056213846824921972462858598868303069986636626778915149329873457930180897725690404333076468390655896981655614463467352868365549602784011571751704638269811484215627261675736856646418817571801562745679038330339100378104167056048684983494783407023693208677963417703006460632686488824249933372893046684367384351228674532386581234695511373881573077064566713343232005446894198007044326017224909579982756378005747803102746280647679104329174519768599653633260429490217721691640057456609180427621576686398690223836429224585196393249986121948477357342022470938329046335936524488815793467961973133939682552615376993486021054039358788636596619141479412808401517706122002272387746035625791675647268762123250366821740062439587789629890815161354537245109726660150508185319800664780846796620609716049380353249497917262043623003214690407543554436948804661830012114573509174725254033104452509781095548541699119579999902076294756663550267884697947804605817029059918883406984755180285407619596122371075164388014768644563054280436577149501345210374949988585943968226840796266869061400679524160687644859329034662837673247017091139291412838902012601812483189105102410752415899901556704424119398075271565243872606958365090443597139537963403352774271270883384906005867999168938403120332097325518966646252024722066135777121168591028533514218373107470307924746576828552738919334530085369624839859826407507075128571682866233254812426213419649103085987747950906771491373961502364943954941204180182796231028794760528231039843679591718024252825757189701912408414250573342665058036537607505942900546573983476040929502176648208016502424104600071091531047566549673850510648004137231201311503906525892604306217023553544609724063949436441636156277877158283669916590245051904858288118783918233987694987527031762552805962103940163247283170503225198004186250113862929728727354968023906216445709393667970561652566077443891545863900381474195120504034708346016429419039708218801177238994274286642395393181895957196396445588111707492105083793481022042153117708745181808330731778659807268148799242282675485164674422124204165225545172605619666926380048118024827409974334232827478259247735750531436570625831466693647658195836241888454810503325055399053278622601703833054491036632209900150111269110408296482165360269000252402115388289794534865445946269207541388195527917990175975107152826111861944139061162628021771309740857559511045847040099119405044268555005258423094924160315973102050959507234883343684351566992355178393010366659736940716211016145981305655125846914531350269831461109005209005449451300018292224031763628610549720637269600857220684889767693605632590512035204660053346427461215201766034062627920943071508523727559068999921591124955396979853892373939461237543819099173287531974975021940548714415527485745096467065833962112024055266704965853376933634747114800022946506837532047231764414822679522526996790664331391871326324714842384640580860725805012092122234368923232605085888110628276490927030476048832601366959371100806883456937872716415199212044664778194316354981294943623527403860575373195497776469739181162749618716481872527704904890213978971340536058256072425591354313884595448051514257211698302759247591430854906365539092828273954872645666925017429731085571865959929198686430568567084379388715762986957300731567797205915878199318040419088638379877687482632760521549862102514290148327065848261089022468605171831674449346723058418972370141272063395029656812596076100552439591820637044829602202673189352703923765845351583801316838425072606202168078246393932831290422471019136781076143860944346451539149346024104735775371147426051800685727700711707915734791432798518652486616437503720745033963440834135763802457839941647914572109132411455642822744800302783647928360605704918603217729501163642397746847175844933140530

Execution Trace

Shenron.60a06040( )
  • UniswapV2Factory.createPair( tokenA=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, tokenB=0x56019aE6B9937Bd93C9B9e3D2c6A5C93de333436 ) => ( pair=0xdA8e9F951a036a70a39d373a3aDf80d9449e533c )
    • UniswapV2Pair.60806040( )
    • UniswapV2Pair.initialize( _token0=0x56019aE6B9937Bd93C9B9e3D2c6A5C93de333436, _token1=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 )
      File 1 of 3: Shenron
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v4.7.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 Throws if called by any account other than the owner.
           */
          modifier onlyOwner() {
              _checkOwner();
              _;
          }
          /**
           * @dev Returns the address of the current owner.
           */
          function owner() public view virtual returns (address) {
              return _owner;
          }
          /**
           * @dev Throws if the sender is not the owner.
           */
          function _checkOwner() internal view virtual {
              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 (last updated v4.8.0) (token/ERC20/ERC20.sol)
      pragma solidity ^0.8.0;
      import "./IERC20.sol";
      import "./extensions/IERC20Metadata.sol";
      import "../../utils/Context.sol";
      /**
       * @dev Implementation of the {IERC20} interface.
       *
       * This implementation is agnostic to the way tokens are created. This means
       * that a supply mechanism has to be added in a derived contract using {_mint}.
       * For a generic mechanism see {ERC20PresetMinterPauser}.
       *
       * TIP: For a detailed writeup see our guide
       * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
       * to implement supply mechanisms].
       *
       * We have followed general OpenZeppelin Contracts guidelines: functions revert
       * instead returning `false` on failure. This behavior is nonetheless
       * conventional and does not conflict with the expectations of ERC20
       * applications.
       *
       * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
       * This allows applications to reconstruct the allowance for all accounts just
       * by listening to said events. Other implementations of the EIP may not emit
       * these events, as it isn't required by the specification.
       *
       * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
       * functions have been added to mitigate the well-known issues around setting
       * allowances. See {IERC20-approve}.
       */
      contract ERC20 is Context, IERC20, IERC20Metadata {
          mapping(address => uint256) private _balances;
          mapping(address => mapping(address => uint256)) private _allowances;
          uint256 private _totalSupply;
          string private _name;
          string private _symbol;
          /**
           * @dev Sets the values for {name} and {symbol}.
           *
           * The default value of {decimals} is 18. To select a different value for
           * {decimals} you should overload it.
           *
           * All two of these values are immutable: they can only be set once during
           * construction.
           */
          constructor(string memory name_, string memory symbol_) {
              _name = name_;
              _symbol = symbol_;
          }
          /**
           * @dev Returns the name of the token.
           */
          function name() public view virtual override returns (string memory) {
              return _name;
          }
          /**
           * @dev Returns the symbol of the token, usually a shorter version of the
           * name.
           */
          function symbol() public view virtual override returns (string memory) {
              return _symbol;
          }
          /**
           * @dev Returns the number of decimals used to get its user representation.
           * For example, if `decimals` equals `2`, a balance of `505` tokens should
           * be displayed to a user as `5.05` (`505 / 10 ** 2`).
           *
           * Tokens usually opt for a value of 18, imitating the relationship between
           * Ether and Wei. This is the value {ERC20} uses, unless this function is
           * overridden;
           *
           * NOTE: This information is only used for _display_ purposes: it in
           * no way affects any of the arithmetic of the contract, including
           * {IERC20-balanceOf} and {IERC20-transfer}.
           */
          function decimals() public view virtual override returns (uint8) {
              return 18;
          }
          /**
           * @dev See {IERC20-totalSupply}.
           */
          function totalSupply() public view virtual override returns (uint256) {
              return _totalSupply;
          }
          /**
           * @dev See {IERC20-balanceOf}.
           */
          function balanceOf(address account) public view virtual override returns (uint256) {
              return _balances[account];
          }
          /**
           * @dev See {IERC20-transfer}.
           *
           * Requirements:
           *
           * - `to` cannot be the zero address.
           * - the caller must have a balance of at least `amount`.
           */
          function transfer(address to, uint256 amount) public virtual override returns (bool) {
              address owner = _msgSender();
              _transfer(owner, to, amount);
              return true;
          }
          /**
           * @dev See {IERC20-allowance}.
           */
          function allowance(address owner, address spender) public view virtual override returns (uint256) {
              return _allowances[owner][spender];
          }
          /**
           * @dev See {IERC20-approve}.
           *
           * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
           * `transferFrom`. This is semantically equivalent to an infinite approval.
           *
           * Requirements:
           *
           * - `spender` cannot be the zero address.
           */
          function approve(address spender, uint256 amount) public virtual override returns (bool) {
              address owner = _msgSender();
              _approve(owner, spender, amount);
              return true;
          }
          /**
           * @dev See {IERC20-transferFrom}.
           *
           * Emits an {Approval} event indicating the updated allowance. This is not
           * required by the EIP. See the note at the beginning of {ERC20}.
           *
           * NOTE: Does not update the allowance if the current allowance
           * is the maximum `uint256`.
           *
           * Requirements:
           *
           * - `from` and `to` cannot be the zero address.
           * - `from` must have a balance of at least `amount`.
           * - the caller must have allowance for ``from``'s tokens of at least
           * `amount`.
           */
          function transferFrom(
              address from,
              address to,
              uint256 amount
          ) public virtual override returns (bool) {
              address spender = _msgSender();
              _spendAllowance(from, spender, amount);
              _transfer(from, to, amount);
              return true;
          }
          /**
           * @dev Atomically increases the allowance granted to `spender` by the caller.
           *
           * This is an alternative to {approve} that can be used as a mitigation for
           * problems described in {IERC20-approve}.
           *
           * Emits an {Approval} event indicating the updated allowance.
           *
           * Requirements:
           *
           * - `spender` cannot be the zero address.
           */
          function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
              address owner = _msgSender();
              _approve(owner, spender, allowance(owner, spender) + addedValue);
              return true;
          }
          /**
           * @dev Atomically decreases the allowance granted to `spender` by the caller.
           *
           * This is an alternative to {approve} that can be used as a mitigation for
           * problems described in {IERC20-approve}.
           *
           * Emits an {Approval} event indicating the updated allowance.
           *
           * Requirements:
           *
           * - `spender` cannot be the zero address.
           * - `spender` must have allowance for the caller of at least
           * `subtractedValue`.
           */
          function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
              address owner = _msgSender();
              uint256 currentAllowance = allowance(owner, spender);
              require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
              unchecked {
                  _approve(owner, spender, currentAllowance - subtractedValue);
              }
              return true;
          }
          /**
           * @dev Moves `amount` of tokens from `from` to `to`.
           *
           * This internal function is equivalent to {transfer}, and can be used to
           * e.g. implement automatic token fees, slashing mechanisms, etc.
           *
           * Emits a {Transfer} event.
           *
           * Requirements:
           *
           * - `from` cannot be the zero address.
           * - `to` cannot be the zero address.
           * - `from` must have a balance of at least `amount`.
           */
          function _transfer(
              address from,
              address to,
              uint256 amount
          ) internal virtual {
              require(from != address(0), "ERC20: transfer from the zero address");
              require(to != address(0), "ERC20: transfer to the zero address");
              _beforeTokenTransfer(from, to, amount);
              uint256 fromBalance = _balances[from];
              require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
              unchecked {
                  _balances[from] = fromBalance - amount;
                  // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
                  // decrementing then incrementing.
                  _balances[to] += amount;
              }
              emit Transfer(from, to, amount);
              _afterTokenTransfer(from, to, amount);
          }
          /** @dev Creates `amount` tokens and assigns them to `account`, increasing
           * the total supply.
           *
           * Emits a {Transfer} event with `from` set to the zero address.
           *
           * Requirements:
           *
           * - `account` cannot be the zero address.
           */
          function _mint(address account, uint256 amount) internal virtual {
              require(account != address(0), "ERC20: mint to the zero address");
              _beforeTokenTransfer(address(0), account, amount);
              _totalSupply += amount;
              unchecked {
                  // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
                  _balances[account] += amount;
              }
              emit Transfer(address(0), account, amount);
              _afterTokenTransfer(address(0), account, amount);
          }
          /**
           * @dev Destroys `amount` tokens from `account`, reducing the
           * total supply.
           *
           * Emits a {Transfer} event with `to` set to the zero address.
           *
           * Requirements:
           *
           * - `account` cannot be the zero address.
           * - `account` must have at least `amount` tokens.
           */
          function _burn(address account, uint256 amount) internal virtual {
              require(account != address(0), "ERC20: burn from the zero address");
              _beforeTokenTransfer(account, address(0), amount);
              uint256 accountBalance = _balances[account];
              require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
              unchecked {
                  _balances[account] = accountBalance - amount;
                  // Overflow not possible: amount <= accountBalance <= totalSupply.
                  _totalSupply -= amount;
              }
              emit Transfer(account, address(0), amount);
              _afterTokenTransfer(account, address(0), amount);
          }
          /**
           * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
           *
           * This internal function is equivalent to `approve`, and can be used to
           * e.g. set automatic allowances for certain subsystems, etc.
           *
           * Emits an {Approval} event.
           *
           * Requirements:
           *
           * - `owner` cannot be the zero address.
           * - `spender` cannot be the zero address.
           */
          function _approve(
              address owner,
              address spender,
              uint256 amount
          ) internal virtual {
              require(owner != address(0), "ERC20: approve from the zero address");
              require(spender != address(0), "ERC20: approve to the zero address");
              _allowances[owner][spender] = amount;
              emit Approval(owner, spender, amount);
          }
          /**
           * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
           *
           * Does not update the allowance amount in case of infinite allowance.
           * Revert if not enough allowance is available.
           *
           * Might emit an {Approval} event.
           */
          function _spendAllowance(
              address owner,
              address spender,
              uint256 amount
          ) internal virtual {
              uint256 currentAllowance = allowance(owner, spender);
              if (currentAllowance != type(uint256).max) {
                  require(currentAllowance >= amount, "ERC20: insufficient allowance");
                  unchecked {
                      _approve(owner, spender, currentAllowance - amount);
                  }
              }
          }
          /**
           * @dev Hook that is called before any transfer of tokens. This includes
           * minting and burning.
           *
           * Calling conditions:
           *
           * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
           * will be transferred to `to`.
           * - when `from` is zero, `amount` tokens will be minted for `to`.
           * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
           * - `from` and `to` are never both zero.
           *
           * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
           */
          function _beforeTokenTransfer(
              address from,
              address to,
              uint256 amount
          ) internal virtual {}
          /**
           * @dev Hook that is called after any transfer of tokens. This includes
           * minting and burning.
           *
           * Calling conditions:
           *
           * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
           * has been transferred to `to`.
           * - when `from` is zero, `amount` tokens have been minted for `to`.
           * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
           * - `from` and `to` are never both zero.
           *
           * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
           */
          function _afterTokenTransfer(
              address from,
              address to,
              uint256 amount
          ) internal virtual {}
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
      pragma solidity ^0.8.0;
      import "../IERC20.sol";
      /**
       * @dev Interface for the optional metadata functions from the ERC20 standard.
       *
       * _Available since v4.1._
       */
      interface IERC20Metadata is IERC20 {
          /**
           * @dev Returns the name of the token.
           */
          function name() external view returns (string memory);
          /**
           * @dev Returns the symbol of the token.
           */
          function symbol() external view returns (string memory);
          /**
           * @dev Returns the decimals places of the token.
           */
          function decimals() external view returns (uint8);
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
      pragma solidity ^0.8.0;
      /**
       * @dev Interface of the ERC20 standard as defined in the EIP.
       */
      interface IERC20 {
          /**
           * @dev Emitted when `value` tokens are moved from one account (`from`) to
           * another (`to`).
           *
           * Note that `value` may be zero.
           */
          event Transfer(address indexed from, address indexed to, uint256 value);
          /**
           * @dev Emitted when the allowance of a `spender` for an `owner` is set by
           * a call to {approve}. `value` is the new allowance.
           */
          event Approval(address indexed owner, address indexed spender, uint256 value);
          /**
           * @dev Returns the amount of tokens in existence.
           */
          function totalSupply() external view returns (uint256);
          /**
           * @dev Returns the amount of tokens owned by `account`.
           */
          function balanceOf(address account) external view returns (uint256);
          /**
           * @dev Moves `amount` tokens from the caller's account to `to`.
           *
           * Returns a boolean value indicating whether the operation succeeded.
           *
           * Emits a {Transfer} event.
           */
          function transfer(address to, uint256 amount) external returns (bool);
          /**
           * @dev Returns the remaining number of tokens that `spender` will be
           * allowed to spend on behalf of `owner` through {transferFrom}. This is
           * zero by default.
           *
           * This value changes when {approve} or {transferFrom} are called.
           */
          function allowance(address owner, address spender) external view returns (uint256);
          /**
           * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
           *
           * Returns a boolean value indicating whether the operation succeeded.
           *
           * IMPORTANT: Beware that changing an allowance with this method brings the risk
           * that someone may use both the old and the new allowance by unfortunate
           * transaction ordering. One possible solution to mitigate this race
           * condition is to first reduce the spender's allowance to 0 and set the
           * desired value afterwards:
           * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
           *
           * Emits an {Approval} event.
           */
          function approve(address spender, uint256 amount) external returns (bool);
          /**
           * @dev Moves `amount` tokens from `from` to `to` using the
           * allowance mechanism. `amount` is then deducted from the caller's
           * allowance.
           *
           * Returns a boolean value indicating whether the operation succeeded.
           *
           * Emits a {Transfer} event.
           */
          function transferFrom(
              address from,
              address to,
              uint256 amount
          ) external returns (bool);
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts v4.4.1 (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;
          }
      }
      pragma solidity >=0.5.0;
      interface IUniswapV2Factory {
          event PairCreated(address indexed token0, address indexed token1, address pair, uint);
          function feeTo() external view returns (address);
          function feeToSetter() external view returns (address);
          function getPair(address tokenA, address tokenB) external view returns (address pair);
          function allPairs(uint) external view returns (address pair);
          function allPairsLength() external view returns (uint);
          function createPair(address tokenA, address tokenB) external returns (address pair);
          function setFeeTo(address) external;
          function setFeeToSetter(address) external;
      }
      // SPDX-License-Identifier: MIT
      // Telegram: https://t.me/shenronERC20entry
      // Twitter: https://twitter.com/Shenron_ERC20
      pragma solidity 0.8.18;
      import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
      import "@openzeppelin/contracts/access/Ownable.sol";
      import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
      contract Shenron is ERC20, Ownable {
          IUniswapV2Factory private immutable factory;
          address public pair;
          uint256 public maxWallet;
          constructor(address _cexWAllet, address _devWallet) ERC20("Shenron", "SHENRON") {
              uint256 _totalSupply = 1_000_000* 1e18;
              maxWallet = (_totalSupply * 2) / 100;
              _mint(_cexWAllet, 70_000* 1e18);
              _mint(_devWallet, 100_000* 1e18);
              _mint(_msgSender(), 830_000* 1e18); // LP
              factory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
              pair = factory.createPair(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, address(this));
          }
          function transfer(
              address to,
              uint256 amount
          ) public virtual override returns (bool) {
              checkWalletLimit(to, amount);
              _transfer(_msgSender(), to, amount);
              return true;
          }
          function checkWalletLimit(address recipient, uint256 amount) internal view {
              if (
                  recipient != owner() &&
                  recipient != address(this) &&
                  recipient != pair
              ) {
                  uint256 heldTokens = balanceOf(recipient);
                  require(
                      (heldTokens + amount) <= maxWallet,
                      "Total Holding is currently limited, you can not buy that much."
                  );
              }
          }
      }

      File 2 of 3: UniswapV2Factory
      pragma solidity =0.5.16;
      
      interface IUniswapV2Factory {
          event PairCreated(address indexed token0, address indexed token1, address pair, uint);
      
          function feeTo() external view returns (address);
          function feeToSetter() external view returns (address);
      
          function getPair(address tokenA, address tokenB) external view returns (address pair);
          function allPairs(uint) external view returns (address pair);
          function allPairsLength() external view returns (uint);
      
          function createPair(address tokenA, address tokenB) external returns (address pair);
      
          function setFeeTo(address) external;
          function setFeeToSetter(address) external;
      }
      
      interface IUniswapV2Pair {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external pure returns (string memory);
          function symbol() external pure returns (string memory);
          function decimals() external pure returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      
          function DOMAIN_SEPARATOR() external view returns (bytes32);
          function PERMIT_TYPEHASH() external pure returns (bytes32);
          function nonces(address owner) external view returns (uint);
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
      
          event Mint(address indexed sender, uint amount0, uint amount1);
          event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
          event Swap(
              address indexed sender,
              uint amount0In,
              uint amount1In,
              uint amount0Out,
              uint amount1Out,
              address indexed to
          );
          event Sync(uint112 reserve0, uint112 reserve1);
      
          function MINIMUM_LIQUIDITY() external pure returns (uint);
          function factory() external view returns (address);
          function token0() external view returns (address);
          function token1() external view returns (address);
          function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
          function price0CumulativeLast() external view returns (uint);
          function price1CumulativeLast() external view returns (uint);
          function kLast() external view returns (uint);
      
          function mint(address to) external returns (uint liquidity);
          function burn(address to) external returns (uint amount0, uint amount1);
          function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
          function skim(address to) external;
          function sync() external;
      
          function initialize(address, address) external;
      }
      
      interface IUniswapV2ERC20 {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external pure returns (string memory);
          function symbol() external pure returns (string memory);
          function decimals() external pure returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      
          function DOMAIN_SEPARATOR() external view returns (bytes32);
          function PERMIT_TYPEHASH() external pure returns (bytes32);
          function nonces(address owner) external view returns (uint);
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
      }
      
      interface IERC20 {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external view returns (string memory);
          function symbol() external view returns (string memory);
          function decimals() external view returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      }
      
      interface IUniswapV2Callee {
          function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
      }
      
      contract UniswapV2ERC20 is IUniswapV2ERC20 {
          using SafeMath for uint;
      
          string public constant name = 'Uniswap V2';
          string public constant symbol = 'UNI-V2';
          uint8 public constant decimals = 18;
          uint  public totalSupply;
          mapping(address => uint) public balanceOf;
          mapping(address => mapping(address => uint)) public allowance;
      
          bytes32 public DOMAIN_SEPARATOR;
          // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
          bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
          mapping(address => uint) public nonces;
      
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          constructor() public {
              uint chainId;
              assembly {
                  chainId := chainid
              }
              DOMAIN_SEPARATOR = keccak256(
                  abi.encode(
                      keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                      keccak256(bytes(name)),
                      keccak256(bytes('1')),
                      chainId,
                      address(this)
                  )
              );
          }
      
          function _mint(address to, uint value) internal {
              totalSupply = totalSupply.add(value);
              balanceOf[to] = balanceOf[to].add(value);
              emit Transfer(address(0), to, value);
          }
      
          function _burn(address from, uint value) internal {
              balanceOf[from] = balanceOf[from].sub(value);
              totalSupply = totalSupply.sub(value);
              emit Transfer(from, address(0), value);
          }
      
          function _approve(address owner, address spender, uint value) private {
              allowance[owner][spender] = value;
              emit Approval(owner, spender, value);
          }
      
          function _transfer(address from, address to, uint value) private {
              balanceOf[from] = balanceOf[from].sub(value);
              balanceOf[to] = balanceOf[to].add(value);
              emit Transfer(from, to, value);
          }
      
          function approve(address spender, uint value) external returns (bool) {
              _approve(msg.sender, spender, value);
              return true;
          }
      
          function transfer(address to, uint value) external returns (bool) {
              _transfer(msg.sender, to, value);
              return true;
          }
      
          function transferFrom(address from, address to, uint value) external returns (bool) {
              if (allowance[from][msg.sender] != uint(-1)) {
                  allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
              }
              _transfer(from, to, value);
              return true;
          }
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
              require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
              bytes32 digest = keccak256(
                  abi.encodePacked(
                      '\x19\x01',
                      DOMAIN_SEPARATOR,
                      keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                  )
              );
              address recoveredAddress = ecrecover(digest, v, r, s);
              require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
              _approve(owner, spender, value);
          }
      }
      
      contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {
          using SafeMath  for uint;
          using UQ112x112 for uint224;
      
          uint public constant MINIMUM_LIQUIDITY = 10**3;
          bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
      
          address public factory;
          address public token0;
          address public token1;
      
          uint112 private reserve0;           // uses single storage slot, accessible via getReserves
          uint112 private reserve1;           // uses single storage slot, accessible via getReserves
          uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves
      
          uint public price0CumulativeLast;
          uint public price1CumulativeLast;
          uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
      
          uint private unlocked = 1;
          modifier lock() {
              require(unlocked == 1, 'UniswapV2: LOCKED');
              unlocked = 0;
              _;
              unlocked = 1;
          }
      
          function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
              _reserve0 = reserve0;
              _reserve1 = reserve1;
              _blockTimestampLast = blockTimestampLast;
          }
      
          function _safeTransfer(address token, address to, uint value) private {
              (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
              require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
          }
      
          event Mint(address indexed sender, uint amount0, uint amount1);
          event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
          event Swap(
              address indexed sender,
              uint amount0In,
              uint amount1In,
              uint amount0Out,
              uint amount1Out,
              address indexed to
          );
          event Sync(uint112 reserve0, uint112 reserve1);
      
          constructor() public {
              factory = msg.sender;
          }
      
          // called once by the factory at time of deployment
          function initialize(address _token0, address _token1) external {
              require(msg.sender == factory, 'UniswapV2: FORBIDDEN'); // sufficient check
              token0 = _token0;
              token1 = _token1;
          }
      
          // update reserves and, on the first call per block, price accumulators
          function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
              require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'UniswapV2: OVERFLOW');
              uint32 blockTimestamp = uint32(block.timestamp % 2**32);
              uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
              if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
                  // * never overflows, and + overflow is desired
                  price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
                  price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
              }
              reserve0 = uint112(balance0);
              reserve1 = uint112(balance1);
              blockTimestampLast = blockTimestamp;
              emit Sync(reserve0, reserve1);
          }
      
          // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
          function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
              address feeTo = IUniswapV2Factory(factory).feeTo();
              feeOn = feeTo != address(0);
              uint _kLast = kLast; // gas savings
              if (feeOn) {
                  if (_kLast != 0) {
                      uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
                      uint rootKLast = Math.sqrt(_kLast);
                      if (rootK > rootKLast) {
                          uint numerator = totalSupply.mul(rootK.sub(rootKLast));
                          uint denominator = rootK.mul(5).add(rootKLast);
                          uint liquidity = numerator / denominator;
                          if (liquidity > 0) _mint(feeTo, liquidity);
                      }
                  }
              } else if (_kLast != 0) {
                  kLast = 0;
              }
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function mint(address to) external lock returns (uint liquidity) {
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              uint balance0 = IERC20(token0).balanceOf(address(this));
              uint balance1 = IERC20(token1).balanceOf(address(this));
              uint amount0 = balance0.sub(_reserve0);
              uint amount1 = balance1.sub(_reserve1);
      
              bool feeOn = _mintFee(_reserve0, _reserve1);
              uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
              if (_totalSupply == 0) {
                  liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
                 _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
              } else {
                  liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
              }
              require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED');
              _mint(to, liquidity);
      
              _update(balance0, balance1, _reserve0, _reserve1);
              if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
              emit Mint(msg.sender, amount0, amount1);
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function burn(address to) external lock returns (uint amount0, uint amount1) {
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              address _token0 = token0;                                // gas savings
              address _token1 = token1;                                // gas savings
              uint balance0 = IERC20(_token0).balanceOf(address(this));
              uint balance1 = IERC20(_token1).balanceOf(address(this));
              uint liquidity = balanceOf[address(this)];
      
              bool feeOn = _mintFee(_reserve0, _reserve1);
              uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
              amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
              amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
              require(amount0 > 0 && amount1 > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED');
              _burn(address(this), liquidity);
              _safeTransfer(_token0, to, amount0);
              _safeTransfer(_token1, to, amount1);
              balance0 = IERC20(_token0).balanceOf(address(this));
              balance1 = IERC20(_token1).balanceOf(address(this));
      
              _update(balance0, balance1, _reserve0, _reserve1);
              if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
              emit Burn(msg.sender, amount0, amount1, to);
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
              require(amount0Out > 0 || amount1Out > 0, 'UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT');
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY');
      
              uint balance0;
              uint balance1;
              { // scope for _token{0,1}, avoids stack too deep errors
              address _token0 = token0;
              address _token1 = token1;
              require(to != _token0 && to != _token1, 'UniswapV2: INVALID_TO');
              if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
              if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
              if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
              balance0 = IERC20(_token0).balanceOf(address(this));
              balance1 = IERC20(_token1).balanceOf(address(this));
              }
              uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
              uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
              require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');
              { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
              uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
              uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
              require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
              }
      
              _update(balance0, balance1, _reserve0, _reserve1);
              emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
          }
      
          // force balances to match reserves
          function skim(address to) external lock {
              address _token0 = token0; // gas savings
              address _token1 = token1; // gas savings
              _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
              _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
          }
      
          // force reserves to match balances
          function sync() external lock {
              _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);
          }
      }
      
      contract UniswapV2Factory is IUniswapV2Factory {
          address public feeTo;
          address public feeToSetter;
      
          mapping(address => mapping(address => address)) public getPair;
          address[] public allPairs;
      
          event PairCreated(address indexed token0, address indexed token1, address pair, uint);
      
          constructor(address _feeToSetter) public {
              feeToSetter = _feeToSetter;
          }
      
          function allPairsLength() external view returns (uint) {
              return allPairs.length;
          }
      
          function createPair(address tokenA, address tokenB) external returns (address pair) {
              require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
              (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
              require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
              require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
              bytes memory bytecode = type(UniswapV2Pair).creationCode;
              bytes32 salt = keccak256(abi.encodePacked(token0, token1));
              assembly {
                  pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
              }
              IUniswapV2Pair(pair).initialize(token0, token1);
              getPair[token0][token1] = pair;
              getPair[token1][token0] = pair; // populate mapping in the reverse direction
              allPairs.push(pair);
              emit PairCreated(token0, token1, pair, allPairs.length);
          }
      
          function setFeeTo(address _feeTo) external {
              require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
              feeTo = _feeTo;
          }
      
          function setFeeToSetter(address _feeToSetter) external {
              require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
              feeToSetter = _feeToSetter;
          }
      }
      
      // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
      
      library SafeMath {
          function add(uint x, uint y) internal pure returns (uint z) {
              require((z = x + y) >= x, 'ds-math-add-overflow');
          }
      
          function sub(uint x, uint y) internal pure returns (uint z) {
              require((z = x - y) <= x, 'ds-math-sub-underflow');
          }
      
          function mul(uint x, uint y) internal pure returns (uint z) {
              require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
          }
      }
      
      // a library for performing various math operations
      
      library Math {
          function min(uint x, uint y) internal pure returns (uint z) {
              z = x < y ? x : y;
          }
      
          // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
          function sqrt(uint y) internal pure returns (uint z) {
              if (y > 3) {
                  z = y;
                  uint x = y / 2 + 1;
                  while (x < z) {
                      z = x;
                      x = (y / x + x) / 2;
                  }
              } else if (y != 0) {
                  z = 1;
              }
          }
      }
      
      // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
      
      // range: [0, 2**112 - 1]
      // resolution: 1 / 2**112
      
      library UQ112x112 {
          uint224 constant Q112 = 2**112;
      
          // encode a uint112 as a UQ112x112
          function encode(uint112 y) internal pure returns (uint224 z) {
              z = uint224(y) * Q112; // never overflows
          }
      
          // divide a UQ112x112 by a uint112, returning a UQ112x112
          function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
              z = x / uint224(y);
          }
      }

      File 3 of 3: UniswapV2Pair
      // File: contracts/interfaces/IUniswapV2Pair.sol
      
      pragma solidity >=0.5.0;
      
      interface IUniswapV2Pair {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external pure returns (string memory);
          function symbol() external pure returns (string memory);
          function decimals() external pure returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      
          function DOMAIN_SEPARATOR() external view returns (bytes32);
          function PERMIT_TYPEHASH() external pure returns (bytes32);
          function nonces(address owner) external view returns (uint);
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
      
          event Mint(address indexed sender, uint amount0, uint amount1);
          event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
          event Swap(
              address indexed sender,
              uint amount0In,
              uint amount1In,
              uint amount0Out,
              uint amount1Out,
              address indexed to
          );
          event Sync(uint112 reserve0, uint112 reserve1);
      
          function MINIMUM_LIQUIDITY() external pure returns (uint);
          function factory() external view returns (address);
          function token0() external view returns (address);
          function token1() external view returns (address);
          function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
          function price0CumulativeLast() external view returns (uint);
          function price1CumulativeLast() external view returns (uint);
          function kLast() external view returns (uint);
      
          function mint(address to) external returns (uint liquidity);
          function burn(address to) external returns (uint amount0, uint amount1);
          function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
          function skim(address to) external;
          function sync() external;
      
          function initialize(address, address) external;
      }
      
      // File: contracts/interfaces/IUniswapV2ERC20.sol
      
      pragma solidity >=0.5.0;
      
      interface IUniswapV2ERC20 {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external pure returns (string memory);
          function symbol() external pure returns (string memory);
          function decimals() external pure returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      
          function DOMAIN_SEPARATOR() external view returns (bytes32);
          function PERMIT_TYPEHASH() external pure returns (bytes32);
          function nonces(address owner) external view returns (uint);
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
      }
      
      // File: contracts/libraries/SafeMath.sol
      
      pragma solidity =0.5.16;
      
      // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
      
      library SafeMath {
          function add(uint x, uint y) internal pure returns (uint z) {
              require((z = x + y) >= x, 'ds-math-add-overflow');
          }
      
          function sub(uint x, uint y) internal pure returns (uint z) {
              require((z = x - y) <= x, 'ds-math-sub-underflow');
          }
      
          function mul(uint x, uint y) internal pure returns (uint z) {
              require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
          }
      }
      
      // File: contracts/UniswapV2ERC20.sol
      
      pragma solidity =0.5.16;
      
      
      
      contract UniswapV2ERC20 is IUniswapV2ERC20 {
          using SafeMath for uint;
      
          string public constant name = 'Uniswap V2';
          string public constant symbol = 'UNI-V2';
          uint8 public constant decimals = 18;
          uint  public totalSupply;
          mapping(address => uint) public balanceOf;
          mapping(address => mapping(address => uint)) public allowance;
      
          bytes32 public DOMAIN_SEPARATOR;
          // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
          bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
          mapping(address => uint) public nonces;
      
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          constructor() public {
              uint chainId;
              assembly {
                  chainId := chainid
              }
              DOMAIN_SEPARATOR = keccak256(
                  abi.encode(
                      keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                      keccak256(bytes(name)),
                      keccak256(bytes('1')),
                      chainId,
                      address(this)
                  )
              );
          }
      
          function _mint(address to, uint value) internal {
              totalSupply = totalSupply.add(value);
              balanceOf[to] = balanceOf[to].add(value);
              emit Transfer(address(0), to, value);
          }
      
          function _burn(address from, uint value) internal {
              balanceOf[from] = balanceOf[from].sub(value);
              totalSupply = totalSupply.sub(value);
              emit Transfer(from, address(0), value);
          }
      
          function _approve(address owner, address spender, uint value) private {
              allowance[owner][spender] = value;
              emit Approval(owner, spender, value);
          }
      
          function _transfer(address from, address to, uint value) private {
              balanceOf[from] = balanceOf[from].sub(value);
              balanceOf[to] = balanceOf[to].add(value);
              emit Transfer(from, to, value);
          }
      
          function approve(address spender, uint value) external returns (bool) {
              _approve(msg.sender, spender, value);
              return true;
          }
      
          function transfer(address to, uint value) external returns (bool) {
              _transfer(msg.sender, to, value);
              return true;
          }
      
          function transferFrom(address from, address to, uint value) external returns (bool) {
              if (allowance[from][msg.sender] != uint(-1)) {
                  allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
              }
              _transfer(from, to, value);
              return true;
          }
      
          function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
              require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
              bytes32 digest = keccak256(
                  abi.encodePacked(
                      '\x19\x01',
                      DOMAIN_SEPARATOR,
                      keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                  )
              );
              address recoveredAddress = ecrecover(digest, v, r, s);
              require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
              _approve(owner, spender, value);
          }
      }
      
      // File: contracts/libraries/Math.sol
      
      pragma solidity =0.5.16;
      
      // a library for performing various math operations
      
      library Math {
          function min(uint x, uint y) internal pure returns (uint z) {
              z = x < y ? x : y;
          }
      
          // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
          function sqrt(uint y) internal pure returns (uint z) {
              if (y > 3) {
                  z = y;
                  uint x = y / 2 + 1;
                  while (x < z) {
                      z = x;
                      x = (y / x + x) / 2;
                  }
              } else if (y != 0) {
                  z = 1;
              }
          }
      }
      
      // File: contracts/libraries/UQ112x112.sol
      
      pragma solidity =0.5.16;
      
      // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
      
      // range: [0, 2**112 - 1]
      // resolution: 1 / 2**112
      
      library UQ112x112 {
          uint224 constant Q112 = 2**112;
      
          // encode a uint112 as a UQ112x112
          function encode(uint112 y) internal pure returns (uint224 z) {
              z = uint224(y) * Q112; // never overflows
          }
      
          // divide a UQ112x112 by a uint112, returning a UQ112x112
          function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
              z = x / uint224(y);
          }
      }
      
      // File: contracts/interfaces/IERC20.sol
      
      pragma solidity >=0.5.0;
      
      interface IERC20 {
          event Approval(address indexed owner, address indexed spender, uint value);
          event Transfer(address indexed from, address indexed to, uint value);
      
          function name() external view returns (string memory);
          function symbol() external view returns (string memory);
          function decimals() external view returns (uint8);
          function totalSupply() external view returns (uint);
          function balanceOf(address owner) external view returns (uint);
          function allowance(address owner, address spender) external view returns (uint);
      
          function approve(address spender, uint value) external returns (bool);
          function transfer(address to, uint value) external returns (bool);
          function transferFrom(address from, address to, uint value) external returns (bool);
      }
      
      // File: contracts/interfaces/IUniswapV2Factory.sol
      
      pragma solidity >=0.5.0;
      
      interface IUniswapV2Factory {
          event PairCreated(address indexed token0, address indexed token1, address pair, uint);
      
          function feeTo() external view returns (address);
          function feeToSetter() external view returns (address);
      
          function getPair(address tokenA, address tokenB) external view returns (address pair);
          function allPairs(uint) external view returns (address pair);
          function allPairsLength() external view returns (uint);
      
          function createPair(address tokenA, address tokenB) external returns (address pair);
      
          function setFeeTo(address) external;
          function setFeeToSetter(address) external;
      }
      
      // File: contracts/interfaces/IUniswapV2Callee.sol
      
      pragma solidity >=0.5.0;
      
      interface IUniswapV2Callee {
          function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
      }
      
      // File: contracts/UniswapV2Pair.sol
      
      pragma solidity =0.5.16;
      
      
      
      
      
      
      
      
      contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {
          using SafeMath  for uint;
          using UQ112x112 for uint224;
      
          uint public constant MINIMUM_LIQUIDITY = 10**3;
          bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
      
          address public factory;
          address public token0;
          address public token1;
      
          uint112 private reserve0;           // uses single storage slot, accessible via getReserves
          uint112 private reserve1;           // uses single storage slot, accessible via getReserves
          uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves
      
          uint public price0CumulativeLast;
          uint public price1CumulativeLast;
          uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
      
          uint private unlocked = 1;
          modifier lock() {
              require(unlocked == 1, 'UniswapV2: LOCKED');
              unlocked = 0;
              _;
              unlocked = 1;
          }
      
          function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
              _reserve0 = reserve0;
              _reserve1 = reserve1;
              _blockTimestampLast = blockTimestampLast;
          }
      
          function _safeTransfer(address token, address to, uint value) private {
              (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
              require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
          }
      
          event Mint(address indexed sender, uint amount0, uint amount1);
          event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
          event Swap(
              address indexed sender,
              uint amount0In,
              uint amount1In,
              uint amount0Out,
              uint amount1Out,
              address indexed to
          );
          event Sync(uint112 reserve0, uint112 reserve1);
      
          constructor() public {
              factory = msg.sender;
          }
      
          // called once by the factory at time of deployment
          function initialize(address _token0, address _token1) external {
              require(msg.sender == factory, 'UniswapV2: FORBIDDEN'); // sufficient check
              token0 = _token0;
              token1 = _token1;
          }
      
          // update reserves and, on the first call per block, price accumulators
          function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
              require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'UniswapV2: OVERFLOW');
              uint32 blockTimestamp = uint32(block.timestamp % 2**32);
              uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
              if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
                  // * never overflows, and + overflow is desired
                  price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
                  price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
              }
              reserve0 = uint112(balance0);
              reserve1 = uint112(balance1);
              blockTimestampLast = blockTimestamp;
              emit Sync(reserve0, reserve1);
          }
      
          // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
          function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
              address feeTo = IUniswapV2Factory(factory).feeTo();
              feeOn = feeTo != address(0);
              uint _kLast = kLast; // gas savings
              if (feeOn) {
                  if (_kLast != 0) {
                      uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
                      uint rootKLast = Math.sqrt(_kLast);
                      if (rootK > rootKLast) {
                          uint numerator = totalSupply.mul(rootK.sub(rootKLast));
                          uint denominator = rootK.mul(5).add(rootKLast);
                          uint liquidity = numerator / denominator;
                          if (liquidity > 0) _mint(feeTo, liquidity);
                      }
                  }
              } else if (_kLast != 0) {
                  kLast = 0;
              }
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function mint(address to) external lock returns (uint liquidity) {
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              uint balance0 = IERC20(token0).balanceOf(address(this));
              uint balance1 = IERC20(token1).balanceOf(address(this));
              uint amount0 = balance0.sub(_reserve0);
              uint amount1 = balance1.sub(_reserve1);
      
              bool feeOn = _mintFee(_reserve0, _reserve1);
              uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
              if (_totalSupply == 0) {
                  liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
                 _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
              } else {
                  liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
              }
              require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED');
              _mint(to, liquidity);
      
              _update(balance0, balance1, _reserve0, _reserve1);
              if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
              emit Mint(msg.sender, amount0, amount1);
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function burn(address to) external lock returns (uint amount0, uint amount1) {
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              address _token0 = token0;                                // gas savings
              address _token1 = token1;                                // gas savings
              uint balance0 = IERC20(_token0).balanceOf(address(this));
              uint balance1 = IERC20(_token1).balanceOf(address(this));
              uint liquidity = balanceOf[address(this)];
      
              bool feeOn = _mintFee(_reserve0, _reserve1);
              uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
              amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
              amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
              require(amount0 > 0 && amount1 > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED');
              _burn(address(this), liquidity);
              _safeTransfer(_token0, to, amount0);
              _safeTransfer(_token1, to, amount1);
              balance0 = IERC20(_token0).balanceOf(address(this));
              balance1 = IERC20(_token1).balanceOf(address(this));
      
              _update(balance0, balance1, _reserve0, _reserve1);
              if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
              emit Burn(msg.sender, amount0, amount1, to);
          }
      
          // this low-level function should be called from a contract which performs important safety checks
          function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
              require(amount0Out > 0 || amount1Out > 0, 'UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT');
              (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
              require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY');
      
              uint balance0;
              uint balance1;
              { // scope for _token{0,1}, avoids stack too deep errors
              address _token0 = token0;
              address _token1 = token1;
              require(to != _token0 && to != _token1, 'UniswapV2: INVALID_TO');
              if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
              if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
              if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
              balance0 = IERC20(_token0).balanceOf(address(this));
              balance1 = IERC20(_token1).balanceOf(address(this));
              }
              uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
              uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
              require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');
              { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
              uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
              uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
              require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
              }
      
              _update(balance0, balance1, _reserve0, _reserve1);
              emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
          }
      
          // force balances to match reserves
          function skim(address to) external lock {
              address _token0 = token0; // gas savings
              address _token1 = token1; // gas savings
              _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
              _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
          }
      
          // force reserves to match balances
          function sync() external lock {
              _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);
          }
      }