ETH Price: $2,517.87 (-0.79%)

Transaction Decoder

Block:
15903261 at Nov-05-2022 10:36:35 AM +UTC
Transaction Fee:
0.036977376 ETH $93.10
Gas Used:
3,081,448 Gas / 12 Gwei

Emitted Events:

207 Store.OwnershipTransferred( previousOwner=0x00000000...000000000, newOwner=[Sender] 0xaa22e273d76c2ddd6c9790e553900a2456fb29fa )

Account State Difference:

  Address   Before After State Difference Code
0x6579dF8f...5A438f620
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 21147390627833666485919406332405343333437401876767018267732540705284449121502883448434197986712773606905403162405603732411673048365004756175494964803433817528121846483882493463302439851683496895485514597607182838339050881182884051642874552894793533585938299077135087892460413939460222045938818473660984453034180637639657595192053310075777466924536036261861392919146675547401853778849526460556155246602194924640841157795981012244645568395830402794982189671953824134423985700675603217678479660063640742618049056133057690982908902402926756943390982586364328053369205776250189085419246993940595085847953467793978239396579229044988199385916555509675862411605556101786205567124704296601647410618570243578074504086240405072191906499189018180719122725467374235323212869585552598395446958730442384611688184054317558494941482259436476234863826758773201306436368567602567749429910599969512035486178024582667577266436896135083854144327762410621437262312602965869253589930846116625786248737202168866099870682378477126428906335508138688083998424136893926442053643033420182959023142677698458509329796972712354244284798161721764390008536788683398266206834594374271222422154957450384912618717871330053818877468480347002856181806487228816156384814546210770466752268403813950241240266652981292745212830201719541220982125964324894799882508278670651251872587314975990064983295542997086049907130672704035544225362653831854295664717900889580185743970627581896254268310478073320507758627452470591298252395519864671390987518467169352480291341708865346062364925697620097042138136112231226640582448825505989065128605453705841819158945374516413116007394381671320161155022190290520261316514970095363740063579208564202935621974946008019264174655013016513435620181779679570264904652826198086281694645349086030670807456237072356441154967261192633350642372257228896795228579438443009614035772621243471693292307380970397945461019793353253566302609731931391035205321346571762365033671858727459490848873330575672816589008930894981952539722130979819590197353210276832797693759183376904217216286395456319912366582603396592088864359784396507781888796943792103572134763063725450603202931589698121808716752045293534056633926068790000960691775739272121007734866285791576924082260953766930679226393634502073311788972332539368789149499246724277856075310507413849236354037276535105725123929319024835889273283209748477981991856866583902525825619569192743234127705125385225765651700823760828269591737413667942035742107340135905316070130567872798737345526090212075323933134257008738831330135777837504145640057262497402197888336976108242615527360879885708770727395408708815751886362374174606774324259530532225942626927479167816397960883287372508902978637054298068205756656156318206374629682485344119945818139146794661491197949580464702001978365185585217815017238638572387160521825736916660258918419482346463164411778760238359084309672033049548049285486296347260654049623163380173453143689781312735642141201263473430178925704647535853292500275246472459538064379197318702655412938101125171898607303518427997143317759997093154728580628225301830406781910998201400963708997273502060894494879240946888079586038382755742642100355110597723074974369488266151783183908699462933557190877602532014709563183357952753798222963154661739954535927117723878046309727086971546811429194831304837442154520430444547668727907135484777506159032821817917969252283785284391161406335642316859827968584653409398212582898167399300667280995160116151267161552213091752068424553438718040896950421207722681080420289983276925181927369900153656822309146348464843829525840175566903922095632874242507085073661569951446778966340794579459583389590602025729608446911409050620052252664458710799434966742754315164209567209308654622293290995942684814706297606116148764274167815385258246146410910891291105377113228100135513618711937776939243384213103765395392495562427510816934867416500136410872206682918764551677308997309246690479008953544728202708139271551515955736991004941152718163648456142586474071444474595909824270698736828572749052444129811467565805068708169381066789913908039951229647866558612806754153388861867454468612314817054638634952575615167880592745753916544559964937763320991131396083409981884254747858458997622534944745906344411559968108121217681808330107610149127672162983269900103953723708881861392450970699691423241597259216975638991537032250784740458702378160097526859226183597043720142083469489603430005483833826582894955308087572182856252302700378426128644953048972038144899863730336076301819210958993457444972203113784533052347771648907676656522780685673704547893534369944062785961721450663959751670428191265900861227446964308968470756268320758973839432234293692987666217368088192032531531713579847846422326884428609498075455157657323867114161891149012159071752199316069268492853633438345302545232687729997117214164506616236337004063044235170583976225878353504358670268417027909117360526184755173091263442256462973757819211087772217829175744082484582194015438595026402343677858002677814188324918953058680880592589201433553396616115722856397809060244675047274556515675397373102454479765558752353337331594803368437673471647346595224613495343201070069142095752347951038595110024767881103239679653643508730435236938892248082152000813025572533943562346743687741547590819610858359827464336123640765605693252489928773765906605106072373626366607264000832347140528544649345974815031667393827600206864073709003505380666983122741907021116422420975814922041510283413596653686303794875957375345387969949268092550210244281908184068785685411392773720012850099007605764081784657009812954852337132609001485455097278445906157514020726416843486646636673511820061885757200240608907636252977466544939955758346268015240893631675519892254792402119841661351826100453842818355792072671355881585639597005744898879398873097766038473446976609333070420301532765937947204341725811226383393198224157203434953290829196379389772339006819362090462104079842499134054826792735836842074985643165139460568005821229831064933118625383290180249375834908206457467262445312876862148226395432871327481342424963996049886198490446167568247148446213906443756367799529459782566486504526304817479439514853694662035230866766302081588537851237617817951555745746052409101031189618014455075852233348929151351078503557471502475024023555018940489618781029900971491508226337391826345680938806709331596605140887715918969975052965104420113227336409166124817128328531569630063599253721282543826464481731179111009357123159539149376577605786725392992716253355135327887602014375826907034521080463697849749523100358163373719239796369658969279248947091180727626720622054772869372362257008130503584459733692559555612825949832837890480594789936826698791401708387216934617494176686370071237189666011761872382582394532219789421407949370767488083695670402159123317147774256651033190334978753415665826448830113964367044977791194772452730537888373156439672591590743347756434372433470055840577068691339082030749996983543249383221178916145971153691258290313094046761859636794280865810280263926128882509394064838382038187670841154329288339885410939965814575563569555255891005373278333851653239443898982612593923372935961640927261956345903860822826439801050973150126184810450370932536611775359726186841845601042008205531569545937508584846747087746122806364557102028651136517598805396311417075822572393972388286411478379249336475781727004486438545549427273129377440180131668524122605103975781108942605339709610104365647943545641426503220730514530901462010087064713828249923831207220615320099609689779503287460813836180777926526410056444318037913688071370171881587424470644498743003944225174964427510203041071271516519333658596161433378063262477344408768303891024167283481935637052139429665932811007165411180340859238707570676648799238171039832093153117488722696846308310278673241976889059712883879155549513160740830459485941574654329689885306396978677883711551361722696207394523980984730902321166525940107465705865614042664658614862832422489381214248756758982544575959321021705683218295108795337866471294809921565492794342447172705912237174495360500399528652130091799022516009150871839714094750969460973232419955950272679465195851234340868343791143134978868017445926961657820235690727008735050917196086151659344875253972685524251943030987317564925055312144650982936091670453222714685935694562253768744933731275421622874300427005589021992399559001838349506501197184809991315644728800436518331411575504710782409374961454332598053582524544269818612458418278602928066075775528235726972794475183699452881525481382491605002067620753678920448386240639687083057687906390415514403654583686761434873338773407346887231421212286459870586669983006575026868575213205704039673125977693841143180151393833039341100783932904374733941707105232756881672158132190758336465226092363290654188785766892596302953695788264187744548788872290729030043976210996363528275455570474878181813125656189782038188022761409538881778344452497582168343743068437740721304494348615844101494530663938514442571055816620426373996939654801219660961047550763125487991240536025827030675566167450781967765735077916720645637407888554315636482774476147828589745268786350079024287961710969838644851720253094967882923183166084220487418169803784945425830864734484805232653256452494503256658683660514626813129618296967508731934618181016356134576252491668015595738889690514790081870852537858489650085589828852417483240080110709539792486347494008745011278351047051910104314915696409355702115833007904833514505592740038299597096802457544169699947351503948873002695757745315155441223925507964978384170810613045117440124798433628741650236573494736197304457105779854567126212120884429297194147262854400370787315963786394375900873728411909249268075811661025876637543934952308644523753321976934037964894030920500398272870221880123202758918139652285893868422306260770771499198410478924290461446875341040747285637154938961917560528231084776169407189643745211702834771740022998443998803234333949887189781461380529977522198623248650112548389225313642506305720837202740159810392459671224833150863709185753260399033454163184471675905734910949757446357030390055922404341345125056802369757243875566224732568707620973133426441836565074363300029739898741455944700738209036328895470319569753050258943905150266591259730702246645811702465682741199478448242592350682261787207365430225597599999827268289211053088862466468892270153392420399370479610311108990306110525646180803726394728128718492297848807599505333283972519031959539972693660014679190842506995510194462040934268152848656974155810474317214474883415694115581992549504897944880978013433487096525707508918731999420282850138733786106506861867546204993129147839348936200432459688539038544512505277933341419198682880322757727385855013316497885704923163444509144940327426462517099642454050488830240135143113407610136668667669841598662539362082170674443011916651206351302228125951157148807390079594013330544398989167107050333447592891331946730247167040097272571182471296174635732546474809062443790016245708197591709263044157042986472930706234752594229890509839904496202010984213758414269654146514785002290930869181885298580131237967648633321499095029803117910063874828708370594611196778985560191853302704596960098274003995405698861319812634188645408476921081201452376998562302713099029016721438916291872510243638991268523599354844611363644849885150769459069934604098367011705583034029108054435506704725715697618748718181708742449057333035681286734653625115806107605184165872617604818820244864442873285547650659065599444120134789520471969745137709043049988985255070745578226888070191373981362528104231170233786669196938928962120830801046210545296804404259532177966982264708337463280656342526612703226227693095839217302392500314888949949375604904080654431274840577251335224147448707417184485132494059515779503559440491619557350774012562302563424376373288602032431943114495334080212052114212188945481661289676935356808227220985989220378322650824354169868000745657559929970998680829142406747418014156870344515548182038413137783178690076910014422420667760047640728226160626571131149746713198750962194012482365409813179515731896449130247223341429682577003897686554161785552234336787224300810784753090227529547032505450027845199528751641304599327966021725366430742095071560969716033614487854666348624007740679865286418464669894495821941972548462099383773686600499631529631360893258324231911549863307703532724284153586130579780516597494777912543850248615968773379002307384170224039863212724266647226078070423108426020540777294821964488918623946933234805590518454055698765198567475627195771465028070686930311579652477081421331923729973665918156353844936208706653048904227418752820483937707788715550686837580383103359664444232894939149820265605443423158208270595879205447253946950502958381428425741002562369036870054137740417013768503956021559233180855257766016550656353125590633958694093686581484609375825882690866363121629658026968337944016386682829561171374487586213125647436131310483067720096746827682794382316974252978529010749543606697523936627898519465559541507591092622460332858885828341158683086996519719784026443940270066904047102957727177600632141100668307496831794299962350810150506545248944505336669003019211259335251664975533150410865941129329747528646173893113571475401563937252775077339532420343120474553787610629456434946924039679280713977267476946241573589664528704002810400346661406056774068631600387965250711896623077320904069424047899021233879580212114721834545840325241166687274513589690974359070840355449113623644584310679358640443796857540250039641697114180330059237373292678223561950491354464153083644512142852697648187598402243017420345843658083493577612716576395125701226695388597216909079901174011056575700638639278557980401947024287954403702100667190395200445064758143863727811760725108067192838908829598820059139151011674431754488595347312026371581366715548284659010461487643527386160839798579580246043373763883399436817581020660375524763389877920057726884347643177316653744645994225828092166927482438254108950065887276730618876199362857218465596825836707208774519455667539310192221136649013115984419761217442819857207680864344384403467817237941083308085750460598936235726301829723015357348079709541102383344498782757642107911776178158654368342994916115363790531325157472418231216865631865595787078480138616143925449462748764348125069318002295339106414980362027880280918881440769151906490404303474970243107044332348548186182948364698146111860254945865161310517728127542127553367964072084671535517719085336217290110315070371942056591685751358081318055371620984987277744769611556617244613161623035436517887544137915996753530154260668267674067054745002771902386209716159869931542532115582010683617062336555016876927505556272846583852456698864026435304147863623533447346833179305038047295628847635778678972112837803356850500059657225745343979932569320128659820446792029283028307259870177566006708291768499065534423941573584724747988617874960058162427088156268347067001666684360757303338376007043967222546447386455324975578943687611197423896380404648052016900605149746579734842303506961261783828329285108714707190863107987081140890634060084582266460329840251250519674741257859907224703773857465836026892163662691938055836487757374330349130020625241509814863979489580408316023369755917558002174917762000490501396078748264776367596996564360138908467879541722731695999408528669583343390926521114174784854506312077205693568464420332912950547136436913048961718461284366201896842211215503028505687651494360304388344684230077199583442666846213013663310170100985786465327143761919218535761901403626329676912173120931540390704418908186640308861760717314549702647073401680627591753520888493801754644064988279712029541625460892849336086794570256013198497223904459426253505426618999689047234781649212988006075204196866257476851647782627848757197449661210549327664680547621306810461142447328583695091456536036241526822761589408562222671262270678112001676025573282550825504396797814107985231706460750121535471464298659274201107985088377215063810316676844600318317910914949490529398685929241102940395364866035469790925642568870569468154433744837840220219132003862160523031628142808895125338100675256204799469694238970872814054528682734592994401503127271651257516852641903423903282977676218425523988332264243635618646097828693096234293147421645673162570427906143230189397706084512995156041784922681842812892605606786162117229485089466029098701964144012228853327397226867321651582269154981472840024782808151264688905597785165449283590611688398708455045186477575308895951195208738682879786153971239625860079146236127289846441455301806407224261228494656290564466046764537981085025426237603739305312801451097600458240908484249439843956479807316477471782365800527428553950208666971940103655697520966547752051239379729528953894298725727800355372329080579407459006493814984419422865264904454366721207617716336788514033978296021563962080350849310536634315783390331722880154782690856932401142291901888856105468455838000192634767286561306324227264509985116726167826186654006653556771978522913593457519869929306301606786423129670107561741926521644854924671954135377482532723077293721195717548992873456732151150954287411696053567053180581835854092324612759413676353342292695752950990586250189450445498004911263414705373277199155562290592806537795132100127404745740782449770947957714439743723254922798335267883573815941445118700385413123254242412293892704575837520265332759683411567802313272463956886494447295662336614597257913872814094856616913953292056803608966408765022621771458493034723073118077623833906134923542546273886890394200715091829708477309492586806110343178064830550354657540751995008846338449761675550495659589067508775366671874809415398811702702952871270528591777714401784919810896067702564247040423129973553496259367477108474464439968276286797883385477949840327289753144532660822230661992081159774614054086064466293172960943899288374185235518602549375566754761633294843472744758759579647733034365600675824605176881185471629155428214550051554947034994824354191246434827007919826464917552822696144542558867118128474283242524852871852168676923869997793650186955405623637511574166100391315917269441309895958070165251033078240690086262843508441626427266604065603288105853646065088360866551818743808845705413659306593400067107407533615306297480784577113890354905186143540679614602008666089443810036960467972584766190485371422742908625445582981687527671878220312397486680496382403826688942044961401402189247496581406693959030714957781302416036583487213096977520463832888397191460604807309684478541508200600855234223931067175341179811428011089176935441712829021185567635068562385256214342327787979476980335332286937618952307950213474128502002151774223459128024552167604769640550181226084777685351342792604285114038316088996006803390060671280938958475620989635306217428047297709524671256647640690355235268564594145523732060854709000324436255542168311373965623346247501725097792170072666856234648596766349813561751284980574621433990932569277920939100427507313534292992315320844214698089767909708930307792974543371335032005097962533960862721622490092239695041943644207713532571032538908163031166306906094074736539569907986288837197683925932188026534561092878824111706467649128707153979042946887766731530107848311360179806198182229481656535463136831373155031829288045245855998591821736915093783572943488931058541284589371138827305953340625701017593560187355938698826324208855109615774973845986271200218751749708531519334405959406864186321858972104942956118008721580719868985009234111321925658230035622541680775129840350959998160681764295618734120641693716682169369186182532470922918722702215750715633035090268030039707062560667906094863833291436112504272732111517075253801478462811570327293373290100844743265781039557768282766528774243917571279481251993984098673680489715133067746577574641478164550533935580718182510950111412764882404043061613257296284942847161472142074387285854294836188751886342296043299927898951284434160575710841580869516658467380458173412587272894208297940228681414589020604750303193753500865923468686533791528186301470509017045864483555828607578040902046566433353556396942639290866892280764551931354859544768934294907027530682211566265413339568631477465858464937514970134596674461368213088598624148614742226172001249946938360144168963394381752317165494060097989950908990485783268084913041560852257002877549545809486289287188555334360383284881286888562354553999715123985085588846655857387246277601997556374520764324598629679275089886086824453251670708829623340708619048927510399331254939572409232311178136362524704147434749248155101257043830861967083714404002397493854791588569525809299293357637690108976015748450254526145436838876405326685847642713372264461346157500695526207241441300336561546031335031946868823025051580212805890981140206822025350115524727202421451254622912159427746046367338841474273942413544180025523957697834817750961287382914255754125532007717714377055722965642641235763937572179512879343245976858986575900603813707828596878285227365708505357869266641521882760498331786533728525979538622575661373840995932431738964368226560111198253630389242016187490461568518521353453705239001975098775047375415344105290122517757103562216514909538728338295516129120052934567126419851898310525459138009284337611064770797645507897473788695451272577896960433180651479291026480963360715020141164909322512625407528469873770980687211066188443324400330243324875476380962948495493323367565888674701546953913539269534241847822276606467375133523778841833924491957745106042559267192609628669597409927176811924396582238223944132739025974680676092840138833020220676337216431475515183655649947897764258999984970149757765514029047896524838933103630744276544380758048423673199092173493042604823555626613686375882708574902741201589577269217974527855001074177994873589633268581600425897066076292443865496500724241380459925645373534496208303992868934664930552888633697046304728162126419772652940866108607954213902784596174258358596813568715636985000014831004219708182303711216394375777414248102942102051872846498409853133547075898337859050581834590828025622705011813842322076245281428142487471505261650625548824087308611932864882965482774735101711411900058672721662778345490694185206563147950432996281684667964609275164035877460898897280042641296943422824717380051144954320807929282505544273487039901819392619225408774397935913328540737225508576772894074158019562043531848830092110821367870369616539685225924818581467004030526282562218806352049897564567900556094815133793263352700086789103963482632639357569971305972052875387464090631654413338433986831997828614406823467505960640732929867730809590940982423830603658306401695768871521120578289952782026570738328181914525387516098947139601623712058013806218033437812207675186839166211366609414271673165409793263546985267641825860470806689295008155169495179483669770928091011386188877841330584859422991676422975861094200970202728445854811517013304986060005439271513563348815127974368816626397518337723552994664126398164061539414612928208421904817242010988882056310340139426271136198374165054934809991741061798303411776335197196609064019899788697880567030046979395885476518942513025538581839495748317637345471020699296989337820902145999470146628273083094133913974931701613198086705748549198667376862015762655859411825461420752041262374582694154624773289703222937421179130502040191142363445427719212827641149001981638633649116737689967437458949412646829972189367083297128290695005746286106573463534619174974187227864742803428179328076674974509627096655137100530685281260532451725385610400204609650982614142589545503201289419737345764747372331625563713656272107682641554900890738624297829041026769289853875386080070126189358880625561410594041820205273189929291864845432612988444010846915108816914175476037177782539510667240545987945476563559699458202275358644305294331446198473404614114317403049875880575514629050592429217632815829009999631387707836384171092638375141394197441538627400673500126250471612201669443916416433238899012941472377218853460346171412358525097406445027563636454490684687518845218897499566087622774838522162616145347844857541737928138854908324960932513550398747181968862731399218431743976856801962069144891592581475754167252834062036121352849326053541330491274160544718934206853639681649741466908654494360748341597527099613650305166373115526038535781783833133440571143170724824125329051685172393415396528037777959914662810997292404641822845619499110449166144600604224445854275571587597997730993350361073862802306822970199305098198019766672235394659569685789021507517242341150449853778179803180670445909167841015880542341606319461256165716937481618891835412164154239629688900090070248247923890107673455787553135898315132046524194622050505970240617832591534034378533535810713731083786173314008552201998716475114039199143956553618478182436379578789273244652084855355553831210314493040337735325627398007162605452061069811395658294688934051129870861846961004889669033141317219494724920339905602455245799940900314539066821914586712379139041592484135987328734700146004553534104436958689667372783406864662253998722239835876786288203593819713724027948293511925896890176811855071886051969992309935926453608067583839379523868784346119053286269452551458894714578153173761611953961507399849051378179988116841134140848836365464655108923702310213361635398681631430502865255903292890763617484805098177424625080536115550008813480826042588557109429314529636635980482480334339511299638527248802352570798068699246115207202823673540386899371579342511629940569479102926979889040558895083454144071152579972000453479130838773012134627738755322193336595647510759794859435025731683751154781647538087724407528310137034367276348971170076622046164159950763203803121199088756025125014423982767727573219863675000572349144813442894456438308278718849557964346162945898898315362996288404351929176713920716109078651771088103827244346107493343578829343561017728854214574428408025679878361694050937781707273562989249062455928559128271485906959926172100916685042041774437270181181785824802753389162584675613554068505618605628629150071563273480901872041098893276189156863529517888587314185220909419348585000158142899385690525047353142038517525813314281189230584865553835917467128423618739172929849187314094837193276425032806338346398901614903742362936038276837420114155672183279637627822866773311887919107503365317767807941292083780150297301164512874981526184129111848002880232672126580977211271502462985986286922149907058715068473729567690459621850521482826746304906515646875331995227538946628261558792267628717059799016200976554656641980017553902502556176142280332703928017628135110352911942437984206670695661092817557605574844014111556188135266485765057080313346877540381955700211715634776011499631161855235903051006167512710712563737948925410875044012535171316392923417574285967826402613299204399434271410046666009228682909517051349554968331698819143215762964863777779565743853041574183208960525507724456537788650965670763624836715076605181453753352129831492352288451159962456080149402557403606339736142006054450515980252136129814886121494126244619510873586388079864751111774039076915873866936858104045679063305428935410159722113538799878872173297648862194869223839861436327507636140455407938223753376591078899034216237941486186888349077607055498682395697972914669629667726851756715915899185062113452335774310268136120703204425627275349311231751525656469371161356497908517983803016683235887615738348768279612819154435554205460941293647902096453732079456946663909882501779335334319898521787497956841501682972325027052322675576332758342701718921963584987775582724738248768829832402741023825085291192244830450176718383606119527048315972331101530145336719764105004053258887464048065040537044913534872187948472119548678337779535948688378549551945917191817343572236541485167435587114310267658825732525374972723063746356066630930843131051583044764824854566272723015669506834837672773656871293443164810459589077497499838149022646788250316333680640601456121581163314487220155383154638614521026130290953911709035413776597878542043512490191085272165950536608211434783846633029895691442668196446342016565552898067595036099771492362784145237022724848416500925967067443785287122710603359199562615187802191520727788268426175256673936082371462467096498479793119989857152910348840682789995628796796237187042999812184652598052337418315820191209476049736263418377322855382873920137667418325251405893310082774668796073992546463049439617970821800123594469028379616915880215930646450210953630821010394843780106137200360048640816721951578053727870054024032271326757922421352810858752650278588284674711992708015615342893336686808018216280372355484102903478189011670518348712067793935274822240757545399548446081046812756789514532691926095331512613340023875664242403273838875667438679192187238373692312367507543299934631131382465875313466262228391034681042823853327737443490357926115492843824580918293775020389556072408565409600244375457382894253091465396727818727752690632063122182171718694885357685952505482935350653023271278624852848036806782855078379226960975848313980546737790932583150081729207732167469078654352454068134075207800674599450191552776421794166206940150604654782548267717602541188217847354257171269378583229874825982232690681828866368939035526528901116387179099754282593363969317392433532512813117257142786290569614131943676628147934149947252671389623124596540201045691493046250751170778651948016959524423069274780586011819645715854738488236334164060681992538567092694213048724972407602281831610521065796068588916364324063124564814077047867600215338453186950997814675381481515968436774663183300794315915547351660617833361956726994408388225915626291832962807188719781058197141372109065532278470089295691512318600012519280671352332556853088071175754778986575373509500151444546159241232487334078838172009077416142241224665368535553028493941698810736231143152820792968753210739002130185253042839319996879732812930822845014885639243703945993275721887048954646755450505302297940344110014312767740979993164456913334819667653239615739445755553926632946332494459011026201062173805698239043260902259617371423689392716539468558164303248094229106902820411145083281999093617587039425211766330406606564927676034728037255910250512575201928471160794832816555791997381384368573944261487970746079974465660408930506448705940246074292214185342583739719523949485909921438535379725269349524520993755482676109080431215607839852899462584909197788370331377417541607822687830443748037642786724374623148675104680501523179868071654013894601934572290676466260571816841041732416968404321100948704207823577246334159853497887448648347495703136905938121436148842509330825480822351849653972997461289340229913364270000579230939257936245090107736037238087192188256241193598495781723930433373018225254833348974772507936856721250451301475819821794360674276652430315806896899810304215042888772590000546785278810935464334377051092119330506582784544641237622136592667405765412061322504200905942902896817582129728421897044800653343900000514046863468539568641150145330662245739011028090483118770978231355347741969540701888990967276603300411901571411013414049370746012785436572759489255610563049275134572480956350851934921088639874202801416248870814842616294311895210753905623491680898438461128441150069448563586393097753430482862951324098789605722981707700722140622394780438046625966698095451902439026721318245625976719217193267352855348640041175917142345030014816607956461683419048225280763719068217236024944920586882885064708449157774100721421710924267447726769882079424680884081884843596132680200992344437599107501152577118655960253536533265418535819604107180380358274003507427516694016598128142918395084111437475388267231708080351798162303310826884480442535898120077723667598766955067121981549105485668820484789401065054951496737844111373895331758167258967500098548723901102003064528515839474897995372190249577237889494149005622711778305116207898520147628407639097332412776459019018371401418934634087439961773690396772699852497713157205755993164553030042701722489733704456363179113193044376720250306752683170906095812331869440217499107614208595621949982348714201805053162925418564459704634437255187633094397951659861718587493835233751348219627471904542375922636720311603451288216368749287566931384451551203231039710858482481331073251349797787036796418736390325803866468517204884982389785695662234106650440054698129288856945753514757326693212875553355363388899295884329966042666738215874655551987399112757049426542086189819522510702288879324436907631279054131869427182256294266418745003111972034309338440232769743745617214824903155931336516505667946476446370784633262502363058588473111700348331220531274053737418106542586206469399164922016026139730935885012439058909058813343948502981772343215892543509286780086277154951794829189244399182682235212121635497223025952365605484882111307232562885501269608560944326413308734003080429842095645006202752745453370277621634791320729823669320113264937375522219402233708595
(builder0x69)
2.278800668655404509 Eth2.279298986368398733 Eth0.000498317712994224
0xaA22E273...456fb29Fa
4 Eth
Nonce: 0
3.963022624 Eth
Nonce: 1
0.036977376

