ETH Price: $2,441.74 (+3.96%)

Transaction Decoder

Block:
15378246 at Aug-20-2022 02:54:31 PM +UTC
Transaction Fee:
0.037064472788627559 ETH $90.50
Gas Used:
3,340,263 Gas / 11.096273793 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x678f4975...2eb0341cB
0.0888 Eth
Nonce: 0
0.051735527211372441 Eth
Nonce: 1
0.037064472788627559
(F2Pool Old)
3,660.043940346322012684 Eth3,660.052291003822012684 Eth0.0083506575
0xc672C2f1...f7B1A2b30
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 4637370311733627973896904925881055975997293595646310498759456593756223705886325914300995898474759338464440693832296949007793005675285557873040416342477174616665993781937462044876896908502687918935767532081162595253980317958674725881225843350892742127589365408415939533291247390918087539446342809868245569433503288470379114369827338883443247973166454484824645186588662414064090597519152348278674054675100974091324301238063573631315422597825904828351712020465971465178038503866583314557500505278080900873201421627461482027548347707671524500900162788435841768521176605758627079873762009777690342648209455482557911083172590067101115078874715890139318162032139419541511499232476650166841038174444953847368467812744932874770621132265074811277523685152355735185815984725354382262386969910251643518420916156697867866500238534569562411530636373113128378420580013837750501456472927731810076459923860259432451224205424089998367257548477888714276757883781136693296951825534183957943986050670719559134488453334088658869982431661752411032462538994783912452002487953500063670677757838947984297858258525385272362203485927748981964556924577355876294611844560373486031438965720399877368320442173181055361660044713196555907822493405443263527649666472829246153585633521551114283745635907163519240263858385789655064788010230560641950858069997999117566517178510814001677905298445305113172467695467670447924612133383063655532521820508224240399820874955926297342896665546808611880784538411339920207693486080326849631896942552167440211528327402147917556847309360134412667877029106069281101063298924890600384511416944440528061546710313320641291013579625125279660800835372815294847710103209303502176759089107691177562004340415744256261407477813489487058801639887305449305891664870749369570807956912819235766244456498647324807995479251400917654009933488765880356374239635606558536870184000046057455274573771690487729438080845507224449656946723453356186764372008879272643040638005778625364656726392654278204026270705007535686776084939987723362027042205825201302860284110020484715183091419257244024501892335860685663001363604312199540902227655896082556951320520714530732810493307040267299877512377394317477769348678885727084580025828694412175658666302066719751276398115350543856051610265016540458611620939177032204207273414481264486105210331795992369309150241356718323722506589964597629464518988466433782609457862510334400608305793635635844860507245076758151422887268930506693006074939746511895691619512152687550256705894139536103340092446014026512211671134506297368546924631158581344126478633357161197207792089984442131929788674735962692951957817517320853956913126903342263888937833002896203874757529417026059410464133867249245436812296030911434531872545582444007997239202848401287678940363778606744156697888519242875483502320194658202248080166473837269840776963753569012410590378952859169631081642945487268645673855443243243945332619755363263611428740749699343253881263099462508470943949620319340036083969640765719618342569349047636840110214973067087850119690127515383006951530905758142511857714589310551147702963491075632992050442779588967466794733672189550071551569389628243127135482599330368229716358422806096860142572478641186977764428638313343981098675766749555648434317759763452789404576021249821149624934681331085370991444767080442867109150532900572769648677360527924573434264869038849636735348038884536287122620777640261263970607663215707101763106003334595354069317181746426598624290266138324040332576189963674270306324085462944237576586784450180909210919138741585853865244109237165565626908970623043060410130078903749397856285362041431672434726756293486331137229345618037898715666024492850119620967643798905317806008521409780317983110030418434050581932331792218485163643348239505271209133696275891889855091196690662876905657102875520056934820903571066891420222283900274367966294597160701372976507247204333603846889690280403284718216380708737672817811134747540927471507120466367630426440192768482069846868577836390951477100929265394713260062275769845397724454156217953756522022777386246837180850616569411949150899534250670203574316278167757692949918947466240527532949577332143261693919051083997826490233169271465813721178003372066798429399378601140924383751050789003611844151397017939392129464729701005452112780325312675259442427497941634619788480131116485850167048052166192761712246539027779145994069439254174589260024925280281809821820873642469209167100551288092058906021462241260739121231173644415460116308691902225931640433584705972640310190446154202492110166736862284343465593765179818641276480461174634091946227249396035196318260890841800310066941097710179793001441911879543539854558680305423855505257562714480261346727202268456297323785053328738818657337383386300885727187687158773610461526482714083837246129201042415087854472427435819430400861972175310440547355358420910834937327853126143135653973896028277207502568102508739364640405451706995415330912695022725807615242660613942334648509757892120955613164493422678727815892222945891383438839475605388233089639598175774580839413913389933354872358829029316452662109540733848199555517637156355545869226417011408454359701901761696296059639789805347149380778873907304877094669447283463449158799743147882667740361065247662002995091187016067358695315884151401434225761603859004363723480861976925752560369856847653554932737339796822239206721110883168398661459284960460159433475475288408354327653614895848538185816402433700373864218742175819445683988402659499006461813146963228514871460554505347861101127081524702844398253038148356015209528392541401899394386063498946753379116515244322594019187323963520625595233989392940908100163845253514847339915566988322234530074059365874862820124630645214975815604165352434717065926414524023612140213685759413264455755034976533597361662542378082272973709716338761392092743618157114001811301439854260982899345090331209806333571400884100324317805434438045698880878933489355956486603296865324821420665384355571298041739738279591959308080448613720738857704007461449144635326623289631206720183787593733740744953734332530694804152123655403454200659684343668903756535327021491643818291219752346187068659552037509913984975813811914408156636182952106591175779905109164156224965567771719174677062064825417418783659271375713152551182224897737641566145690395330218074061848910373880867632556320509902465447977847040114614060253704336854190568235574750967889702882778725115213124305647194416168270169332961961986663132089123715306383802329486790538004058896322106785814535792259433032301633446257522888178026484360405646052452604942514726837557577158254315238799148878990200589190644951266541462617071094799272370158208427899261348122374982491308257388186289249766317205985898564461124385814716579366304062514010899766890549546276778078792662510537049999966271548963294515731511726944296342508780372703499900976151527443085546625933453923425388273312408287649531454197428773442730021241864439166378235714723772424177078707097189266919956706988899302544118086276932143035052574899216729103831071584321632783236251373834412944376468023283075703087590271259093861116995231191408919218406547887503828958894348559107232982601556095162626549960507813766189272859308154839771833705913635044974653215074335077205201771318467996982376342507625510495991345432118965085560294679939582280251551979109644743889065520179902995409408541063275217289175941848199749902355642578652885454751447307335116685349173270834072527599640492735128917922490579028164629990831479726960061985601844712275593893532232327652488655844399041420734688420349687101621188866315841419744115262424240719970744779290314927338748817338124228570606626083384503620246781831670119180764242807976739978538931132925961056120185733352830116245352495100382073936248120541672488485330243688297764542281540195633117553019173411712253271973646060756569164160030836845347101137385186585961831948753558665935467119355529225323159982091346638156727762757307557144418655099800715973809447710449150008488754036486975545785567116556300188093403978389013365773618873701800120833897105203860968300472202950092490688408131839834956943023434263515750189108619025181885772332581200030491767507154558825660484751871143524147522095639308278818175740558862448505969610937977136365583635487904446407647163926399917809286484033221347571335198146370175454430406123027584430643595398063256979036462684849726276011818556730070950934066541649491966799704330731835482090301142708763686131036550871861076164959971202285536931104311034454528493319320704290175385734308218464531748119892666330337719543849051781322050433228819217201496833683027640056995167513389737164567705281594576050881516097516122935886635919267321766175684116875828256739409655408840327662448318988302798445794812369412431947363553945860743392451930243575221785226932937844567270525301197575958468435196148112858648290774168612196343111154417379763512077936745398135499760596440414999608955561169637482121743766595021741822341522790554507977977506130826416191743789290567782051408102140374013061950430778583826634080858554687512853158338795214937092456588838774272632732802292403222934035518381217793005798579855196240143671942098857792891499338298821984335474180805430461381877438369730455403671194669983202997688654502909010415444798004634718772329488516230491938234023476516652737704037954332444145500418619876294274761515929860491391662606733662436170659727984690638299668569408937665357850088103984459631461346322374599446814830085257636443233174770948705876207678254788407652634148085445756878727368802071438360620366872972206452654593001163259351743719604682390522430435121719267161658837587982574069633196414698155627207841966911509821584052447178848885592834251851131906009695245594143010991478116769845372784118992621504812248099908637849371179178947955904724447108514844996741780230785219795660779617361828037512754840145808007954724631277164414206358534319383827389481106258945748429746972870822524838341787931240783458474635342612821601276597736754100322385062628899164849408696830834775197345299430102846561050635106848613624331677471105850440903966366731287741496919223405084606658734861031136705434774003394127053636253679099874454251181161259902036024249298147660503353723482164029186158134824876855683187561265454038006094923497053022966854086994865521340426131219998908334989337882147300731724205174529997304845269621785651269878448466822164506508839498295504640624028482969624382031952623258228188715672303377123799459917450523489492131661670260047172463056211489200242776429630762376348472868189563556574698133706721203479090799310070806491308919205206311602455307254645234312292196676284074772286435771476107681185303932835610433118830641195698870915020449618538045876004620060937491871515983391913874034409571064038549596911434788603277992878591953293458967025318074455814725155229661249259986507575204669803013982110426622708660324279010664764460511763016050426568061070466461252499968130859934788579536984289149228940649498299153994734007188999706724051742885184402090240441586536764461869954120858759603349871578042456290324463439310758337296051249714492208247694889681558542511027178631368053577401303478252875552091954519567936112913859521210599242947776255976796875499896862839682919675816455386298551633090182212945898766586820881624620476629071496649756894395958937245027830528595641313131554661006794094804099146147043816441409572240866856321340933354770763265160644131523101483324179054387007302723369019664889857354064278040225541424965063358260011990150311862058983212904150155718305791382389162851309191248218438495271731814463395121778221730156581588091729812266262309036279532558585432105767417555001130044375889452958804050509725209038646054859768291472661257435808166446783657189241505881014398177971502069655393019052106479231539599432959526540931352917312951938845526059455481812629130771415589368180125572760711750948889284610829067655838744313116753208932461181096006629719610065917408992762444111978634725804152468136619299098730802863382292260831111848079772462801167833216781191830946764164178840345474130729298959893555684083395497703063278141243587286309359071443077282346308652114748776426403642613187224328173590123968854810663253281795555560990315631110965720759542336638703241100539264183580667896582551853641745411589200797256684313376433271401382293139409482295266454162529316915593925261243973070995246269006840333703022660336086386289453443132300873167445450809439976989607347724936245413040471810019108792826647397260517216605599878331245066651777926545187749597717468456262382739729438969571009927752601905864259296634965679265807320326747023404518786193472209754161012353728702614220408889320555311837658581436456048107380834144680313120101975007880171604093978696954689656347943644692809247225679229725293772955402042444763197215729181418725193606865395569139450244178475158904465665588623665256310505576289027660226908845500949449207009170669474218152656618214732655603068505298258100239735367924583959132497913082383825349558123635025844932450095443792653548249694470878982670934872222408237163261185812889659383909281485728211251582990078414286400506838953073420075578399606949514025066973982978032615145192490237982016930679502067327774683143821697918082030150822320307299250435535082737456966746343080622071294655644241420661179904469835841274547547557580669221854672655752955713848804781667100164049985218167617925213702446005558486669365732081454897158225543662620390717321375964311950531275451739190296107065234412262655496121504009814845016827003885846119745967377247010599821468410332342013351390101246809307288100981465731650560304463744814236738860159120978303693327197257240059144736073666324622874686954150373629669454338735730336456439814925804363698111792353127143226820194293684837902323613047602756973206034194746128118350629732116654662604724084564201424638504795361917744267320696296796455512747968527946167375677905615832137955809890684759633119345533028117663198978082699062349539001748247212781105976564412469271392514636156164263370305624127650267993494798215736080892746436223742918271466222583453208463165262675989877313903078895262432113160393850444277372137201906651783836447463746518276784503429135104070646860851783052161168177883490417579435501272378283588840342625402941617758647009964444679606776482659202266175899381926941543369558000601903916384627646987401672585208757296306317373782731426228021414748303505746161913379022608061311548685549557515444703085543866803443184786560544114250477274641215914125317691853471221249203029318427513828308085397211769713228575815942302980058118249061805208382032333076002025771957702593852123269365942306688074614235615877870492631908301072145301265380183072319252796632487810475861955697048925806334331143671944579969102925078414630212842267774201981394629760974298064798516891715387550333108403941253155408981212729445239280060531218077005685438424262304041734965160587942265887785193097947478997202015714549788483494442656466745709995574298782685605879073409758475264203911268201268700224706637875625114353521842938848654639912307780237324854544254553112734999239652536947606732482961818516802001865609828075524268125645294580739874300488644469357667627555269906889443232267328193590598432890565225003958694291942917716005930191398144304870158603554391182731094919657166311830723047844864086972792356483346519767564614801604486237826728895954676303465467709542774237427448277282184221878571887918037057326470203418387805973607555944760651690371352646196771888694068248645777251531308858660575621669056875814054113964268924880748223862619871371663440443678888896102358924996728893528153733812106392051145078635369189078630052445016991325781020183987993608131645269828052367436440638603789368449540279219982776453027392803224788610479648440527585878235071071383855925185158510747913543425166025392623421670881243725288756862404712977108004621437614116805276790140187305799182700166757441663256110814601226235670159810887042749051974830531124302582499637290140232402114139114255831893130720372552764855168123312027104605248869287230837867568369922321199613879386648849408097415591628519511004592707641658171542382626477062980986916352878181188968446247318641001731581782846699071459378068781428522426038995519602361571148094114737881810065459651934183960240169383394365391710017259670595400554385390088007230156832564353756150335136746127979015442337798977537942900628822125368226059568271976522147600140236917336080193192966621683663098144645499655938357138520984054471213784659984306775640888838914723724536468655824018161438592241100376982562838072114506449207235258893586483242947716953690105459667662879587348837797791081274145347516990279135342755994073017828086151574029297324894131031746453054374806932369404708241698222060708390670820251822290105851724270112874041001970592397104899330184282915823846638255472587527637581792798135634100674189999266239486193355914362570349794304915503900030552700599653649227295492626246307036938969392656801298598280585033846660821089260218029193759642968265187015937375860785914834324084517000365606526445804830129154867854902730855147481489343221205584178500470247335496477413535191305691451291384057328401479264782948276494087030546479420797748075023264700774467624650090627031278729701621954770880248616934882170266894026605616013543775458427970734242571608460752389054622909658799838574719671934433327055675625205405453123049316939892300671208276474613237376063609418955352985204784423813178429962042384863739206994193013533976895558811940935395495905872039980267192712466666726870571584932307586702521041030019529416645655523439902991117607094828529837925594711637258156475203618446406000308118402940446907594848772799739216266934134663416977233084637401754889938490936571299945695120067329289435272221071683561902828999289707591347285919046037338188497784929510640910606996055944919714922636055113190142740927350511794675020892819454710319487246214869725046372856275300189187345770535280270758172676246732494752079775262628689681715812988708362974274942053700775519501155574300270665985127068682574549033296870197868055250579521447373769795513915796089459819135525026497951121583062827197851367052261555908069054755841379816712295984515981448802590111643985401698922957169294090002848848123041620085925089918185970868497398650089002651034149833481943632535735670139751141751781276884545803558044711881921897477878203390850068180824499086211014618385053236323609545286095285206070584090080652475188370885616576544239305699335738451210872606687178420680844051414925922057458800979185674810374473041399591421342553954955533153172604494064241497745418291682669196771336919505178714483692502337540987876000426013527579718175387918400295906998385322280061763915226297038690699543122494291835360449417064183872287580064179786289747012540279774271916149942064355704340928378323460859478679682249032485503214980923563926702824046763048746661493850865681584373301297835394254823130388398756565067196354423268129007028422155295733595763826138333455065103187695918159643987942702096467411737438676691652630095314487384915818173789297188067437520541825713784897381824682015682472430582231767552333661206136964992548921366710497916113926805788124624164853655902923009949667152299996153673918025132598720248728439605234441435542006805190982804209923025863345112220543925637862490411621163697550362569781592330555706137808585720892710893887061877356981140229609817643447163554922594689693538042164793971214520625046661062345900466106304866254558248905012402494853261752687044137830839879306611279531691753005631314023649671848105912982054054847859124324813761310738540671651127706521287244829944841930340703631484496676732449073447257030161172003853118947871883907910804677077133851809067759873856328922123776495521483155269645088027365758314994473875738189676734561246527892549004342671829543080861445784995978753485279906362073257834478358322238459454775160658603390066703820225849788859034035131638716383676046159575114606458463782064436510232963438274040779059060026425228714643196907999768812255742313172786251045298008244582771825944682874023950547226272924072487210576858302252785422133229391255650676251700490377334721895909331603638914840759335888897822609881287880524771526153235765830887146733876415025389978682562582651617012983517313815828042715186524809841604397936942221329881197389407532746530734867161982236208467828132458569470672944549066695115053663802276077476080558770950911457392427121691387291740101965128397655332258050485992460849143181215908293074928279620788381902671460546598693377181161972357636253456674306589390798579012640700813648820061669335955171443580575218289180462491130429669820322291811726681970449170825799313377107572753247007937107256556459995077211763092372193718027909409690949730519934849001084604573161518189531845002028756132823638053749125202990846241299931931209031537373047089370696889285794356159200563507823129266100330767966869939236103173072280146217637200597799164565922565917537612413389608007510286216161935583734348955867516444518521333957083862819184248114296847812631952407151960117049305978384569436654055269511191866255268453650240854894283556822658667735354371909876021645081279086039132155987898172546784480685821829819196446110628599737869198655979174712571603303279528528846403584120504555214157007297642212159474245252261132890240856998377947485044065817675139668078433996975343395557520895744107434208691651916497364911105809177743020227167435917030820528780117844632771931662029405718986281812126513140180651508213704478247562605245689822058795273746210248755780601199061755594804745401124444295328828398157840587021330258704734015882616654356344446197849239131840364065065474101327645336695394950491838173066473981172095828264890982111334618140138004616040303768743434805360165350304954752579553606851556502546799862470231487891390822775451061358801583947455047720997509535767735477735020239541091308920419257147285345954086524816023230276356009886349670882104736638135097188284944652958076174117970918284968999554883231977238811376770099252196464129928113244866623126924292603880396187622349513676883585701911927387891669749317991610708773777863110802529362907452055049602077013043438730894380710050151350149665800172689930561961030414723707673145819404579940790984766960808044058722991279033074212016640678387699632837071473136577752276192431943858608678560480412971528652947075167492443506304452286620781574137906199994874023792811551335291400991796498666970213645904031696269027134757460313368344270571433129525311674787365857642133250782153787143936851246629359370248772864317872841806779379248477076491227434085994507880802130715372705862034646321702141340507925978908852750831567708264962413671243288052270251694898677653126736895526817461669423339932075587051201303889035392113424809274240664244283940208878576283363491754452000393259468408472014282290110103276396106664004854164978867702308955381486253102389542610956854496943013998578403712146870414945292437331106099820498264233139805602218866580972028668555589893521954248473650800545114272843088042064436243028995745849414759704869522332507555401143680266746548690706197928544951311803839634618027371298358784839863749149437258439224897588556421331483644345948788773028481779950624487472562565742128159008319259931961192409752054125381515180654319124624748589322025839088852630618178568597949175978621543393509104295459489152254747496808625714073773283150445765764577180645329390978816438618402237392546683236533991703115548989947840214189180420465828738335843442519963396797886524996407245123614851728336205190744546117070607334003067301453907067674523286418916561747322296819770776679335036999256362595548485145910321353720406746677954122863454523450458792839304659953929321324771699272014162388422584324341670546696418341702539436366204917258723832162851083266233339760179314049212179619579662301375809932226570383084117275053748433324304641217949838060604283494461710150830688758905998472927853883414002437109741556800584271671291192779014622449114030574771359200765489369568865701446158992510452717690214776331131387398970791706103985334644081163093327642531469692188529955443499839465603802525522309380024118930641225220482868517764739950012084778614953034986667525213977791443125020360216642378639740728606537821179881807421020630264491902205053916750535644094555014580140101395061942682065450664557033298559822734781210964015224298898198252141042687051850933630805176858039737127493035500460186577599213115207400855746224597473011179872595088482160882319092379234535979717406863008704114646531167832105554804432594180197163545451311646838123795686692515511027657582007667279012128460119678989146966182793103362473312325695597176702224531853181287029666068673084108023266993020142959238970335170102985580586490617202041653106841692730886918929058558594939958775122616651789540763922741377429418522087575996839553315479268485713867828607162238522583624959571732092826430442786474876488551801841494296206089076228855293541472578479821714770904783032024993452639507392289824942740882184676953293554519749798874732821811730973483106883744262009095919633547525440363583615329738257810810979438369805708956808799235319726556408713766403549111182147574203620022418855748588080503154649841945821063059613132829748468546048361777173889691613106840462456858528951937662344733984524827292864154777908092651216434979071335328529214774270803349141305179389637263905172614972370323491533943634947971428373074184255607998442154819488373484024724799598993454069757879704428830153748117851072253295454682798420739447525424497499526799024348930272562140637405799262053881782924953427504365097298530443927065784947371798183166907672342576819701652303493310585917571555912768097964552706467581465833061413629445099280966234288542139625133819789618440801475805329307811727671057532000431527877997040565816373027005229948330485088131237261075396150117365845584463220616693239175513154633021863111778911407378193006022901952849767287403769618496048793772678690813400859688245768160864172039418984431526531931078716527697905468071284437976909058831029254664276282008899740873494831150075660344740330276574278882614169686399500013459305760132731346936321245088400236939299776794098427801334552140200880870778780090153453446369010237837362880332589584560795172065618787481946409701303999614524218500723626304246131021904398638886375208404918508383105838848256979644557486195014540775990486344530443815187032014359301561527935532756768299814455537063738386282677279473655468787375860400413292772899810968704533117574889181668364326852103691285151628243673111377311917756547925432721862906235519611747285233452761195623034209271736565014717408679778483060451419963976688115040143832756788152198488325865351225927090340960317684208186494563990285594775580729058907544539031848720329412488630454127392941589411622739978087531356642453786086808511612586975458994108182891721545538698813256899494088396582137146979990180043214595118751367118116601720356935028136711208988848411641739280805917595429231398762820254444039905136032608422008153606799212825798984838652614047383901056804825160558770583000349393647686867726024838843475962835155780250666076446848036271482756578698243128063186477349433165654758509374788737580978546899551944781312229100177281791232140475260389836073615100371316057309889179133925509914167304043238820909396994056459655811001229715015179303449609174592087254864295806660413756166199996078803671899961857005234075965539730156923339648610959233289776355602544045558281329392119343709226715546921726524742320269300260708629574293488138938886868214932354109589755070228540662160974130384766334629549022690130181715819340655655000004571716284002490788207784738935766759920547273861872075209052837127844846943227792944136749977283326951622191697114601685387881226131174337306712065447301839505433054125388431122202422492346571756753267759723103652623964292319753529905203566121911905328206662242062334837460852131084751986956001779402718905424254812278952078587670319760805006575911638809047764314021919015142509385122688223694077139940970025605295493116121214216882158690246740588064355280918044917838916681767079679451949032065758501574293786400221399938856480578643580454852907009979769704668662692854182090883441199436892783717076764055162822782115976691892097553111540621087708198043888192154419836322052279379506338531025133987672183785681623411708673242347182632051919167065865082549946313336993138121677179131489315894039436512795735661214262504060050003255527862575948363835252113072039096843268441080600026140588227035067443499683365139763923510403274575630445604364245822139119038564667496411358307337686732020253860125496452424947554741402704123979771286810056846870329458381992753464147002896017986574739434447617905503004732834318680911770495950588872753020163234604761667708360214561915669963354687083526454700524385894796337610561136250907786573775888438206276532705306188606009870601176862596637997666046450769978139122852895914486894832704507701286100963549937326167380855611394608003671510941777152153745408922861897305962727483502448939042356162693622776036894405858541176740984585317421656631566232601328719962092077739207283417414032205338442037147802995578292606653730390118297002130190587818615105681345612839480006794848606629139084250925000825993842144459370916758356484350761153792771353660940673087951754894417698597372315946077236254598486293818692074133106599035215771310735715600977312988863909703112145944693800605958536113482771013985414362814869750608865876904459534095386073333553840999006926921792894290115680876032281420821473384591695077320236811137585837115239967372803486770680634747522070959532438864403939270291306859522091593968006074646812104679625337466727741918258612831488285381451407323295207445328636246032513674659982426507007018945273007798305041565928786851888874228916689492941826137198510638316431532104035992597057001240921334721663878933821575903709723969542829470435069978416717085143769878131657819184258077579081432029244071447417896100408150551572767142150436818912824145581351641609407290410040290655358766870296181260616050871155006555562028783432973148558430033154520583577592286173351092797031455984204909199372375829607092083563313846981530072062056133273013768503570604644413216468286302033569389900389942850555114626979916860255230333231970742751922563892334195369190670227885484765604826472166234680343932327100901755604446843077607070116583034475181437918860548997791321112818345587081112057720142271935237224109854891622256081060234738256591867850994740131331026816843838105961489556214379358984404633224892515830253022095628016064428814406054034532923432524584599535525850723412092673933512350524119160507105801700187524591292142782716142687464661684992194451431976912609909740463977635606456176869790509955755581028654776380321531349416913293677003746054783673455653430595607514469167999659732537499919716070952894323742560563949355978057046970827618542212809913897438624162002399438327544935899764835741792504015555990694123237580205771379097015525802231554995402303364715192980522634365719774291863238145603095821871417609665054768938408474389422981774641282268552005565176115487281719461633182079809769649307614401233953637827372924202359988548351535379907526881195996199404497853784040344044043581068456226530626385902089625391992351492088166374185800731017048009935985978045511142495442918027598297594081720450294587074948724975522422806908319753071136541391684245571637788882294841086183666716230892890109503903485053804581918022730067629657206681073464323569453847903194821731914608663809768093927759089331073683360695247541260266103692468192492245638995548322871597554958570221466164900396275617074869857807882463411562029061450969574125030822599590400045871300781774564481253998156281332271568333136362069199275185160745389510301000056863353452382136660928777948631026613697712958433036998659745648994736524729498229016223842529207022023124431772401326143268864024891755083416380349829776770452104940535262497554536634033638527537894140149847878001733675647917016696404288994356726256563589375621700309859432808160869574658596520975019793867920845419937679489276103346695771515167597059395033677098508218065432309622331419735099883327430903423448994960857968764066553195096852125617582348494145731166324530892880080374740010151574415382406581922943841610934494223859739453259791651425500950799049133976304455004478019993032716293072888067898595885306441654198574137557408918486431987104632077429185644502689356134445121032118256104855699797210373646220455806770443979191316147826677312735446760354339606360724313143246051236168508131993173767937783078219723374470311624514724498149696882503506015256368070182204536844881564142952107843605498047706513363630202903157908187966667802911319365378134288519084749894478470586595810205110663392207486179121646402909393950006178815399758170870578338906236958161899764138774716735347398360618791691076615836796101077759476563078742055314126164755470979655735623946830968612094052044204891324215696581754655423373578861963700188181885480745328467280528600096851451819337112174852250278367708721910696727308628241364192519934723284910162012857427392987730639739218736966384237650982019034324434420349945624953064963819254424649335477930969506151022864425335822031437250331067104099005005593946095693138347297303989293860778583487054505014008022861712274110047668126198245518101784370808264927403817049209909860173366954100223427389202324301922589925395165262355782832927421847019736431043540323376112751808283478378216227158045662957341139890968283485799623495980898462597575100982160067307518264328921286776038997158682604050012263600445286023560979777776210586171428328198619066724516572139370847838472254425719349805435886490486594953408998172504049475082415612016018025929913976629671534935821284402068228097936903616312751861421019558290331479504206894574114741547528751359980428992015904908721717282200503267344357723872388714047189942487346502504870339221402624635648759885851134111238476346519864778184102634207392852324788693260784514756571540119418868755156648684931271937373138226209044482370216253298232041974739459750309032528239899957080222488456461910523703207761675813064159139575692211988514037758525502787602182199701780769979851962992313811329283547023397478750614150457896227706637851210036449812956371154819735540722199333336418300777150444147112808983521687977085144241554027093502269882530369253086281340074676441510525578285560954125091813570638805001181692672142428007610317542501189503088385946954818072273404771147012878000361640611973536353548620943370660656955588292058216626410716914695816732278967906018546473882332354574290473166551954263492196823746240145981491

Execution Trace

NordiaForFuture.60806040( )
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "erc721a/contracts/extensions/ERC721AQueryable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract NordiaForFuture is ERC721AQueryable, Ownable {
  string public baseURI;
  string public notRevealedUri;
  string public baseExtension = ".json";
  uint256 public maxSupply = 10021;
  bool public revealed = false;
  mapping (address => bool) public minters;
  constructor() ERC721A("NordiaForFuture", "NFF") {
    minters[msg.sender] = true;
  }
  // ====== Settings ======
  modifier onlyMinter() {
    require(minters[msg.sender], "Not allowed minter");
    _;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }
  
  function _startTokenId() internal pure override returns (uint256){
    return 1;
  }
  //
  function mint(address _address, uint256 _mintAmount) external onlyMinter {
    // Amount Control
    uint256 supply = totalSupply();
    require(supply + _mintAmount <= maxSupply, "Max NFT limit exceeded");
    //
    _safeMint(_address, _mintAmount);
  }
  // ====== View ======
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    if(revealed == false) return notRevealedUri;
    
    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _toString(tokenId), baseExtension))
        : "";
  }
  // ====== Only Owner ======
  // Metadata 
  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }
  function setNotRevealedUri(string memory _newNotRevealedUri) public onlyOwner {
    notRevealedUri = _newNotRevealedUri;
  }
  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  function reveal() public onlyOwner {
    revealed = true;
  }
  //
  // Minters
  function setMinter(address _address) external onlyOwner {
    require(!minters[_address], "Already added");
    minters[_address] = true;
  }
  function removeMinter(address _address) external onlyOwner {
    require(minters[_address], "Not minter");
    minters[_address] = false;
  }
  //
 
  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }
}// 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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721AQueryable.sol';
import '../ERC721A.sol';
/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }
    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }
    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }
    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }
    // =============================================================
    //                           CONSTANTS
    // =============================================================
    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;
    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;
    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    // =============================================================
    //                            STORAGE
    // =============================================================
    // The next token ID to be minted.
    uint256 private _currentIndex;
    // The number of tokens burned.
    uint256 private _burnCounter;
    // Token name
    string private _name;
    // Token symbol
    string private _symbol;
    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;
    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;
    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }
    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================
    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }
    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }
    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }
    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }
    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }
    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================
    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }
    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }
    // =============================================================
    //                            IERC165
    // =============================================================
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }
    // =============================================================
    //                        IERC721Metadata
    // =============================================================
    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }
    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }
    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }
    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }
    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }
    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }
    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;
        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }
    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }
    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }
    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }
    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }
        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
        return _tokenApprovals[tokenId].value;
    }
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }
    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }
    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }
    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================
    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();
        _beforeTokenTransfers(from, to, tokenId, 1);
        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.
            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }
    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }
    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================
    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );
            uint256 toMasked;
            uint256 end = startTokenId + quantity;
            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();
            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );
            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);
        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }
    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }
    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================
    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }
    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        address from = address(uint160(prevOwnershipPacked));
        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }
        _beforeTokenTransfers(from, address(0), tokenId, 1);
        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }
        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);
        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }
    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================
    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }
    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}
    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }
    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================
    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }
    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)
            // Cache the end of the memory to calculate the length later.
            let end := str
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }
            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import '../IERC721A.sol';
/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);
    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}
// 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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();
    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();
    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();
    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();
    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();
    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();
    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();
    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();
    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();
    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();
    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();
    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();
    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();
    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();
    // =============================================================
    //                            STRUCTS
    // =============================================================
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }
    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================
    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);
    // =============================================================
    //                            IERC165
    // =============================================================
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    // =============================================================
    //                            IERC721
    // =============================================================
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    // =============================================================
    //                        IERC721Metadata
    // =============================================================
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
    // =============================================================
    //                           IERC2309
    // =============================================================
    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}