Execution Trace

Store.60806040( )
// Neptune Mutual Protocol (https://neptunemutual.com)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import "./StoreBase.sol";
contract Store is StoreBase {
  function setAddress(bytes32 k, address v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    addressStorage[k] = v;
  }
  function setAddressBoolean(
    bytes32 k,
    address a,
    bool v
  ) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    addressBooleanStorage[k][a] = v;
  }
  function setUint(bytes32 k, uint256 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    uintStorage[k] = v;
  }
  function addUint(bytes32 k, uint256 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    uint256 existing = uintStorage[k];
    uintStorage[k] = existing + v;
  }
  function subtractUint(bytes32 k, uint256 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    uint256 existing = uintStorage[k];
    uintStorage[k] = existing - v;
  }
  function setUints(bytes32 k, uint256[] calldata v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    uintsStorage[k] = v;
  }
  function setString(bytes32 k, string calldata v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    stringStorage[k] = v;
  }
  function setBytes(bytes32 k, bytes calldata v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    bytesStorage[k] = v;
  }
  function setBool(bytes32 k, bool v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    if (v) {
      boolStorage[k] = v;
      return;
    }
    delete boolStorage[k];
  }
  function setInt(bytes32 k, int256 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    intStorage[k] = v;
  }
  function setBytes32(bytes32 k, bytes32 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    bytes32Storage[k] = v;
  }
  function setAddressArrayItem(bytes32 k, address v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    if (addressArrayPositionMap[k][v] == 0) {
      addressArrayStorage[k].push(v);
      addressArrayPositionMap[k][v] = addressArrayStorage[k].length;
    }
  }
  function setBytes32ArrayItem(bytes32 k, bytes32 v) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    if (bytes32ArrayPositionMap[k][v] == 0) {
      bytes32ArrayStorage[k].push(v);
      bytes32ArrayPositionMap[k][v] = bytes32ArrayStorage[k].length;
    }
  }
  function deleteAddress(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete addressStorage[k];
  }
  function deleteUint(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete uintStorage[k];
  }
  function deleteUints(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete uintsStorage[k];
  }
  function deleteString(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete stringStorage[k];
  }
  function deleteBytes(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete bytesStorage[k];
  }
  function deleteBool(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete boolStorage[k];
  }
  function deleteInt(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete intStorage[k];
  }
  function deleteBytes32(bytes32 k) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    delete bytes32Storage[k];
  }
  function deleteAddressArrayItem(bytes32 k, address v) public override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    require(addressArrayPositionMap[k][v] > 0, "Not found");
    uint256 i = addressArrayPositionMap[k][v] - 1;
    uint256 count = addressArrayStorage[k].length;
    if (i + 1 != count) {
      addressArrayStorage[k][i] = addressArrayStorage[k][count - 1];
      address theThenLastAddress = addressArrayStorage[k][i];
      addressArrayPositionMap[k][theThenLastAddress] = i + 1;
    }
    addressArrayStorage[k].pop();
    delete addressArrayPositionMap[k][v];
  }
  function deleteBytes32ArrayItem(bytes32 k, bytes32 v) public override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    require(bytes32ArrayPositionMap[k][v] > 0, "Not found");
    uint256 i = bytes32ArrayPositionMap[k][v] - 1;
    uint256 count = bytes32ArrayStorage[k].length;
    if (i + 1 != count) {
      bytes32ArrayStorage[k][i] = bytes32ArrayStorage[k][count - 1];
      bytes32 theThenLastBytes32 = bytes32ArrayStorage[k][i];
      bytes32ArrayPositionMap[k][theThenLastBytes32] = i + 1;
    }
    bytes32ArrayStorage[k].pop();
    delete bytes32ArrayPositionMap[k][v];
  }
  function deleteAddressArrayItemByIndex(bytes32 k, uint256 i) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    require(i < addressArrayStorage[k].length, "Invalid index");
    address v = addressArrayStorage[k][i];
    deleteAddressArrayItem(k, v);
  }
  function deleteBytes32ArrayItemByIndex(bytes32 k, uint256 i) external override {
    _throwIfPaused();
    _throwIfSenderNotProtocolMember();
    require(i < bytes32ArrayStorage[k].length, "Invalid index");
    bytes32 v = bytes32ArrayStorage[k][i];
    deleteBytes32ArrayItem(k, v);
  }
  function getAddressValues(bytes32[] calldata keys) external view override returns (address[] memory values) {
    values = new address[](keys.length);
    for (uint256 i = 0; i < keys.length; i++) {
      values[i] = addressStorage[keys[i]];
    }
  }
  function getAddress(bytes32 k) external view override returns (address) {
    return addressStorage[k];
  }
  function getAddressBoolean(bytes32 k, address a) external view override returns (bool) {
    return addressBooleanStorage[k][a];
  }
  function getUintValues(bytes32[] calldata keys) external view override returns (uint256[] memory values) {
    values = new uint256[](keys.length);
    for (uint256 i = 0; i < keys.length; i++) {
      values[i] = uintStorage[keys[i]];
    }
  }
  function getUint(bytes32 k) external view override returns (uint256) {
    return uintStorage[k];
  }
  function getUints(bytes32 k) external view override returns (uint256[] memory) {
    return uintsStorage[k];
  }
  function getString(bytes32 k) external view override returns (string memory) {
    return stringStorage[k];
  }
  function getBytes(bytes32 k) external view override returns (bytes memory) {
    return bytesStorage[k];
  }
  function getBool(bytes32 k) external view override returns (bool) {
    return boolStorage[k];
  }
  function getInt(bytes32 k) external view override returns (int256) {
    return intStorage[k];
  }
  function getBytes32(bytes32 k) external view override returns (bytes32) {
    return bytes32Storage[k];
  }
  function getAddressArray(bytes32 k) external view override returns (address[] memory) {
    return addressArrayStorage[k];
  }
  function getBytes32Array(bytes32 k) external view override returns (bytes32[] memory) {
    return bytes32ArrayStorage[k];
  }
  function getAddressArrayItemPosition(bytes32 k, address toFind) external view override returns (uint256) {
    return addressArrayPositionMap[k][toFind];
  }
  function getBytes32ArrayItemPosition(bytes32 k, bytes32 toFind) external view override returns (uint256) {
    return bytes32ArrayPositionMap[k][toFind];
  }
  function getAddressArrayItemByIndex(bytes32 k, uint256 i) external view override returns (address) {
    require(addressArrayStorage[k].length > i, "Invalid index");
    return addressArrayStorage[k][i];
  }
  function getBytes32ArrayItemByIndex(bytes32 k, uint256 i) external view override returns (bytes32) {
    require(bytes32ArrayStorage[k].length > i, "Invalid index");
    return bytes32ArrayStorage[k][i];
  }
  function countAddressArrayItems(bytes32 k) external view override returns (uint256) {
    return addressArrayStorage[k].length;
  }
  function countBytes32ArrayItems(bytes32 k) external view override returns (uint256) {
    return bytes32ArrayStorage[k].length;
  }
}
// Neptune Mutual Protocol (https://neptunemutual.com)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import "../../interfaces/IStore.sol";
import "openzeppelin-solidity/contracts/security/Pausable.sol";
import "openzeppelin-solidity/contracts/access/Ownable.sol";
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-solidity/contracts/token/ERC20/utils/SafeERC20.sol";
abstract contract StoreBase is IStore, Pausable, Ownable {
  using SafeERC20 for IERC20;
  mapping(bytes32 => int256) public intStorage;
  mapping(bytes32 => uint256) public uintStorage;
  mapping(bytes32 => uint256[]) public uintsStorage;
  mapping(bytes32 => address) public addressStorage;
  mapping(bytes32 => mapping(address => bool)) public addressBooleanStorage;
  mapping(bytes32 => string) public stringStorage;
  mapping(bytes32 => bytes) public bytesStorage;
  mapping(bytes32 => bytes32) public bytes32Storage;
  mapping(bytes32 => bool) public boolStorage;
  mapping(bytes32 => address[]) public addressArrayStorage;
  mapping(bytes32 => mapping(address => uint256)) public addressArrayPositionMap;
  mapping(bytes32 => bytes32[]) public bytes32ArrayStorage;
  mapping(bytes32 => mapping(bytes32 => uint256)) public bytes32ArrayPositionMap;
  mapping(address => bool) public pausers;
  bytes32 private constant _NS_MEMBERS = "ns:members";
  constructor() {
    boolStorage[keccak256(abi.encodePacked(_NS_MEMBERS, msg.sender))] = true;
    boolStorage[keccak256(abi.encodePacked(_NS_MEMBERS, address(this)))] = true;
  }
  /**
   *
   * @dev Accepts a list of accounts and their respective statuses for addition or removal as pausers.
   *
   * @custom:suppress-reentrancy Risk tolerable. Can only be called by the owner.
   * @custom:suppress-address-trust-issue Risk tolerable.
   */
  function setPausers(address[] calldata accounts, bool[] calldata statuses) external override onlyOwner whenNotPaused {
    require(accounts.length > 0, "No pauser specified");
    require(accounts.length == statuses.length, "Invalid args");
    for (uint256 i = 0; i < accounts.length; i++) {
      pausers[accounts[i]] = statuses[i];
    }
    emit PausersSet(msg.sender, accounts, statuses);
  }
  /**
   * @dev Recover all Ether held by the contract.
   * @custom:suppress-reentrancy Risk tolerable. Can only be called by the owner.
   * @custom:suppress-pausable Risk tolerable. Can only be called by the owner.
   */
  function recoverEther(address sendTo) external onlyOwner {
    // slither-disable-next-line low-level-calls
    (bool success, ) = payable(sendTo).call{value: address(this).balance}(""); // solhint-disable-line avoid-low-level-calls
    require(success, "Recipient may have reverted");
  }
  /**
   * @dev Recover all IERC-20 compatible tokens sent to this address.
   *
   * @custom:suppress-reentrancy Risk tolerable. Can only be called by the owner.
   * @custom:suppress-pausable Risk tolerable. Can only be called by the owner.
   * @custom:suppress-malicious-erc Risk tolerable. Although the token can't be trusted, the owner has to check the token code manually.
   * @custom:suppress-address-trust-issue Risk tolerable. Although the token can't be trusted, the owner has to check the token code manually.
   *
   * @param token IERC-20 The address of the token contract
   */
  function recoverToken(address token, address sendTo) external onlyOwner {
    IERC20 erc20 = IERC20(token);
    uint256 balance = erc20.balanceOf(address(this));
    if (balance > 0) {
      // slither-disable-next-line unchecked-transfer
      erc20.safeTransfer(sendTo, balance);
    }
  }
  /**
   * @dev Pauses the store
   *
   * @custom:suppress-reentrancy Risk tolerable. Can only be called by a pauser.
   *
   */
  function pause() external {
    require(pausers[msg.sender], "Forbidden");
    super._pause();
  }
  /**
   * @dev Unpauses the store
   *
   * @custom:suppress-reentrancy Risk tolerable. Can only be called by the owner.
   *
   */
  function unpause() external onlyOwner {
    super._unpause();
  }
  function isProtocolMemberInternal(address contractAddress) public view returns (bool) {
    return boolStorage[keccak256(abi.encodePacked(_NS_MEMBERS, contractAddress))];
  }
  function _throwIfPaused() internal view {
    require(super.paused() == false, "Pausable: paused");
  }
  function _throwIfSenderNotProtocolMember() internal view {
    require(isProtocolMemberInternal(msg.sender), "Forbidden");
  }
}
// Neptune Mutual Protocol (https://neptunemutual.com)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
interface IStore {
  event PausersSet(address indexed addedBy, address[] accounts, bool[] statuses);
  function setPausers(address[] calldata accounts, bool[] calldata statuses) external;
  function setAddress(bytes32 k, address v) external;
  function setAddressBoolean(
    bytes32 k,
    address a,
    bool v
  ) external;
  function setUint(bytes32 k, uint256 v) external;
  function addUint(bytes32 k, uint256 v) external;
  function subtractUint(bytes32 k, uint256 v) external;
  function setUints(bytes32 k, uint256[] calldata v) external;
  function setString(bytes32 k, string calldata v) external;
  function setBytes(bytes32 k, bytes calldata v) external;
  function setBool(bytes32 k, bool v) external;
  function setInt(bytes32 k, int256 v) external;
  function setBytes32(bytes32 k, bytes32 v) external;
  function setAddressArrayItem(bytes32 k, address v) external;
  function setBytes32ArrayItem(bytes32 k, bytes32 v) external;
  function deleteAddress(bytes32 k) external;
  function deleteUint(bytes32 k) external;
  function deleteUints(bytes32 k) external;
  function deleteString(bytes32 k) external;
  function deleteBytes(bytes32 k) external;
  function deleteBool(bytes32 k) external;
  function deleteInt(bytes32 k) external;
  function deleteBytes32(bytes32 k) external;
  function deleteAddressArrayItem(bytes32 k, address v) external;
  function deleteBytes32ArrayItem(bytes32 k, bytes32 v) external;
  function deleteAddressArrayItemByIndex(bytes32 k, uint256 i) external;
  function deleteBytes32ArrayItemByIndex(bytes32 k, uint256 i) external;
  function getAddressValues(bytes32[] calldata keys) external view returns (address[] memory values);
  function getAddress(bytes32 k) external view returns (address);
  function getAddressBoolean(bytes32 k, address a) external view returns (bool);
  function getUintValues(bytes32[] calldata keys) external view returns (uint256[] memory values);
  function getUint(bytes32 k) external view returns (uint256);
  function getUints(bytes32 k) external view returns (uint256[] memory);
  function getString(bytes32 k) external view returns (string memory);
  function getBytes(bytes32 k) external view returns (bytes memory);
  function getBool(bytes32 k) external view returns (bool);
  function getInt(bytes32 k) external view returns (int256);
  function getBytes32(bytes32 k) external view returns (bytes32);
  function countAddressArrayItems(bytes32 k) external view returns (uint256);
  function countBytes32ArrayItems(bytes32 k) external view returns (uint256);
  function getAddressArray(bytes32 k) external view returns (address[] memory);
  function getBytes32Array(bytes32 k) external view returns (bytes32[] memory);
  function getAddressArrayItemPosition(bytes32 k, address toFind) external view returns (uint256);
  function getBytes32ArrayItemPosition(bytes32 k, bytes32 toFind) external view returns (uint256);
  function getAddressArrayItemByIndex(bytes32 k, uint256 i) external view returns (address);
  function getBytes32ArrayItemByIndex(bytes32 k, uint256 i) external view returns (bytes32);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);
    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);
    bool private _paused;
    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }
    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }
    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }
    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }
    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }
    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    /**
     * @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);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }
    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
// 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;
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}