12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578 |
- :github-icon: pass:[<svg class="icon"><use href="#github-icon"/></svg>]
- :Math: pass:normal[xref:utils.adoc#Math[`Math`]]
- :SignedMath: pass:normal[xref:utils.adoc#SignedMath[`SignedMath`]]
- :SafeCast: pass:normal[xref:utils.adoc#SafeCast[`SafeCast`]]
- :ReentrancyGuard: pass:normal[xref:utils.adoc#ReentrancyGuard[`ReentrancyGuard`]]
- :ReentrancyGuardTransient: pass:normal[xref:utils.adoc#ReentrancyGuardTransient[`ReentrancyGuardTransient`]]
- :ReentrancyGuard: pass:normal[xref:utils.adoc#ReentrancyGuard[`ReentrancyGuard`]]
- :Pausable: pass:normal[xref:utils.adoc#Pausable[`Pausable`]]
- :Nonces: pass:normal[xref:utils.adoc#Nonces[`Nonces`]]
- :NoncesKeyed: pass:normal[xref:utils.adoc#NoncesKeyed[`NoncesKeyed`]]
- :Nonces: pass:normal[xref:utils.adoc#Nonces[`Nonces`]]
- :ERC165: pass:normal[xref:utils.adoc#ERC165[`ERC165`]]
- :ERC165Checker: pass:normal[xref:utils.adoc#ERC165Checker[`ERC165Checker`]]
- :BitMaps: pass:normal[xref:utils.adoc#BitMaps[`BitMaps`]]
- :EnumerableMap: pass:normal[xref:utils.adoc#EnumerableMap[`EnumerableMap`]]
- :EnumerableSet: pass:normal[xref:utils.adoc#EnumerableSet[`EnumerableSet`]]
- :EnumerableMap: pass:normal[xref:utils.adoc#EnumerableMap[`EnumerableMap`]]
- :DoubleEndedQueue: pass:normal[xref:utils.adoc#DoubleEndedQueue[`DoubleEndedQueue`]]
- :CircularBuffer: pass:normal[xref:utils.adoc#CircularBuffer[`CircularBuffer`]]
- :Checkpoints: pass:normal[xref:utils.adoc#Checkpoints[`Checkpoints`]]
- :Heap: pass:normal[xref:utils.adoc#Heap[`Heap`]]
- :MerkleTree: pass:normal[xref:utils.adoc#MerkleTree[`MerkleTree`]]
- :Create2: pass:normal[xref:utils.adoc#Create2[`Create2`]]
- :Address: pass:normal[xref:utils.adoc#Address[`Address`]]
- :Arrays: pass:normal[xref:utils.adoc#Arrays[`Arrays`]]
- :Base64: pass:normal[xref:utils.adoc#Base64[`Base64`]]
- :Bytes: pass:normal[xref:utils.adoc#Bytes[`Bytes`]]
- :Calldata: pass:normal[xref:utils.adoc#Calldata[`Calldata`]]
- :Strings: pass:normal[xref:utils.adoc#Strings[`Strings`]]
- :ShortStrings: pass:normal[xref:utils.adoc#ShortStrings[`ShortStrings`]]
- :SlotDerivation: pass:normal[xref:utils.adoc#SlotDerivation[`SlotDerivation`]]
- :StorageSlot: pass:normal[xref:utils.adoc#StorageSlot[`StorageSlot`]]
- :TransientSlot: pass:normal[xref:utils.adoc#TransientSlot[`TransientSlot`]]
- :Multicall: pass:normal[xref:utils.adoc#Multicall[`Multicall`]]
- :Context: pass:normal[xref:utils.adoc#Context[`Context`]]
- :Packing: pass:normal[xref:utils.adoc#Packing[`Packing`]]
- :Panic: pass:normal[xref:utils.adoc#Panic[`Panic`]]
- :Comparators: pass:normal[xref:utils.adoc#Comparators[`Comparators`]]
- :Heap: pass:normal[xref:utils.adoc#Heap[`Heap`]]
- :CAIP2: pass:normal[xref:utils.adoc#CAIP2[`CAIP2`]]
- :CAIP10: pass:normal[xref:utils.adoc#CAIP10[`CAIP10`]]
- :Blockhash: pass:normal[xref:utils.adoc#Blockhash[`Blockhash`]]
- :Time: pass:normal[xref:utils.adoc#Time[`Time`]]
- :EnumerableMap: pass:normal[xref:utils.adoc#EnumerableMap[`EnumerableMap`]]
- :EnumerableSet: pass:normal[xref:utils.adoc#EnumerableSet[`EnumerableSet`]]
- :xref-Math-add512-uint256-uint256-: xref:utils.adoc#Math-add512-uint256-uint256-
- :xref-Math-mul512-uint256-uint256-: xref:utils.adoc#Math-mul512-uint256-uint256-
- :xref-Math-tryAdd-uint256-uint256-: xref:utils.adoc#Math-tryAdd-uint256-uint256-
- :xref-Math-trySub-uint256-uint256-: xref:utils.adoc#Math-trySub-uint256-uint256-
- :xref-Math-tryMul-uint256-uint256-: xref:utils.adoc#Math-tryMul-uint256-uint256-
- :xref-Math-tryDiv-uint256-uint256-: xref:utils.adoc#Math-tryDiv-uint256-uint256-
- :xref-Math-tryMod-uint256-uint256-: xref:utils.adoc#Math-tryMod-uint256-uint256-
- :xref-Math-saturatingAdd-uint256-uint256-: xref:utils.adoc#Math-saturatingAdd-uint256-uint256-
- :xref-Math-saturatingSub-uint256-uint256-: xref:utils.adoc#Math-saturatingSub-uint256-uint256-
- :xref-Math-saturatingMul-uint256-uint256-: xref:utils.adoc#Math-saturatingMul-uint256-uint256-
- :xref-Math-ternary-bool-uint256-uint256-: xref:utils.adoc#Math-ternary-bool-uint256-uint256-
- :xref-Math-max-uint256-uint256-: xref:utils.adoc#Math-max-uint256-uint256-
- :xref-Math-min-uint256-uint256-: xref:utils.adoc#Math-min-uint256-uint256-
- :xref-Math-average-uint256-uint256-: xref:utils.adoc#Math-average-uint256-uint256-
- :xref-Math-ceilDiv-uint256-uint256-: xref:utils.adoc#Math-ceilDiv-uint256-uint256-
- :xref-Math-mulDiv-uint256-uint256-uint256-: xref:utils.adoc#Math-mulDiv-uint256-uint256-uint256-
- :xref-Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-: xref:utils.adoc#Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-
- :xref-Math-mulShr-uint256-uint256-uint8-: xref:utils.adoc#Math-mulShr-uint256-uint256-uint8-
- :xref-Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-: xref:utils.adoc#Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-
- :xref-Math-invMod-uint256-uint256-: xref:utils.adoc#Math-invMod-uint256-uint256-
- :xref-Math-invModPrime-uint256-uint256-: xref:utils.adoc#Math-invModPrime-uint256-uint256-
- :xref-Math-modExp-uint256-uint256-uint256-: xref:utils.adoc#Math-modExp-uint256-uint256-uint256-
- :xref-Math-tryModExp-uint256-uint256-uint256-: xref:utils.adoc#Math-tryModExp-uint256-uint256-uint256-
- :xref-Math-modExp-bytes-bytes-bytes-: xref:utils.adoc#Math-modExp-bytes-bytes-bytes-
- :xref-Math-tryModExp-bytes-bytes-bytes-: xref:utils.adoc#Math-tryModExp-bytes-bytes-bytes-
- :xref-Math-sqrt-uint256-: xref:utils.adoc#Math-sqrt-uint256-
- :xref-Math-sqrt-uint256-enum-Math-Rounding-: xref:utils.adoc#Math-sqrt-uint256-enum-Math-Rounding-
- :xref-Math-log2-uint256-: xref:utils.adoc#Math-log2-uint256-
- :xref-Math-log2-uint256-enum-Math-Rounding-: xref:utils.adoc#Math-log2-uint256-enum-Math-Rounding-
- :xref-Math-log10-uint256-: xref:utils.adoc#Math-log10-uint256-
- :xref-Math-log10-uint256-enum-Math-Rounding-: xref:utils.adoc#Math-log10-uint256-enum-Math-Rounding-
- :xref-Math-log256-uint256-: xref:utils.adoc#Math-log256-uint256-
- :xref-Math-log256-uint256-enum-Math-Rounding-: xref:utils.adoc#Math-log256-uint256-enum-Math-Rounding-
- :xref-Math-unsignedRoundsUp-enum-Math-Rounding-: xref:utils.adoc#Math-unsignedRoundsUp-enum-Math-Rounding-
- :xref-SignedMath-ternary-bool-int256-int256-: xref:utils.adoc#SignedMath-ternary-bool-int256-int256-
- :xref-SignedMath-max-int256-int256-: xref:utils.adoc#SignedMath-max-int256-int256-
- :xref-SignedMath-min-int256-int256-: xref:utils.adoc#SignedMath-min-int256-int256-
- :xref-SignedMath-average-int256-int256-: xref:utils.adoc#SignedMath-average-int256-int256-
- :xref-SignedMath-abs-int256-: xref:utils.adoc#SignedMath-abs-int256-
- :xref-SafeCast-toUint248-uint256-: xref:utils.adoc#SafeCast-toUint248-uint256-
- :xref-SafeCast-toUint240-uint256-: xref:utils.adoc#SafeCast-toUint240-uint256-
- :xref-SafeCast-toUint232-uint256-: xref:utils.adoc#SafeCast-toUint232-uint256-
- :xref-SafeCast-toUint224-uint256-: xref:utils.adoc#SafeCast-toUint224-uint256-
- :xref-SafeCast-toUint216-uint256-: xref:utils.adoc#SafeCast-toUint216-uint256-
- :xref-SafeCast-toUint208-uint256-: xref:utils.adoc#SafeCast-toUint208-uint256-
- :xref-SafeCast-toUint200-uint256-: xref:utils.adoc#SafeCast-toUint200-uint256-
- :xref-SafeCast-toUint192-uint256-: xref:utils.adoc#SafeCast-toUint192-uint256-
- :xref-SafeCast-toUint184-uint256-: xref:utils.adoc#SafeCast-toUint184-uint256-
- :xref-SafeCast-toUint176-uint256-: xref:utils.adoc#SafeCast-toUint176-uint256-
- :xref-SafeCast-toUint168-uint256-: xref:utils.adoc#SafeCast-toUint168-uint256-
- :xref-SafeCast-toUint160-uint256-: xref:utils.adoc#SafeCast-toUint160-uint256-
- :xref-SafeCast-toUint152-uint256-: xref:utils.adoc#SafeCast-toUint152-uint256-
- :xref-SafeCast-toUint144-uint256-: xref:utils.adoc#SafeCast-toUint144-uint256-
- :xref-SafeCast-toUint136-uint256-: xref:utils.adoc#SafeCast-toUint136-uint256-
- :xref-SafeCast-toUint128-uint256-: xref:utils.adoc#SafeCast-toUint128-uint256-
- :xref-SafeCast-toUint120-uint256-: xref:utils.adoc#SafeCast-toUint120-uint256-
- :xref-SafeCast-toUint112-uint256-: xref:utils.adoc#SafeCast-toUint112-uint256-
- :xref-SafeCast-toUint104-uint256-: xref:utils.adoc#SafeCast-toUint104-uint256-
- :xref-SafeCast-toUint96-uint256-: xref:utils.adoc#SafeCast-toUint96-uint256-
- :xref-SafeCast-toUint88-uint256-: xref:utils.adoc#SafeCast-toUint88-uint256-
- :xref-SafeCast-toUint80-uint256-: xref:utils.adoc#SafeCast-toUint80-uint256-
- :xref-SafeCast-toUint72-uint256-: xref:utils.adoc#SafeCast-toUint72-uint256-
- :xref-SafeCast-toUint64-uint256-: xref:utils.adoc#SafeCast-toUint64-uint256-
- :xref-SafeCast-toUint56-uint256-: xref:utils.adoc#SafeCast-toUint56-uint256-
- :xref-SafeCast-toUint48-uint256-: xref:utils.adoc#SafeCast-toUint48-uint256-
- :xref-SafeCast-toUint40-uint256-: xref:utils.adoc#SafeCast-toUint40-uint256-
- :xref-SafeCast-toUint32-uint256-: xref:utils.adoc#SafeCast-toUint32-uint256-
- :xref-SafeCast-toUint24-uint256-: xref:utils.adoc#SafeCast-toUint24-uint256-
- :xref-SafeCast-toUint16-uint256-: xref:utils.adoc#SafeCast-toUint16-uint256-
- :xref-SafeCast-toUint8-uint256-: xref:utils.adoc#SafeCast-toUint8-uint256-
- :xref-SafeCast-toUint256-int256-: xref:utils.adoc#SafeCast-toUint256-int256-
- :xref-SafeCast-toInt248-int256-: xref:utils.adoc#SafeCast-toInt248-int256-
- :xref-SafeCast-toInt240-int256-: xref:utils.adoc#SafeCast-toInt240-int256-
- :xref-SafeCast-toInt232-int256-: xref:utils.adoc#SafeCast-toInt232-int256-
- :xref-SafeCast-toInt224-int256-: xref:utils.adoc#SafeCast-toInt224-int256-
- :xref-SafeCast-toInt216-int256-: xref:utils.adoc#SafeCast-toInt216-int256-
- :xref-SafeCast-toInt208-int256-: xref:utils.adoc#SafeCast-toInt208-int256-
- :xref-SafeCast-toInt200-int256-: xref:utils.adoc#SafeCast-toInt200-int256-
- :xref-SafeCast-toInt192-int256-: xref:utils.adoc#SafeCast-toInt192-int256-
- :xref-SafeCast-toInt184-int256-: xref:utils.adoc#SafeCast-toInt184-int256-
- :xref-SafeCast-toInt176-int256-: xref:utils.adoc#SafeCast-toInt176-int256-
- :xref-SafeCast-toInt168-int256-: xref:utils.adoc#SafeCast-toInt168-int256-
- :xref-SafeCast-toInt160-int256-: xref:utils.adoc#SafeCast-toInt160-int256-
- :xref-SafeCast-toInt152-int256-: xref:utils.adoc#SafeCast-toInt152-int256-
- :xref-SafeCast-toInt144-int256-: xref:utils.adoc#SafeCast-toInt144-int256-
- :xref-SafeCast-toInt136-int256-: xref:utils.adoc#SafeCast-toInt136-int256-
- :xref-SafeCast-toInt128-int256-: xref:utils.adoc#SafeCast-toInt128-int256-
- :xref-SafeCast-toInt120-int256-: xref:utils.adoc#SafeCast-toInt120-int256-
- :xref-SafeCast-toInt112-int256-: xref:utils.adoc#SafeCast-toInt112-int256-
- :xref-SafeCast-toInt104-int256-: xref:utils.adoc#SafeCast-toInt104-int256-
- :xref-SafeCast-toInt96-int256-: xref:utils.adoc#SafeCast-toInt96-int256-
- :xref-SafeCast-toInt88-int256-: xref:utils.adoc#SafeCast-toInt88-int256-
- :xref-SafeCast-toInt80-int256-: xref:utils.adoc#SafeCast-toInt80-int256-
- :xref-SafeCast-toInt72-int256-: xref:utils.adoc#SafeCast-toInt72-int256-
- :xref-SafeCast-toInt64-int256-: xref:utils.adoc#SafeCast-toInt64-int256-
- :xref-SafeCast-toInt56-int256-: xref:utils.adoc#SafeCast-toInt56-int256-
- :xref-SafeCast-toInt48-int256-: xref:utils.adoc#SafeCast-toInt48-int256-
- :xref-SafeCast-toInt40-int256-: xref:utils.adoc#SafeCast-toInt40-int256-
- :xref-SafeCast-toInt32-int256-: xref:utils.adoc#SafeCast-toInt32-int256-
- :xref-SafeCast-toInt24-int256-: xref:utils.adoc#SafeCast-toInt24-int256-
- :xref-SafeCast-toInt16-int256-: xref:utils.adoc#SafeCast-toInt16-int256-
- :xref-SafeCast-toInt8-int256-: xref:utils.adoc#SafeCast-toInt8-int256-
- :xref-SafeCast-toInt256-uint256-: xref:utils.adoc#SafeCast-toInt256-uint256-
- :xref-SafeCast-toUint-bool-: xref:utils.adoc#SafeCast-toUint-bool-
- :xref-SafeCast-SafeCastOverflowedUintDowncast-uint8-uint256-: xref:utils.adoc#SafeCast-SafeCastOverflowedUintDowncast-uint8-uint256-
- :xref-SafeCast-SafeCastOverflowedIntToUint-int256-: xref:utils.adoc#SafeCast-SafeCastOverflowedIntToUint-int256-
- :xref-SafeCast-SafeCastOverflowedIntDowncast-uint8-int256-: xref:utils.adoc#SafeCast-SafeCastOverflowedIntDowncast-uint8-int256-
- :xref-SafeCast-SafeCastOverflowedUintToInt-uint256-: xref:utils.adoc#SafeCast-SafeCastOverflowedUintToInt-uint256-
- :ReentrancyGuardTransient: pass:normal[xref:utils.adoc#ReentrancyGuardTransient[`ReentrancyGuardTransient`]]
- :xref-ReentrancyGuard-nonReentrant--: xref:utils.adoc#ReentrancyGuard-nonReentrant--
- :xref-ReentrancyGuard-constructor--: xref:utils.adoc#ReentrancyGuard-constructor--
- :xref-ReentrancyGuard-_reentrancyGuardEntered--: xref:utils.adoc#ReentrancyGuard-_reentrancyGuardEntered--
- :xref-ReentrancyGuard-ReentrancyGuardReentrantCall--: xref:utils.adoc#ReentrancyGuard-ReentrancyGuardReentrantCall--
- :ReentrancyGuard: pass:normal[xref:utils.adoc#ReentrancyGuard[`ReentrancyGuard`]]
- :xref-ReentrancyGuardTransient-nonReentrant--: xref:utils.adoc#ReentrancyGuardTransient-nonReentrant--
- :xref-ReentrancyGuardTransient-_reentrancyGuardEntered--: xref:utils.adoc#ReentrancyGuardTransient-_reentrancyGuardEntered--
- :xref-ReentrancyGuardTransient-ReentrancyGuardReentrantCall--: xref:utils.adoc#ReentrancyGuardTransient-ReentrancyGuardReentrantCall--
- :xref-Pausable-whenNotPaused--: xref:utils.adoc#Pausable-whenNotPaused--
- :xref-Pausable-whenPaused--: xref:utils.adoc#Pausable-whenPaused--
- :xref-Pausable-paused--: xref:utils.adoc#Pausable-paused--
- :xref-Pausable-_requireNotPaused--: xref:utils.adoc#Pausable-_requireNotPaused--
- :xref-Pausable-_requirePaused--: xref:utils.adoc#Pausable-_requirePaused--
- :xref-Pausable-_pause--: xref:utils.adoc#Pausable-_pause--
- :xref-Pausable-_unpause--: xref:utils.adoc#Pausable-_unpause--
- :xref-Pausable-Paused-address-: xref:utils.adoc#Pausable-Paused-address-
- :xref-Pausable-Unpaused-address-: xref:utils.adoc#Pausable-Unpaused-address-
- :xref-Pausable-EnforcedPause--: xref:utils.adoc#Pausable-EnforcedPause--
- :xref-Pausable-ExpectedPause--: xref:utils.adoc#Pausable-ExpectedPause--
- :xref-Nonces-nonces-address-: xref:utils.adoc#Nonces-nonces-address-
- :xref-Nonces-_useNonce-address-: xref:utils.adoc#Nonces-_useNonce-address-
- :xref-Nonces-_useCheckedNonce-address-uint256-: xref:utils.adoc#Nonces-_useCheckedNonce-address-uint256-
- :xref-Nonces-InvalidAccountNonce-address-uint256-: xref:utils.adoc#Nonces-InvalidAccountNonce-address-uint256-
- :Nonces: pass:normal[xref:utils.adoc#Nonces[`Nonces`]]
- :Nonces: pass:normal[xref:utils.adoc#Nonces[`Nonces`]]
- :Nonces: pass:normal[xref:utils.adoc#Nonces[`Nonces`]]
- :NoncesKeyed: pass:normal[xref:utils.adoc#NoncesKeyed[`NoncesKeyed`]]
- :xref-NoncesKeyed-nonces-address-uint192-: xref:utils.adoc#NoncesKeyed-nonces-address-uint192-
- :xref-NoncesKeyed-_useNonce-address-uint192-: xref:utils.adoc#NoncesKeyed-_useNonce-address-uint192-
- :xref-NoncesKeyed-_useCheckedNonce-address-uint256-: xref:utils.adoc#NoncesKeyed-_useCheckedNonce-address-uint256-
- :xref-NoncesKeyed-_useCheckedNonce-address-uint192-uint64-: xref:utils.adoc#NoncesKeyed-_useCheckedNonce-address-uint192-uint64-
- :xref-Nonces-nonces-address-: xref:utils.adoc#Nonces-nonces-address-
- :xref-Nonces-_useNonce-address-: xref:utils.adoc#Nonces-_useNonce-address-
- :xref-Nonces-InvalidAccountNonce-address-uint256-: xref:utils.adoc#Nonces-InvalidAccountNonce-address-uint256-
- :ERC165Checker: pass:normal[xref:utils.adoc#ERC165Checker[`ERC165Checker`]]
- :ERC165: pass:normal[xref:utils.adoc#ERC165[`ERC165`]]
- :xref-IERC165-supportsInterface-bytes4-: xref:utils.adoc#IERC165-supportsInterface-bytes4-
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :xref-ERC165-supportsInterface-bytes4-: xref:utils.adoc#ERC165-supportsInterface-bytes4-
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :xref-ERC165Checker-supportsERC165-address-: xref:utils.adoc#ERC165Checker-supportsERC165-address-
- :xref-ERC165Checker-supportsInterface-address-bytes4-: xref:utils.adoc#ERC165Checker-supportsInterface-address-bytes4-
- :xref-ERC165Checker-getSupportedInterfaces-address-bytes4---: xref:utils.adoc#ERC165Checker-getSupportedInterfaces-address-bytes4---
- :xref-ERC165Checker-supportsAllInterfaces-address-bytes4---: xref:utils.adoc#ERC165Checker-supportsAllInterfaces-address-bytes4---
- :xref-ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-: xref:utils.adoc#ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :IERC165-supportsInterface: pass:normal[xref:utils.adoc#IERC165-supportsInterface-bytes4-[`IERC165.supportsInterface`]]
- :IERC165-supportsInterface: pass:normal[xref:utils.adoc#IERC165-supportsInterface-bytes4-[`IERC165.supportsInterface`]]
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :IERC165: pass:normal[xref:utils.adoc#IERC165[`IERC165`]]
- :IERC165-supportsInterface: pass:normal[xref:utils.adoc#IERC165-supportsInterface-bytes4-[`IERC165.supportsInterface`]]
- :xref-BitMaps-get-struct-BitMaps-BitMap-uint256-: xref:utils.adoc#BitMaps-get-struct-BitMaps-BitMap-uint256-
- :xref-BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-: xref:utils.adoc#BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-
- :xref-BitMaps-set-struct-BitMaps-BitMap-uint256-: xref:utils.adoc#BitMaps-set-struct-BitMaps-BitMap-uint256-
- :xref-BitMaps-unset-struct-BitMaps-BitMap-uint256-: xref:utils.adoc#BitMaps-unset-struct-BitMaps-BitMap-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-
- :xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-
- :xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-
- :xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-
- :xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-
- :xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-
- :xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-
- :xref-EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-
- :xref-EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-
- :xref-EnumerableMap-length-struct-EnumerableMap-UintToUintMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-UintToUintMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-
- :xref-EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-
- :xref-EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-
- :xref-EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-
- :xref-EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-
- :xref-EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-
- :xref-EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-
- :xref-EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-
- :xref-EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-
- :xref-EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-
- :xref-EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-
- :xref-EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-
- :xref-EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-
- :xref-EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-
- :xref-EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-
- :xref-EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-
- :xref-EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-
- :xref-EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-
- :xref-EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-
- :xref-EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-
- :xref-EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-
- :xref-EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-
- :xref-EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-
- :xref-EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-
- :xref-EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-
- :xref-EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-
- :xref-EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-
- :xref-EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-
- :xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-
- :xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-
- :xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-
- :xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-
- :xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-
- :xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-
- :xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-
- :xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-
- :xref-EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-: xref:utils.adoc#EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-
- :xref-EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-: xref:utils.adoc#EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-
- :xref-EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-: xref:utils.adoc#EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-
- :xref-EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-: xref:utils.adoc#EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-
- :xref-EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-: xref:utils.adoc#EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-
- :xref-EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-: xref:utils.adoc#EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-
- :xref-EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-: xref:utils.adoc#EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-
- :xref-EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-: xref:utils.adoc#EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-
- :xref-EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-
- :xref-EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-: xref:utils.adoc#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-
- :xref-EnumerableMap-EnumerableMapNonexistentKey-bytes32-: xref:utils.adoc#EnumerableMap-EnumerableMapNonexistentKey-bytes32-
- :xref-EnumerableMap-EnumerableMapNonexistentBytesKey-bytes-: xref:utils.adoc#EnumerableMap-EnumerableMapNonexistentBytesKey-bytes-
- :xref-EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-
- :xref-EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-
- :xref-EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-: xref:utils.adoc#EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-
- :xref-EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-
- :xref-EnumerableSet-length-struct-EnumerableSet-Bytes32Set-: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-Bytes32Set-
- :xref-EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-: xref:utils.adoc#EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-
- :xref-EnumerableSet-values-struct-EnumerableSet-Bytes32Set-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-
- :xref-EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-
- :xref-EnumerableSet-add-struct-EnumerableSet-AddressSet-address-: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-AddressSet-address-
- :xref-EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-
- :xref-EnumerableSet-clear-struct-EnumerableSet-AddressSet-: xref:utils.adoc#EnumerableSet-clear-struct-EnumerableSet-AddressSet-
- :xref-EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-
- :xref-EnumerableSet-length-struct-EnumerableSet-AddressSet-: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-AddressSet-
- :xref-EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-: xref:utils.adoc#EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-
- :xref-EnumerableSet-values-struct-EnumerableSet-AddressSet-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-AddressSet-
- :xref-EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-
- :xref-EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-
- :xref-EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-
- :xref-EnumerableSet-clear-struct-EnumerableSet-UintSet-: xref:utils.adoc#EnumerableSet-clear-struct-EnumerableSet-UintSet-
- :xref-EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-
- :xref-EnumerableSet-length-struct-EnumerableSet-UintSet-: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-UintSet-
- :xref-EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-: xref:utils.adoc#EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-
- :xref-EnumerableSet-values-struct-EnumerableSet-UintSet-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-UintSet-
- :xref-EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-
- :xref-EnumerableSet-add-struct-EnumerableSet-StringSet-string-: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-StringSet-string-
- :xref-EnumerableSet-remove-struct-EnumerableSet-StringSet-string-: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-StringSet-string-
- :xref-EnumerableSet-clear-struct-EnumerableSet-StringSet-: xref:utils.adoc#EnumerableSet-clear-struct-EnumerableSet-StringSet-
- :xref-EnumerableSet-contains-struct-EnumerableSet-StringSet-string-: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-StringSet-string-
- :xref-EnumerableSet-length-struct-EnumerableSet-StringSet-: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-StringSet-
- :xref-EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-: xref:utils.adoc#EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-
- :xref-EnumerableSet-values-struct-EnumerableSet-StringSet-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-StringSet-
- :xref-EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-
- :xref-EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-
- :xref-EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-
- :xref-EnumerableSet-clear-struct-EnumerableSet-BytesSet-: xref:utils.adoc#EnumerableSet-clear-struct-EnumerableSet-BytesSet-
- :xref-EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-
- :xref-EnumerableSet-length-struct-EnumerableSet-BytesSet-: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-BytesSet-
- :xref-EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-: xref:utils.adoc#EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-
- :xref-EnumerableSet-values-struct-EnumerableSet-BytesSet-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-BytesSet-
- :xref-EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-: xref:utils.adoc#EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-
- :xref-DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-: xref:utils.adoc#DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-
- :xref-DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-: xref:utils.adoc#DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-
- :xref-DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-: xref:utils.adoc#DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-
- :xref-DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-
- :xref-DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-: xref:utils.adoc#DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-
- :Panic-RESOURCE_ERROR: pass:normal[xref:utils.adoc#Panic-RESOURCE_ERROR-uint256[`Panic.RESOURCE_ERROR`]]
- :Panic-EMPTY_ARRAY_POP: pass:normal[xref:utils.adoc#Panic-EMPTY_ARRAY_POP-uint256[`Panic.EMPTY_ARRAY_POP`]]
- :Panic-RESOURCE_ERROR: pass:normal[xref:utils.adoc#Panic-RESOURCE_ERROR-uint256[`Panic.RESOURCE_ERROR`]]
- :Panic-EMPTY_ARRAY_POP: pass:normal[xref:utils.adoc#Panic-EMPTY_ARRAY_POP-uint256[`Panic.EMPTY_ARRAY_POP`]]
- :Panic-ARRAY_OUT_OF_BOUNDS: pass:normal[xref:utils.adoc#Panic-ARRAY_OUT_OF_BOUNDS-uint256[`Panic.ARRAY_OUT_OF_BOUNDS`]]
- :Panic-ARRAY_OUT_OF_BOUNDS: pass:normal[xref:utils.adoc#Panic-ARRAY_OUT_OF_BOUNDS-uint256[`Panic.ARRAY_OUT_OF_BOUNDS`]]
- :Panic-ARRAY_OUT_OF_BOUNDS: pass:normal[xref:utils.adoc#Panic-ARRAY_OUT_OF_BOUNDS-uint256[`Panic.ARRAY_OUT_OF_BOUNDS`]]
- :xref-CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-: xref:utils.adoc#CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-
- :xref-CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-: xref:utils.adoc#CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-
- :xref-CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-: xref:utils.adoc#CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-
- :xref-CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-: xref:utils.adoc#CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-
- :xref-CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-: xref:utils.adoc#CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-
- :xref-CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-: xref:utils.adoc#CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-
- :xref-CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-: xref:utils.adoc#CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-
- :xref-CircularBuffer-InvalidBufferSize--: xref:utils.adoc#CircularBuffer-InvalidBufferSize--
- :Panic-ARRAY_OUT_OF_BOUNDS: pass:normal[xref:utils.adoc#Panic-ARRAY_OUT_OF_BOUNDS-uint256[`Panic.ARRAY_OUT_OF_BOUNDS`]]
- :Votes: pass:normal[xref:governance.adoc#Votes[`Votes`]]
- :xref-Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-: xref:utils.adoc#Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-
- :xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-: xref:utils.adoc#Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-
- :xref-Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-: xref:utils.adoc#Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-
- :xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-: xref:utils.adoc#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-
- :xref-Checkpoints-latest-struct-Checkpoints-Trace224-: xref:utils.adoc#Checkpoints-latest-struct-Checkpoints-Trace224-
- :xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-: xref:utils.adoc#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-
- :xref-Checkpoints-length-struct-Checkpoints-Trace224-: xref:utils.adoc#Checkpoints-length-struct-Checkpoints-Trace224-
- :xref-Checkpoints-at-struct-Checkpoints-Trace224-uint32-: xref:utils.adoc#Checkpoints-at-struct-Checkpoints-Trace224-uint32-
- :xref-Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-: xref:utils.adoc#Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-
- :xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-: xref:utils.adoc#Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-
- :xref-Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-: xref:utils.adoc#Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-
- :xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-: xref:utils.adoc#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-
- :xref-Checkpoints-latest-struct-Checkpoints-Trace208-: xref:utils.adoc#Checkpoints-latest-struct-Checkpoints-Trace208-
- :xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-: xref:utils.adoc#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-
- :xref-Checkpoints-length-struct-Checkpoints-Trace208-: xref:utils.adoc#Checkpoints-length-struct-Checkpoints-Trace208-
- :xref-Checkpoints-at-struct-Checkpoints-Trace208-uint32-: xref:utils.adoc#Checkpoints-at-struct-Checkpoints-Trace208-uint32-
- :xref-Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-: xref:utils.adoc#Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-
- :xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-: xref:utils.adoc#Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-
- :xref-Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-: xref:utils.adoc#Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-
- :xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-: xref:utils.adoc#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-
- :xref-Checkpoints-latest-struct-Checkpoints-Trace160-: xref:utils.adoc#Checkpoints-latest-struct-Checkpoints-Trace160-
- :xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-: xref:utils.adoc#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-
- :xref-Checkpoints-length-struct-Checkpoints-Trace160-: xref:utils.adoc#Checkpoints-length-struct-Checkpoints-Trace160-
- :xref-Checkpoints-at-struct-Checkpoints-Trace160-uint32-: xref:utils.adoc#Checkpoints-at-struct-Checkpoints-Trace160-uint32-
- :xref-Checkpoints-CheckpointUnorderedInsertion--: xref:utils.adoc#Checkpoints-CheckpointUnorderedInsertion--
- :xref-Heap-peek-struct-Heap-Uint256Heap-: xref:utils.adoc#Heap-peek-struct-Heap-Uint256Heap-
- :xref-Heap-pop-struct-Heap-Uint256Heap-: xref:utils.adoc#Heap-pop-struct-Heap-Uint256Heap-
- :xref-Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--: xref:utils.adoc#Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--
- :xref-Heap-insert-struct-Heap-Uint256Heap-uint256-: xref:utils.adoc#Heap-insert-struct-Heap-Uint256Heap-uint256-
- :xref-Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--: xref:utils.adoc#Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--
- :xref-Heap-replace-struct-Heap-Uint256Heap-uint256-: xref:utils.adoc#Heap-replace-struct-Heap-Uint256Heap-uint256-
- :xref-Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--: xref:utils.adoc#Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--
- :xref-Heap-length-struct-Heap-Uint256Heap-: xref:utils.adoc#Heap-length-struct-Heap-Uint256Heap-
- :xref-Heap-clear-struct-Heap-Uint256Heap-: xref:utils.adoc#Heap-clear-struct-Heap-Uint256Heap-
- :MerkleProof: pass:normal[xref:utils/cryptography.adoc#MerkleProof[`MerkleProof`]]
- :Hashes-commutativeKeccak256: pass:normal[xref:utils/cryptography.adoc#Hashes-commutativeKeccak256-bytes32-bytes32-[`Hashes.commutativeKeccak256`]]
- :MerkleProof: pass:normal[xref:utils/cryptography.adoc#MerkleProof[`MerkleProof`]]
- :xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-: xref:utils.adoc#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-
- :xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--: xref:utils.adoc#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--
- :xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-: xref:utils.adoc#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-
- :xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--: xref:utils.adoc#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--
- :xref-MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---: xref:utils.adoc#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---
- :xref-MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--: xref:utils.adoc#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--
- :xref-MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-: xref:utils.adoc#MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-
- :xref-MerkleTree-MerkleTreeUpdateInvalidIndex-uint256-uint256-: xref:utils.adoc#MerkleTree-MerkleTreeUpdateInvalidIndex-uint256-uint256-
- :xref-MerkleTree-MerkleTreeUpdateInvalidProof--: xref:utils.adoc#MerkleTree-MerkleTreeUpdateInvalidProof--
- :Hashes-commutativeKeccak256: pass:normal[xref:utils/cryptography.adoc#Hashes-commutativeKeccak256-bytes32-bytes32-[`Hashes.commutativeKeccak256`]]
- :xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-: xref:utils.adoc#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-
- :xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-: xref:utils.adoc#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-
- :Hashes-commutativeKeccak256: pass:normal[xref:utils/cryptography.adoc#Hashes-commutativeKeccak256-bytes32-bytes32-[`Hashes.commutativeKeccak256`]]
- :xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-: xref:utils.adoc#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-
- :Hashes-commutativeKeccak256: pass:normal[xref:utils/cryptography.adoc#Hashes-commutativeKeccak256-bytes32-bytes32-[`Hashes.commutativeKeccak256`]]
- :xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-: xref:utils.adoc#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-
- :xref-Create2-deploy-uint256-bytes32-bytes-: xref:utils.adoc#Create2-deploy-uint256-bytes32-bytes-
- :xref-Create2-computeAddress-bytes32-bytes32-: xref:utils.adoc#Create2-computeAddress-bytes32-bytes32-
- :xref-Create2-computeAddress-bytes32-bytes32-address-: xref:utils.adoc#Create2-computeAddress-bytes32-bytes32-address-
- :xref-Create2-Create2EmptyBytecode--: xref:utils.adoc#Create2-Create2EmptyBytecode--
- :xref-Address-sendValue-address-payable-uint256-: xref:utils.adoc#Address-sendValue-address-payable-uint256-
- :xref-Address-functionCall-address-bytes-: xref:utils.adoc#Address-functionCall-address-bytes-
- :xref-Address-functionCallWithValue-address-bytes-uint256-: xref:utils.adoc#Address-functionCallWithValue-address-bytes-uint256-
- :xref-Address-functionStaticCall-address-bytes-: xref:utils.adoc#Address-functionStaticCall-address-bytes-
- :xref-Address-functionDelegateCall-address-bytes-: xref:utils.adoc#Address-functionDelegateCall-address-bytes-
- :xref-Address-verifyCallResultFromTarget-address-bool-bytes-: xref:utils.adoc#Address-verifyCallResultFromTarget-address-bool-bytes-
- :xref-Address-verifyCallResult-bool-bytes-: xref:utils.adoc#Address-verifyCallResult-bool-bytes-
- :xref-Address-AddressEmptyCode-address-: xref:utils.adoc#Address-AddressEmptyCode-address-
- :ReentrancyGuard: pass:normal[xref:utils.adoc#ReentrancyGuard[`ReentrancyGuard`]]
- :xref-Address-functionCall-address-bytes-: xref:utils.adoc#Address-functionCall-address-bytes-
- :xref-Address-functionCall-address-bytes-: xref:utils.adoc#Address-functionCall-address-bytes-
- :xref-Address-functionCall-address-bytes-: xref:utils.adoc#Address-functionCall-address-bytes-
- :xref-Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--: xref:utils.adoc#Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--
- :xref-Arrays-sort-uint256---: xref:utils.adoc#Arrays-sort-uint256---
- :xref-Arrays-sort-address---function--address-address--pure-returns--bool--: xref:utils.adoc#Arrays-sort-address---function--address-address--pure-returns--bool--
- :xref-Arrays-sort-address---: xref:utils.adoc#Arrays-sort-address---
- :xref-Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--: xref:utils.adoc#Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--
- :xref-Arrays-sort-bytes32---: xref:utils.adoc#Arrays-sort-bytes32---
- :xref-Arrays-findUpperBound-uint256---uint256-: xref:utils.adoc#Arrays-findUpperBound-uint256---uint256-
- :xref-Arrays-lowerBound-uint256---uint256-: xref:utils.adoc#Arrays-lowerBound-uint256---uint256-
- :xref-Arrays-upperBound-uint256---uint256-: xref:utils.adoc#Arrays-upperBound-uint256---uint256-
- :xref-Arrays-lowerBoundMemory-uint256---uint256-: xref:utils.adoc#Arrays-lowerBoundMemory-uint256---uint256-
- :xref-Arrays-upperBoundMemory-uint256---uint256-: xref:utils.adoc#Arrays-upperBoundMemory-uint256---uint256-
- :xref-Arrays-unsafeAccess-address---uint256-: xref:utils.adoc#Arrays-unsafeAccess-address---uint256-
- :xref-Arrays-unsafeAccess-bytes32---uint256-: xref:utils.adoc#Arrays-unsafeAccess-bytes32---uint256-
- :xref-Arrays-unsafeAccess-uint256---uint256-: xref:utils.adoc#Arrays-unsafeAccess-uint256---uint256-
- :xref-Arrays-unsafeAccess-bytes---uint256-: xref:utils.adoc#Arrays-unsafeAccess-bytes---uint256-
- :xref-Arrays-unsafeAccess-string---uint256-: xref:utils.adoc#Arrays-unsafeAccess-string---uint256-
- :xref-Arrays-unsafeMemoryAccess-address---uint256-: xref:utils.adoc#Arrays-unsafeMemoryAccess-address---uint256-
- :xref-Arrays-unsafeMemoryAccess-bytes32---uint256-: xref:utils.adoc#Arrays-unsafeMemoryAccess-bytes32---uint256-
- :xref-Arrays-unsafeMemoryAccess-uint256---uint256-: xref:utils.adoc#Arrays-unsafeMemoryAccess-uint256---uint256-
- :xref-Arrays-unsafeMemoryAccess-bytes---uint256-: xref:utils.adoc#Arrays-unsafeMemoryAccess-bytes---uint256-
- :xref-Arrays-unsafeMemoryAccess-string---uint256-: xref:utils.adoc#Arrays-unsafeMemoryAccess-string---uint256-
- :xref-Arrays-unsafeSetLength-address---uint256-: xref:utils.adoc#Arrays-unsafeSetLength-address---uint256-
- :xref-Arrays-unsafeSetLength-bytes32---uint256-: xref:utils.adoc#Arrays-unsafeSetLength-bytes32---uint256-
- :xref-Arrays-unsafeSetLength-uint256---uint256-: xref:utils.adoc#Arrays-unsafeSetLength-uint256---uint256-
- :xref-Arrays-unsafeSetLength-bytes---uint256-: xref:utils.adoc#Arrays-unsafeSetLength-bytes---uint256-
- :xref-Arrays-unsafeSetLength-string---uint256-: xref:utils.adoc#Arrays-unsafeSetLength-string---uint256-
- :xref-Base64-encode-bytes-: xref:utils.adoc#Base64-encode-bytes-
- :xref-Base64-encodeURL-bytes-: xref:utils.adoc#Base64-encodeURL-bytes-
- :xref-Base64-_TABLE-string: xref:utils.adoc#Base64-_TABLE-string
- :xref-Base64-_TABLE_URL-string: xref:utils.adoc#Base64-_TABLE_URL-string
- :xref-Bytes-indexOf-bytes-bytes1-: xref:utils.adoc#Bytes-indexOf-bytes-bytes1-
- :xref-Bytes-indexOf-bytes-bytes1-uint256-: xref:utils.adoc#Bytes-indexOf-bytes-bytes1-uint256-
- :xref-Bytes-lastIndexOf-bytes-bytes1-: xref:utils.adoc#Bytes-lastIndexOf-bytes-bytes1-
- :xref-Bytes-lastIndexOf-bytes-bytes1-uint256-: xref:utils.adoc#Bytes-lastIndexOf-bytes-bytes1-uint256-
- :xref-Bytes-slice-bytes-uint256-: xref:utils.adoc#Bytes-slice-bytes-uint256-
- :xref-Bytes-slice-bytes-uint256-uint256-: xref:utils.adoc#Bytes-slice-bytes-uint256-uint256-
- :xref-Calldata-emptyBytes--: xref:utils.adoc#Calldata-emptyBytes--
- :xref-Calldata-emptyString--: xref:utils.adoc#Calldata-emptyString--
- :xref-Strings-toString-uint256-: xref:utils.adoc#Strings-toString-uint256-
- :xref-Strings-toStringSigned-int256-: xref:utils.adoc#Strings-toStringSigned-int256-
- :xref-Strings-toHexString-uint256-: xref:utils.adoc#Strings-toHexString-uint256-
- :xref-Strings-toHexString-uint256-uint256-: xref:utils.adoc#Strings-toHexString-uint256-uint256-
- :xref-Strings-toHexString-address-: xref:utils.adoc#Strings-toHexString-address-
- :xref-Strings-toChecksumHexString-address-: xref:utils.adoc#Strings-toChecksumHexString-address-
- :xref-Strings-equal-string-string-: xref:utils.adoc#Strings-equal-string-string-
- :xref-Strings-parseUint-string-: xref:utils.adoc#Strings-parseUint-string-
- :xref-Strings-parseUint-string-uint256-uint256-: xref:utils.adoc#Strings-parseUint-string-uint256-uint256-
- :xref-Strings-tryParseUint-string-: xref:utils.adoc#Strings-tryParseUint-string-
- :xref-Strings-tryParseUint-string-uint256-uint256-: xref:utils.adoc#Strings-tryParseUint-string-uint256-uint256-
- :xref-Strings-parseInt-string-: xref:utils.adoc#Strings-parseInt-string-
- :xref-Strings-parseInt-string-uint256-uint256-: xref:utils.adoc#Strings-parseInt-string-uint256-uint256-
- :xref-Strings-tryParseInt-string-: xref:utils.adoc#Strings-tryParseInt-string-
- :xref-Strings-tryParseInt-string-uint256-uint256-: xref:utils.adoc#Strings-tryParseInt-string-uint256-uint256-
- :xref-Strings-parseHexUint-string-: xref:utils.adoc#Strings-parseHexUint-string-
- :xref-Strings-parseHexUint-string-uint256-uint256-: xref:utils.adoc#Strings-parseHexUint-string-uint256-uint256-
- :xref-Strings-tryParseHexUint-string-: xref:utils.adoc#Strings-tryParseHexUint-string-
- :xref-Strings-tryParseHexUint-string-uint256-uint256-: xref:utils.adoc#Strings-tryParseHexUint-string-uint256-uint256-
- :xref-Strings-parseAddress-string-: xref:utils.adoc#Strings-parseAddress-string-
- :xref-Strings-parseAddress-string-uint256-uint256-: xref:utils.adoc#Strings-parseAddress-string-uint256-uint256-
- :xref-Strings-tryParseAddress-string-: xref:utils.adoc#Strings-tryParseAddress-string-
- :xref-Strings-tryParseAddress-string-uint256-uint256-: xref:utils.adoc#Strings-tryParseAddress-string-uint256-uint256-
- :xref-Strings-escapeJSON-string-: xref:utils.adoc#Strings-escapeJSON-string-
- :xref-Strings-StringsInsufficientHexLength-uint256-uint256-: xref:utils.adoc#Strings-StringsInsufficientHexLength-uint256-uint256-
- :xref-Strings-StringsInvalidChar--: xref:utils.adoc#Strings-StringsInvalidChar--
- :xref-Strings-StringsInvalidAddressFormat--: xref:utils.adoc#Strings-StringsInvalidAddressFormat--
- :xref-ShortStrings-toShortString-string-: xref:utils.adoc#ShortStrings-toShortString-string-
- :xref-ShortStrings-toString-ShortString-: xref:utils.adoc#ShortStrings-toString-ShortString-
- :xref-ShortStrings-byteLength-ShortString-: xref:utils.adoc#ShortStrings-byteLength-ShortString-
- :xref-ShortStrings-toShortStringWithFallback-string-string-: xref:utils.adoc#ShortStrings-toShortStringWithFallback-string-string-
- :xref-ShortStrings-toStringWithFallback-ShortString-string-: xref:utils.adoc#ShortStrings-toStringWithFallback-ShortString-string-
- :xref-ShortStrings-byteLengthWithFallback-ShortString-string-: xref:utils.adoc#ShortStrings-byteLengthWithFallback-ShortString-string-
- :xref-ShortStrings-StringTooLong-string-: xref:utils.adoc#ShortStrings-StringTooLong-string-
- :xref-ShortStrings-InvalidShortString--: xref:utils.adoc#ShortStrings-InvalidShortString--
- :StorageSlot: pass:normal[xref:utils.adoc#StorageSlot[`StorageSlot`]]
- :xref-SlotDerivation-erc7201Slot-string-: xref:utils.adoc#SlotDerivation-erc7201Slot-string-
- :xref-SlotDerivation-offset-bytes32-uint256-: xref:utils.adoc#SlotDerivation-offset-bytes32-uint256-
- :xref-SlotDerivation-deriveArray-bytes32-: xref:utils.adoc#SlotDerivation-deriveArray-bytes32-
- :xref-SlotDerivation-deriveMapping-bytes32-address-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-address-
- :xref-SlotDerivation-deriveMapping-bytes32-bool-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-bool-
- :xref-SlotDerivation-deriveMapping-bytes32-bytes32-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-bytes32-
- :xref-SlotDerivation-deriveMapping-bytes32-uint256-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-uint256-
- :xref-SlotDerivation-deriveMapping-bytes32-int256-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-int256-
- :xref-SlotDerivation-deriveMapping-bytes32-string-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-string-
- :xref-SlotDerivation-deriveMapping-bytes32-bytes-: xref:utils.adoc#SlotDerivation-deriveMapping-bytes32-bytes-
- :SlotDerivation: pass:normal[xref:utils.adoc#SlotDerivation[`SlotDerivation`]]
- :xref-StorageSlot-getAddressSlot-bytes32-: xref:utils.adoc#StorageSlot-getAddressSlot-bytes32-
- :xref-StorageSlot-getBooleanSlot-bytes32-: xref:utils.adoc#StorageSlot-getBooleanSlot-bytes32-
- :xref-StorageSlot-getBytes32Slot-bytes32-: xref:utils.adoc#StorageSlot-getBytes32Slot-bytes32-
- :xref-StorageSlot-getUint256Slot-bytes32-: xref:utils.adoc#StorageSlot-getUint256Slot-bytes32-
- :xref-StorageSlot-getInt256Slot-bytes32-: xref:utils.adoc#StorageSlot-getInt256Slot-bytes32-
- :xref-StorageSlot-getStringSlot-bytes32-: xref:utils.adoc#StorageSlot-getStringSlot-bytes32-
- :xref-StorageSlot-getStringSlot-string-: xref:utils.adoc#StorageSlot-getStringSlot-string-
- :xref-StorageSlot-getBytesSlot-bytes32-: xref:utils.adoc#StorageSlot-getBytesSlot-bytes32-
- :xref-StorageSlot-getBytesSlot-bytes-: xref:utils.adoc#StorageSlot-getBytesSlot-bytes-
- :SlotDerivation: pass:normal[xref:utils.adoc#SlotDerivation[`SlotDerivation`]]
- :xref-TransientSlot-asAddress-bytes32-: xref:utils.adoc#TransientSlot-asAddress-bytes32-
- :xref-TransientSlot-asBoolean-bytes32-: xref:utils.adoc#TransientSlot-asBoolean-bytes32-
- :xref-TransientSlot-asBytes32-bytes32-: xref:utils.adoc#TransientSlot-asBytes32-bytes32-
- :xref-TransientSlot-asUint256-bytes32-: xref:utils.adoc#TransientSlot-asUint256-bytes32-
- :xref-TransientSlot-asInt256-bytes32-: xref:utils.adoc#TransientSlot-asInt256-bytes32-
- :xref-TransientSlot-tload-TransientSlot-AddressSlot-: xref:utils.adoc#TransientSlot-tload-TransientSlot-AddressSlot-
- :xref-TransientSlot-tstore-TransientSlot-AddressSlot-address-: xref:utils.adoc#TransientSlot-tstore-TransientSlot-AddressSlot-address-
- :xref-TransientSlot-tload-TransientSlot-BooleanSlot-: xref:utils.adoc#TransientSlot-tload-TransientSlot-BooleanSlot-
- :xref-TransientSlot-tstore-TransientSlot-BooleanSlot-bool-: xref:utils.adoc#TransientSlot-tstore-TransientSlot-BooleanSlot-bool-
- :xref-TransientSlot-tload-TransientSlot-Bytes32Slot-: xref:utils.adoc#TransientSlot-tload-TransientSlot-Bytes32Slot-
- :xref-TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-: xref:utils.adoc#TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-
- :xref-TransientSlot-tload-TransientSlot-Uint256Slot-: xref:utils.adoc#TransientSlot-tload-TransientSlot-Uint256Slot-
- :xref-TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-: xref:utils.adoc#TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-
- :xref-TransientSlot-tload-TransientSlot-Int256Slot-: xref:utils.adoc#TransientSlot-tload-TransientSlot-Int256Slot-
- :xref-TransientSlot-tstore-TransientSlot-Int256Slot-int256-: xref:utils.adoc#TransientSlot-tstore-TransientSlot-Int256Slot-int256-
- :Context-_msgSender: pass:normal[xref:utils.adoc#Context-_msgSender--[`Context._msgSender`]]
- :ERC2771Context: pass:normal[xref:metatx.adoc#ERC2771Context[`ERC2771Context`]]
- :Context-_msgSender: pass:normal[xref:utils.adoc#Context-_msgSender--[`Context._msgSender`]]
- :xref-Multicall-multicall-bytes---: xref:utils.adoc#Multicall-multicall-bytes---
- :xref-Context-_msgSender--: xref:utils.adoc#Context-_msgSender--
- :xref-Context-_msgData--: xref:utils.adoc#Context-_msgData--
- :xref-Context-_contextSuffixLength--: xref:utils.adoc#Context-_contextSuffixLength--
- :xref-Packing-pack_1_1-bytes1-bytes1-: xref:utils.adoc#Packing-pack_1_1-bytes1-bytes1-
- :xref-Packing-pack_2_2-bytes2-bytes2-: xref:utils.adoc#Packing-pack_2_2-bytes2-bytes2-
- :xref-Packing-pack_2_4-bytes2-bytes4-: xref:utils.adoc#Packing-pack_2_4-bytes2-bytes4-
- :xref-Packing-pack_2_6-bytes2-bytes6-: xref:utils.adoc#Packing-pack_2_6-bytes2-bytes6-
- :xref-Packing-pack_2_8-bytes2-bytes8-: xref:utils.adoc#Packing-pack_2_8-bytes2-bytes8-
- :xref-Packing-pack_2_10-bytes2-bytes10-: xref:utils.adoc#Packing-pack_2_10-bytes2-bytes10-
- :xref-Packing-pack_2_20-bytes2-bytes20-: xref:utils.adoc#Packing-pack_2_20-bytes2-bytes20-
- :xref-Packing-pack_2_22-bytes2-bytes22-: xref:utils.adoc#Packing-pack_2_22-bytes2-bytes22-
- :xref-Packing-pack_4_2-bytes4-bytes2-: xref:utils.adoc#Packing-pack_4_2-bytes4-bytes2-
- :xref-Packing-pack_4_4-bytes4-bytes4-: xref:utils.adoc#Packing-pack_4_4-bytes4-bytes4-
- :xref-Packing-pack_4_6-bytes4-bytes6-: xref:utils.adoc#Packing-pack_4_6-bytes4-bytes6-
- :xref-Packing-pack_4_8-bytes4-bytes8-: xref:utils.adoc#Packing-pack_4_8-bytes4-bytes8-
- :xref-Packing-pack_4_12-bytes4-bytes12-: xref:utils.adoc#Packing-pack_4_12-bytes4-bytes12-
- :xref-Packing-pack_4_16-bytes4-bytes16-: xref:utils.adoc#Packing-pack_4_16-bytes4-bytes16-
- :xref-Packing-pack_4_20-bytes4-bytes20-: xref:utils.adoc#Packing-pack_4_20-bytes4-bytes20-
- :xref-Packing-pack_4_24-bytes4-bytes24-: xref:utils.adoc#Packing-pack_4_24-bytes4-bytes24-
- :xref-Packing-pack_4_28-bytes4-bytes28-: xref:utils.adoc#Packing-pack_4_28-bytes4-bytes28-
- :xref-Packing-pack_6_2-bytes6-bytes2-: xref:utils.adoc#Packing-pack_6_2-bytes6-bytes2-
- :xref-Packing-pack_6_4-bytes6-bytes4-: xref:utils.adoc#Packing-pack_6_4-bytes6-bytes4-
- :xref-Packing-pack_6_6-bytes6-bytes6-: xref:utils.adoc#Packing-pack_6_6-bytes6-bytes6-
- :xref-Packing-pack_6_10-bytes6-bytes10-: xref:utils.adoc#Packing-pack_6_10-bytes6-bytes10-
- :xref-Packing-pack_6_16-bytes6-bytes16-: xref:utils.adoc#Packing-pack_6_16-bytes6-bytes16-
- :xref-Packing-pack_6_22-bytes6-bytes22-: xref:utils.adoc#Packing-pack_6_22-bytes6-bytes22-
- :xref-Packing-pack_8_2-bytes8-bytes2-: xref:utils.adoc#Packing-pack_8_2-bytes8-bytes2-
- :xref-Packing-pack_8_4-bytes8-bytes4-: xref:utils.adoc#Packing-pack_8_4-bytes8-bytes4-
- :xref-Packing-pack_8_8-bytes8-bytes8-: xref:utils.adoc#Packing-pack_8_8-bytes8-bytes8-
- :xref-Packing-pack_8_12-bytes8-bytes12-: xref:utils.adoc#Packing-pack_8_12-bytes8-bytes12-
- :xref-Packing-pack_8_16-bytes8-bytes16-: xref:utils.adoc#Packing-pack_8_16-bytes8-bytes16-
- :xref-Packing-pack_8_20-bytes8-bytes20-: xref:utils.adoc#Packing-pack_8_20-bytes8-bytes20-
- :xref-Packing-pack_8_24-bytes8-bytes24-: xref:utils.adoc#Packing-pack_8_24-bytes8-bytes24-
- :xref-Packing-pack_10_2-bytes10-bytes2-: xref:utils.adoc#Packing-pack_10_2-bytes10-bytes2-
- :xref-Packing-pack_10_6-bytes10-bytes6-: xref:utils.adoc#Packing-pack_10_6-bytes10-bytes6-
- :xref-Packing-pack_10_10-bytes10-bytes10-: xref:utils.adoc#Packing-pack_10_10-bytes10-bytes10-
- :xref-Packing-pack_10_12-bytes10-bytes12-: xref:utils.adoc#Packing-pack_10_12-bytes10-bytes12-
- :xref-Packing-pack_10_22-bytes10-bytes22-: xref:utils.adoc#Packing-pack_10_22-bytes10-bytes22-
- :xref-Packing-pack_12_4-bytes12-bytes4-: xref:utils.adoc#Packing-pack_12_4-bytes12-bytes4-
- :xref-Packing-pack_12_8-bytes12-bytes8-: xref:utils.adoc#Packing-pack_12_8-bytes12-bytes8-
- :xref-Packing-pack_12_10-bytes12-bytes10-: xref:utils.adoc#Packing-pack_12_10-bytes12-bytes10-
- :xref-Packing-pack_12_12-bytes12-bytes12-: xref:utils.adoc#Packing-pack_12_12-bytes12-bytes12-
- :xref-Packing-pack_12_16-bytes12-bytes16-: xref:utils.adoc#Packing-pack_12_16-bytes12-bytes16-
- :xref-Packing-pack_12_20-bytes12-bytes20-: xref:utils.adoc#Packing-pack_12_20-bytes12-bytes20-
- :xref-Packing-pack_16_4-bytes16-bytes4-: xref:utils.adoc#Packing-pack_16_4-bytes16-bytes4-
- :xref-Packing-pack_16_6-bytes16-bytes6-: xref:utils.adoc#Packing-pack_16_6-bytes16-bytes6-
- :xref-Packing-pack_16_8-bytes16-bytes8-: xref:utils.adoc#Packing-pack_16_8-bytes16-bytes8-
- :xref-Packing-pack_16_12-bytes16-bytes12-: xref:utils.adoc#Packing-pack_16_12-bytes16-bytes12-
- :xref-Packing-pack_16_16-bytes16-bytes16-: xref:utils.adoc#Packing-pack_16_16-bytes16-bytes16-
- :xref-Packing-pack_20_2-bytes20-bytes2-: xref:utils.adoc#Packing-pack_20_2-bytes20-bytes2-
- :xref-Packing-pack_20_4-bytes20-bytes4-: xref:utils.adoc#Packing-pack_20_4-bytes20-bytes4-
- :xref-Packing-pack_20_8-bytes20-bytes8-: xref:utils.adoc#Packing-pack_20_8-bytes20-bytes8-
- :xref-Packing-pack_20_12-bytes20-bytes12-: xref:utils.adoc#Packing-pack_20_12-bytes20-bytes12-
- :xref-Packing-pack_22_2-bytes22-bytes2-: xref:utils.adoc#Packing-pack_22_2-bytes22-bytes2-
- :xref-Packing-pack_22_6-bytes22-bytes6-: xref:utils.adoc#Packing-pack_22_6-bytes22-bytes6-
- :xref-Packing-pack_22_10-bytes22-bytes10-: xref:utils.adoc#Packing-pack_22_10-bytes22-bytes10-
- :xref-Packing-pack_24_4-bytes24-bytes4-: xref:utils.adoc#Packing-pack_24_4-bytes24-bytes4-
- :xref-Packing-pack_24_8-bytes24-bytes8-: xref:utils.adoc#Packing-pack_24_8-bytes24-bytes8-
- :xref-Packing-pack_28_4-bytes28-bytes4-: xref:utils.adoc#Packing-pack_28_4-bytes28-bytes4-
- :xref-Packing-extract_2_1-bytes2-uint8-: xref:utils.adoc#Packing-extract_2_1-bytes2-uint8-
- :xref-Packing-replace_2_1-bytes2-bytes1-uint8-: xref:utils.adoc#Packing-replace_2_1-bytes2-bytes1-uint8-
- :xref-Packing-extract_4_1-bytes4-uint8-: xref:utils.adoc#Packing-extract_4_1-bytes4-uint8-
- :xref-Packing-replace_4_1-bytes4-bytes1-uint8-: xref:utils.adoc#Packing-replace_4_1-bytes4-bytes1-uint8-
- :xref-Packing-extract_4_2-bytes4-uint8-: xref:utils.adoc#Packing-extract_4_2-bytes4-uint8-
- :xref-Packing-replace_4_2-bytes4-bytes2-uint8-: xref:utils.adoc#Packing-replace_4_2-bytes4-bytes2-uint8-
- :xref-Packing-extract_6_1-bytes6-uint8-: xref:utils.adoc#Packing-extract_6_1-bytes6-uint8-
- :xref-Packing-replace_6_1-bytes6-bytes1-uint8-: xref:utils.adoc#Packing-replace_6_1-bytes6-bytes1-uint8-
- :xref-Packing-extract_6_2-bytes6-uint8-: xref:utils.adoc#Packing-extract_6_2-bytes6-uint8-
- :xref-Packing-replace_6_2-bytes6-bytes2-uint8-: xref:utils.adoc#Packing-replace_6_2-bytes6-bytes2-uint8-
- :xref-Packing-extract_6_4-bytes6-uint8-: xref:utils.adoc#Packing-extract_6_4-bytes6-uint8-
- :xref-Packing-replace_6_4-bytes6-bytes4-uint8-: xref:utils.adoc#Packing-replace_6_4-bytes6-bytes4-uint8-
- :xref-Packing-extract_8_1-bytes8-uint8-: xref:utils.adoc#Packing-extract_8_1-bytes8-uint8-
- :xref-Packing-replace_8_1-bytes8-bytes1-uint8-: xref:utils.adoc#Packing-replace_8_1-bytes8-bytes1-uint8-
- :xref-Packing-extract_8_2-bytes8-uint8-: xref:utils.adoc#Packing-extract_8_2-bytes8-uint8-
- :xref-Packing-replace_8_2-bytes8-bytes2-uint8-: xref:utils.adoc#Packing-replace_8_2-bytes8-bytes2-uint8-
- :xref-Packing-extract_8_4-bytes8-uint8-: xref:utils.adoc#Packing-extract_8_4-bytes8-uint8-
- :xref-Packing-replace_8_4-bytes8-bytes4-uint8-: xref:utils.adoc#Packing-replace_8_4-bytes8-bytes4-uint8-
- :xref-Packing-extract_8_6-bytes8-uint8-: xref:utils.adoc#Packing-extract_8_6-bytes8-uint8-
- :xref-Packing-replace_8_6-bytes8-bytes6-uint8-: xref:utils.adoc#Packing-replace_8_6-bytes8-bytes6-uint8-
- :xref-Packing-extract_10_1-bytes10-uint8-: xref:utils.adoc#Packing-extract_10_1-bytes10-uint8-
- :xref-Packing-replace_10_1-bytes10-bytes1-uint8-: xref:utils.adoc#Packing-replace_10_1-bytes10-bytes1-uint8-
- :xref-Packing-extract_10_2-bytes10-uint8-: xref:utils.adoc#Packing-extract_10_2-bytes10-uint8-
- :xref-Packing-replace_10_2-bytes10-bytes2-uint8-: xref:utils.adoc#Packing-replace_10_2-bytes10-bytes2-uint8-
- :xref-Packing-extract_10_4-bytes10-uint8-: xref:utils.adoc#Packing-extract_10_4-bytes10-uint8-
- :xref-Packing-replace_10_4-bytes10-bytes4-uint8-: xref:utils.adoc#Packing-replace_10_4-bytes10-bytes4-uint8-
- :xref-Packing-extract_10_6-bytes10-uint8-: xref:utils.adoc#Packing-extract_10_6-bytes10-uint8-
- :xref-Packing-replace_10_6-bytes10-bytes6-uint8-: xref:utils.adoc#Packing-replace_10_6-bytes10-bytes6-uint8-
- :xref-Packing-extract_10_8-bytes10-uint8-: xref:utils.adoc#Packing-extract_10_8-bytes10-uint8-
- :xref-Packing-replace_10_8-bytes10-bytes8-uint8-: xref:utils.adoc#Packing-replace_10_8-bytes10-bytes8-uint8-
- :xref-Packing-extract_12_1-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_1-bytes12-uint8-
- :xref-Packing-replace_12_1-bytes12-bytes1-uint8-: xref:utils.adoc#Packing-replace_12_1-bytes12-bytes1-uint8-
- :xref-Packing-extract_12_2-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_2-bytes12-uint8-
- :xref-Packing-replace_12_2-bytes12-bytes2-uint8-: xref:utils.adoc#Packing-replace_12_2-bytes12-bytes2-uint8-
- :xref-Packing-extract_12_4-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_4-bytes12-uint8-
- :xref-Packing-replace_12_4-bytes12-bytes4-uint8-: xref:utils.adoc#Packing-replace_12_4-bytes12-bytes4-uint8-
- :xref-Packing-extract_12_6-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_6-bytes12-uint8-
- :xref-Packing-replace_12_6-bytes12-bytes6-uint8-: xref:utils.adoc#Packing-replace_12_6-bytes12-bytes6-uint8-
- :xref-Packing-extract_12_8-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_8-bytes12-uint8-
- :xref-Packing-replace_12_8-bytes12-bytes8-uint8-: xref:utils.adoc#Packing-replace_12_8-bytes12-bytes8-uint8-
- :xref-Packing-extract_12_10-bytes12-uint8-: xref:utils.adoc#Packing-extract_12_10-bytes12-uint8-
- :xref-Packing-replace_12_10-bytes12-bytes10-uint8-: xref:utils.adoc#Packing-replace_12_10-bytes12-bytes10-uint8-
- :xref-Packing-extract_16_1-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_1-bytes16-uint8-
- :xref-Packing-replace_16_1-bytes16-bytes1-uint8-: xref:utils.adoc#Packing-replace_16_1-bytes16-bytes1-uint8-
- :xref-Packing-extract_16_2-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_2-bytes16-uint8-
- :xref-Packing-replace_16_2-bytes16-bytes2-uint8-: xref:utils.adoc#Packing-replace_16_2-bytes16-bytes2-uint8-
- :xref-Packing-extract_16_4-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_4-bytes16-uint8-
- :xref-Packing-replace_16_4-bytes16-bytes4-uint8-: xref:utils.adoc#Packing-replace_16_4-bytes16-bytes4-uint8-
- :xref-Packing-extract_16_6-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_6-bytes16-uint8-
- :xref-Packing-replace_16_6-bytes16-bytes6-uint8-: xref:utils.adoc#Packing-replace_16_6-bytes16-bytes6-uint8-
- :xref-Packing-extract_16_8-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_8-bytes16-uint8-
- :xref-Packing-replace_16_8-bytes16-bytes8-uint8-: xref:utils.adoc#Packing-replace_16_8-bytes16-bytes8-uint8-
- :xref-Packing-extract_16_10-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_10-bytes16-uint8-
- :xref-Packing-replace_16_10-bytes16-bytes10-uint8-: xref:utils.adoc#Packing-replace_16_10-bytes16-bytes10-uint8-
- :xref-Packing-extract_16_12-bytes16-uint8-: xref:utils.adoc#Packing-extract_16_12-bytes16-uint8-
- :xref-Packing-replace_16_12-bytes16-bytes12-uint8-: xref:utils.adoc#Packing-replace_16_12-bytes16-bytes12-uint8-
- :xref-Packing-extract_20_1-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_1-bytes20-uint8-
- :xref-Packing-replace_20_1-bytes20-bytes1-uint8-: xref:utils.adoc#Packing-replace_20_1-bytes20-bytes1-uint8-
- :xref-Packing-extract_20_2-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_2-bytes20-uint8-
- :xref-Packing-replace_20_2-bytes20-bytes2-uint8-: xref:utils.adoc#Packing-replace_20_2-bytes20-bytes2-uint8-
- :xref-Packing-extract_20_4-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_4-bytes20-uint8-
- :xref-Packing-replace_20_4-bytes20-bytes4-uint8-: xref:utils.adoc#Packing-replace_20_4-bytes20-bytes4-uint8-
- :xref-Packing-extract_20_6-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_6-bytes20-uint8-
- :xref-Packing-replace_20_6-bytes20-bytes6-uint8-: xref:utils.adoc#Packing-replace_20_6-bytes20-bytes6-uint8-
- :xref-Packing-extract_20_8-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_8-bytes20-uint8-
- :xref-Packing-replace_20_8-bytes20-bytes8-uint8-: xref:utils.adoc#Packing-replace_20_8-bytes20-bytes8-uint8-
- :xref-Packing-extract_20_10-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_10-bytes20-uint8-
- :xref-Packing-replace_20_10-bytes20-bytes10-uint8-: xref:utils.adoc#Packing-replace_20_10-bytes20-bytes10-uint8-
- :xref-Packing-extract_20_12-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_12-bytes20-uint8-
- :xref-Packing-replace_20_12-bytes20-bytes12-uint8-: xref:utils.adoc#Packing-replace_20_12-bytes20-bytes12-uint8-
- :xref-Packing-extract_20_16-bytes20-uint8-: xref:utils.adoc#Packing-extract_20_16-bytes20-uint8-
- :xref-Packing-replace_20_16-bytes20-bytes16-uint8-: xref:utils.adoc#Packing-replace_20_16-bytes20-bytes16-uint8-
- :xref-Packing-extract_22_1-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_1-bytes22-uint8-
- :xref-Packing-replace_22_1-bytes22-bytes1-uint8-: xref:utils.adoc#Packing-replace_22_1-bytes22-bytes1-uint8-
- :xref-Packing-extract_22_2-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_2-bytes22-uint8-
- :xref-Packing-replace_22_2-bytes22-bytes2-uint8-: xref:utils.adoc#Packing-replace_22_2-bytes22-bytes2-uint8-
- :xref-Packing-extract_22_4-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_4-bytes22-uint8-
- :xref-Packing-replace_22_4-bytes22-bytes4-uint8-: xref:utils.adoc#Packing-replace_22_4-bytes22-bytes4-uint8-
- :xref-Packing-extract_22_6-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_6-bytes22-uint8-
- :xref-Packing-replace_22_6-bytes22-bytes6-uint8-: xref:utils.adoc#Packing-replace_22_6-bytes22-bytes6-uint8-
- :xref-Packing-extract_22_8-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_8-bytes22-uint8-
- :xref-Packing-replace_22_8-bytes22-bytes8-uint8-: xref:utils.adoc#Packing-replace_22_8-bytes22-bytes8-uint8-
- :xref-Packing-extract_22_10-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_10-bytes22-uint8-
- :xref-Packing-replace_22_10-bytes22-bytes10-uint8-: xref:utils.adoc#Packing-replace_22_10-bytes22-bytes10-uint8-
- :xref-Packing-extract_22_12-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_12-bytes22-uint8-
- :xref-Packing-replace_22_12-bytes22-bytes12-uint8-: xref:utils.adoc#Packing-replace_22_12-bytes22-bytes12-uint8-
- :xref-Packing-extract_22_16-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_16-bytes22-uint8-
- :xref-Packing-replace_22_16-bytes22-bytes16-uint8-: xref:utils.adoc#Packing-replace_22_16-bytes22-bytes16-uint8-
- :xref-Packing-extract_22_20-bytes22-uint8-: xref:utils.adoc#Packing-extract_22_20-bytes22-uint8-
- :xref-Packing-replace_22_20-bytes22-bytes20-uint8-: xref:utils.adoc#Packing-replace_22_20-bytes22-bytes20-uint8-
- :xref-Packing-extract_24_1-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_1-bytes24-uint8-
- :xref-Packing-replace_24_1-bytes24-bytes1-uint8-: xref:utils.adoc#Packing-replace_24_1-bytes24-bytes1-uint8-
- :xref-Packing-extract_24_2-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_2-bytes24-uint8-
- :xref-Packing-replace_24_2-bytes24-bytes2-uint8-: xref:utils.adoc#Packing-replace_24_2-bytes24-bytes2-uint8-
- :xref-Packing-extract_24_4-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_4-bytes24-uint8-
- :xref-Packing-replace_24_4-bytes24-bytes4-uint8-: xref:utils.adoc#Packing-replace_24_4-bytes24-bytes4-uint8-
- :xref-Packing-extract_24_6-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_6-bytes24-uint8-
- :xref-Packing-replace_24_6-bytes24-bytes6-uint8-: xref:utils.adoc#Packing-replace_24_6-bytes24-bytes6-uint8-
- :xref-Packing-extract_24_8-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_8-bytes24-uint8-
- :xref-Packing-replace_24_8-bytes24-bytes8-uint8-: xref:utils.adoc#Packing-replace_24_8-bytes24-bytes8-uint8-
- :xref-Packing-extract_24_10-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_10-bytes24-uint8-
- :xref-Packing-replace_24_10-bytes24-bytes10-uint8-: xref:utils.adoc#Packing-replace_24_10-bytes24-bytes10-uint8-
- :xref-Packing-extract_24_12-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_12-bytes24-uint8-
- :xref-Packing-replace_24_12-bytes24-bytes12-uint8-: xref:utils.adoc#Packing-replace_24_12-bytes24-bytes12-uint8-
- :xref-Packing-extract_24_16-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_16-bytes24-uint8-
- :xref-Packing-replace_24_16-bytes24-bytes16-uint8-: xref:utils.adoc#Packing-replace_24_16-bytes24-bytes16-uint8-
- :xref-Packing-extract_24_20-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_20-bytes24-uint8-
- :xref-Packing-replace_24_20-bytes24-bytes20-uint8-: xref:utils.adoc#Packing-replace_24_20-bytes24-bytes20-uint8-
- :xref-Packing-extract_24_22-bytes24-uint8-: xref:utils.adoc#Packing-extract_24_22-bytes24-uint8-
- :xref-Packing-replace_24_22-bytes24-bytes22-uint8-: xref:utils.adoc#Packing-replace_24_22-bytes24-bytes22-uint8-
- :xref-Packing-extract_28_1-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_1-bytes28-uint8-
- :xref-Packing-replace_28_1-bytes28-bytes1-uint8-: xref:utils.adoc#Packing-replace_28_1-bytes28-bytes1-uint8-
- :xref-Packing-extract_28_2-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_2-bytes28-uint8-
- :xref-Packing-replace_28_2-bytes28-bytes2-uint8-: xref:utils.adoc#Packing-replace_28_2-bytes28-bytes2-uint8-
- :xref-Packing-extract_28_4-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_4-bytes28-uint8-
- :xref-Packing-replace_28_4-bytes28-bytes4-uint8-: xref:utils.adoc#Packing-replace_28_4-bytes28-bytes4-uint8-
- :xref-Packing-extract_28_6-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_6-bytes28-uint8-
- :xref-Packing-replace_28_6-bytes28-bytes6-uint8-: xref:utils.adoc#Packing-replace_28_6-bytes28-bytes6-uint8-
- :xref-Packing-extract_28_8-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_8-bytes28-uint8-
- :xref-Packing-replace_28_8-bytes28-bytes8-uint8-: xref:utils.adoc#Packing-replace_28_8-bytes28-bytes8-uint8-
- :xref-Packing-extract_28_10-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_10-bytes28-uint8-
- :xref-Packing-replace_28_10-bytes28-bytes10-uint8-: xref:utils.adoc#Packing-replace_28_10-bytes28-bytes10-uint8-
- :xref-Packing-extract_28_12-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_12-bytes28-uint8-
- :xref-Packing-replace_28_12-bytes28-bytes12-uint8-: xref:utils.adoc#Packing-replace_28_12-bytes28-bytes12-uint8-
- :xref-Packing-extract_28_16-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_16-bytes28-uint8-
- :xref-Packing-replace_28_16-bytes28-bytes16-uint8-: xref:utils.adoc#Packing-replace_28_16-bytes28-bytes16-uint8-
- :xref-Packing-extract_28_20-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_20-bytes28-uint8-
- :xref-Packing-replace_28_20-bytes28-bytes20-uint8-: xref:utils.adoc#Packing-replace_28_20-bytes28-bytes20-uint8-
- :xref-Packing-extract_28_22-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_22-bytes28-uint8-
- :xref-Packing-replace_28_22-bytes28-bytes22-uint8-: xref:utils.adoc#Packing-replace_28_22-bytes28-bytes22-uint8-
- :xref-Packing-extract_28_24-bytes28-uint8-: xref:utils.adoc#Packing-extract_28_24-bytes28-uint8-
- :xref-Packing-replace_28_24-bytes28-bytes24-uint8-: xref:utils.adoc#Packing-replace_28_24-bytes28-bytes24-uint8-
- :xref-Packing-extract_32_1-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_1-bytes32-uint8-
- :xref-Packing-replace_32_1-bytes32-bytes1-uint8-: xref:utils.adoc#Packing-replace_32_1-bytes32-bytes1-uint8-
- :xref-Packing-extract_32_2-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_2-bytes32-uint8-
- :xref-Packing-replace_32_2-bytes32-bytes2-uint8-: xref:utils.adoc#Packing-replace_32_2-bytes32-bytes2-uint8-
- :xref-Packing-extract_32_4-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_4-bytes32-uint8-
- :xref-Packing-replace_32_4-bytes32-bytes4-uint8-: xref:utils.adoc#Packing-replace_32_4-bytes32-bytes4-uint8-
- :xref-Packing-extract_32_6-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_6-bytes32-uint8-
- :xref-Packing-replace_32_6-bytes32-bytes6-uint8-: xref:utils.adoc#Packing-replace_32_6-bytes32-bytes6-uint8-
- :xref-Packing-extract_32_8-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_8-bytes32-uint8-
- :xref-Packing-replace_32_8-bytes32-bytes8-uint8-: xref:utils.adoc#Packing-replace_32_8-bytes32-bytes8-uint8-
- :xref-Packing-extract_32_10-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_10-bytes32-uint8-
- :xref-Packing-replace_32_10-bytes32-bytes10-uint8-: xref:utils.adoc#Packing-replace_32_10-bytes32-bytes10-uint8-
- :xref-Packing-extract_32_12-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_12-bytes32-uint8-
- :xref-Packing-replace_32_12-bytes32-bytes12-uint8-: xref:utils.adoc#Packing-replace_32_12-bytes32-bytes12-uint8-
- :xref-Packing-extract_32_16-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_16-bytes32-uint8-
- :xref-Packing-replace_32_16-bytes32-bytes16-uint8-: xref:utils.adoc#Packing-replace_32_16-bytes32-bytes16-uint8-
- :xref-Packing-extract_32_20-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_20-bytes32-uint8-
- :xref-Packing-replace_32_20-bytes32-bytes20-uint8-: xref:utils.adoc#Packing-replace_32_20-bytes32-bytes20-uint8-
- :xref-Packing-extract_32_22-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_22-bytes32-uint8-
- :xref-Packing-replace_32_22-bytes32-bytes22-uint8-: xref:utils.adoc#Packing-replace_32_22-bytes32-bytes22-uint8-
- :xref-Packing-extract_32_24-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_24-bytes32-uint8-
- :xref-Packing-replace_32_24-bytes32-bytes24-uint8-: xref:utils.adoc#Packing-replace_32_24-bytes32-bytes24-uint8-
- :xref-Packing-extract_32_28-bytes32-uint8-: xref:utils.adoc#Packing-extract_32_28-bytes32-uint8-
- :xref-Packing-replace_32_28-bytes32-bytes28-uint8-: xref:utils.adoc#Packing-replace_32_28-bytes32-bytes28-uint8-
- :xref-Packing-OutOfRangeAccess--: xref:utils.adoc#Packing-OutOfRangeAccess--
- :xref-Panic-panic-uint256-: xref:utils.adoc#Panic-panic-uint256-
- :xref-Panic-GENERIC-uint256: xref:utils.adoc#Panic-GENERIC-uint256
- :xref-Panic-ASSERT-uint256: xref:utils.adoc#Panic-ASSERT-uint256
- :xref-Panic-UNDER_OVERFLOW-uint256: xref:utils.adoc#Panic-UNDER_OVERFLOW-uint256
- :xref-Panic-DIVISION_BY_ZERO-uint256: xref:utils.adoc#Panic-DIVISION_BY_ZERO-uint256
- :xref-Panic-ENUM_CONVERSION_ERROR-uint256: xref:utils.adoc#Panic-ENUM_CONVERSION_ERROR-uint256
- :xref-Panic-STORAGE_ENCODING_ERROR-uint256: xref:utils.adoc#Panic-STORAGE_ENCODING_ERROR-uint256
- :xref-Panic-EMPTY_ARRAY_POP-uint256: xref:utils.adoc#Panic-EMPTY_ARRAY_POP-uint256
- :xref-Panic-ARRAY_OUT_OF_BOUNDS-uint256: xref:utils.adoc#Panic-ARRAY_OUT_OF_BOUNDS-uint256
- :xref-Panic-RESOURCE_ERROR-uint256: xref:utils.adoc#Panic-RESOURCE_ERROR-uint256
- :xref-Panic-INVALID_INTERNAL_FUNCTION-uint256: xref:utils.adoc#Panic-INVALID_INTERNAL_FUNCTION-uint256
- :xref-Comparators-lt-uint256-uint256-: xref:utils.adoc#Comparators-lt-uint256-uint256-
- :xref-Comparators-gt-uint256-uint256-: xref:utils.adoc#Comparators-gt-uint256-uint256-
- :xref-CAIP2-local--: xref:utils.adoc#CAIP2-local--
- :xref-CAIP2-format-string-string-: xref:utils.adoc#CAIP2-format-string-string-
- :xref-CAIP2-parse-string-: xref:utils.adoc#CAIP2-parse-string-
- :CAIP2: pass:normal[xref:utils.adoc#CAIP2[`CAIP2`]]
- :Strings-toChecksumHexString: pass:normal[xref:utils.adoc#Strings-toChecksumHexString-address-[`Strings.toChecksumHexString`]]
- :xref-CAIP10-local-address-: xref:utils.adoc#CAIP10-local-address-
- :xref-CAIP10-format-string-string-: xref:utils.adoc#CAIP10-format-string-string-
- :xref-CAIP10-parse-string-: xref:utils.adoc#CAIP10-parse-string-
- :CAIP2: pass:normal[xref:utils.adoc#CAIP2[`CAIP2`]]
- :xref-Blockhash-blockHash-uint256-: xref:utils.adoc#Blockhash-blockHash-uint256-
- :xref-Blockhash-HISTORY_STORAGE_ADDRESS-address: xref:utils.adoc#Blockhash-HISTORY_STORAGE_ADDRESS-address
- :xref-Time-timestamp--: xref:utils.adoc#Time-timestamp--
- :xref-Time-blockNumber--: xref:utils.adoc#Time-blockNumber--
- :xref-Time-toDelay-uint32-: xref:utils.adoc#Time-toDelay-uint32-
- :xref-Time-getFull-Time-Delay-: xref:utils.adoc#Time-getFull-Time-Delay-
- :xref-Time-get-Time-Delay-: xref:utils.adoc#Time-get-Time-Delay-
- :xref-Time-withUpdate-Time-Delay-uint32-uint32-: xref:utils.adoc#Time-withUpdate-Time-Delay-uint32-uint32-
- :xref-Time-unpack-Time-Delay-: xref:utils.adoc#Time-unpack-Time-Delay-
- :xref-Time-pack-uint32-uint32-uint48-: xref:utils.adoc#Time-pack-uint32-uint32-uint48-
- = Utilities
- [.readme-notice]
- NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/utils
- Miscellaneous contracts and libraries containing utility functions you can use to improve security, work with new data types, or safely use low-level primitives.
- * {Math}, {SignedMath}: Implementation of various arithmetic functions.
- * {SafeCast}: Checked downcasting functions to avoid silent truncation.
- * {ReentrancyGuard}: A modifier that can prevent reentrancy during certain functions.
- * {ReentrancyGuardTransient}: Variant of {ReentrancyGuard} that uses transient storage (https://eips.ethereum.org/EIPS/eip-1153[EIP-1153]).
- * {Pausable}: A common emergency response mechanism that can pause functionality while a remediation is pending.
- * {Nonces}: Utility for tracking and verifying address nonces that only increment.
- * {NoncesKeyed}: Alternative to {Nonces}, that support keyed nonces following https://eips.ethereum.org/EIPS/eip-4337#semi-abstracted-nonce-support[ERC-4337 specifications].
- * {ERC165}, {ERC165Checker}: Utilities for inspecting interfaces supported by contracts.
- * {BitMaps}: A simple library to manage boolean value mapped to a numerical index in an efficient way.
- * {EnumerableMap}: A type like Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`], but with key-value _enumeration_: this will let you know how many entries a mapping has, and iterate over them (which is not possible with `mapping`).
- * {EnumerableSet}: Like {EnumerableMap}, but for https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets]. Can be used to store privileged accounts, issued IDs, etc.
- * {DoubleEndedQueue}: An implementation of a https://en.wikipedia.org/wiki/Double-ended_queue[double ended queue] whose values can be added or removed from both sides. Useful for FIFO and LIFO structures.
- * {CircularBuffer}: A data structure to store the last N values pushed to it.
- * {Checkpoints}: A data structure to store values mapped to a strictly increasing key. Can be used for storing and accessing values over time.
- * {Heap}: A library that implements a https://en.wikipedia.org/wiki/Binary_heap[binary heap] in storage.
- * {MerkleTree}: A library with https://wikipedia.org/wiki/Merkle_Tree[Merkle Tree] data structures and helper functions.
- * {Create2}: Wrapper around the https://blog.openzeppelin.com/getting-the-most-out-of-create2/[`CREATE2` EVM opcode] for safe use without having to deal with low-level assembly.
- * {Address}: Collection of functions for overloading Solidity's https://docs.soliditylang.org/en/latest/types.html#address[`address`] type.
- * {Arrays}: Collection of functions that operate on https://docs.soliditylang.org/en/latest/types.html#arrays[`arrays`].
- * {Base64}: On-chain base64 and base64URL encoding according to https://datatracker.ietf.org/doc/html/rfc4648[RFC-4648].
- * {Bytes}: Common operations on bytes objects.
- * {Calldata}: Helpers for manipulating calldata.
- * {Strings}: Common operations for strings formatting.
- * {ShortStrings}: Library to encode (and decode) short strings into (or from) a single bytes32 slot for optimizing costs. Short strings are limited to 31 characters.
- * {SlotDerivation}: Methods for deriving storage slot from ERC-7201 namespaces as well as from constructions such as mapping and arrays.
- * {StorageSlot}: Methods for accessing specific storage slots formatted as common primitive types.
- * {TransientSlot}: Primitives for reading from and writing to transient storage (only value types are currently supported).
- * {Multicall}: Abstract contract with a utility to allow batching together multiple calls in a single transaction. Useful for allowing EOAs to perform multiple operations at once.
- * {Context}: A utility for abstracting the sender and calldata in the current execution context.
- * {Packing}: A library for packing and unpacking multiple values into bytes32
- * {Panic}: A library to revert with https://docs.soliditylang.org/en/v0.8.20/control-structures.html#panic-via-assert-and-error-via-require[Solidity panic codes].
- * {Comparators}: A library that contains comparator functions to use with the {Heap} library.
- * {CAIP2}, {CAIP10}: Libraries for formatting and parsing CAIP-2 and CAIP-10 identifiers.
- * {Blockhash}: A library for accessing historical block hashes beyond the standard 256 block limit utilizing EIP-2935's historical blockhash functionality.
- * {Time}: A library that provides helpers for manipulating time-related objects, including a `Delay` type.
-
- [NOTE]
- ====
- Because Solidity does not support generic types, {EnumerableMap} and {EnumerableSet} are specialized to a limited number of key-value types.
- ====
- == Math
- :Rounding: pass:normal[xref:#Math-Rounding[`++Rounding++`]]
- :add512: pass:normal[xref:#Math-add512-uint256-uint256-[`++add512++`]]
- :mul512: pass:normal[xref:#Math-mul512-uint256-uint256-[`++mul512++`]]
- :tryAdd: pass:normal[xref:#Math-tryAdd-uint256-uint256-[`++tryAdd++`]]
- :trySub: pass:normal[xref:#Math-trySub-uint256-uint256-[`++trySub++`]]
- :tryMul: pass:normal[xref:#Math-tryMul-uint256-uint256-[`++tryMul++`]]
- :tryDiv: pass:normal[xref:#Math-tryDiv-uint256-uint256-[`++tryDiv++`]]
- :tryMod: pass:normal[xref:#Math-tryMod-uint256-uint256-[`++tryMod++`]]
- :saturatingAdd: pass:normal[xref:#Math-saturatingAdd-uint256-uint256-[`++saturatingAdd++`]]
- :saturatingSub: pass:normal[xref:#Math-saturatingSub-uint256-uint256-[`++saturatingSub++`]]
- :saturatingMul: pass:normal[xref:#Math-saturatingMul-uint256-uint256-[`++saturatingMul++`]]
- :ternary: pass:normal[xref:#Math-ternary-bool-uint256-uint256-[`++ternary++`]]
- :max: pass:normal[xref:#Math-max-uint256-uint256-[`++max++`]]
- :min: pass:normal[xref:#Math-min-uint256-uint256-[`++min++`]]
- :average: pass:normal[xref:#Math-average-uint256-uint256-[`++average++`]]
- :ceilDiv: pass:normal[xref:#Math-ceilDiv-uint256-uint256-[`++ceilDiv++`]]
- :mulDiv: pass:normal[xref:#Math-mulDiv-uint256-uint256-uint256-[`++mulDiv++`]]
- :mulDiv: pass:normal[xref:#Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-[`++mulDiv++`]]
- :mulShr: pass:normal[xref:#Math-mulShr-uint256-uint256-uint8-[`++mulShr++`]]
- :mulShr: pass:normal[xref:#Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-[`++mulShr++`]]
- :invMod: pass:normal[xref:#Math-invMod-uint256-uint256-[`++invMod++`]]
- :invModPrime: pass:normal[xref:#Math-invModPrime-uint256-uint256-[`++invModPrime++`]]
- :modExp: pass:normal[xref:#Math-modExp-uint256-uint256-uint256-[`++modExp++`]]
- :tryModExp: pass:normal[xref:#Math-tryModExp-uint256-uint256-uint256-[`++tryModExp++`]]
- :modExp: pass:normal[xref:#Math-modExp-bytes-bytes-bytes-[`++modExp++`]]
- :tryModExp: pass:normal[xref:#Math-tryModExp-bytes-bytes-bytes-[`++tryModExp++`]]
- :sqrt: pass:normal[xref:#Math-sqrt-uint256-[`++sqrt++`]]
- :sqrt: pass:normal[xref:#Math-sqrt-uint256-enum-Math-Rounding-[`++sqrt++`]]
- :log2: pass:normal[xref:#Math-log2-uint256-[`++log2++`]]
- :log2: pass:normal[xref:#Math-log2-uint256-enum-Math-Rounding-[`++log2++`]]
- :log10: pass:normal[xref:#Math-log10-uint256-[`++log10++`]]
- :log10: pass:normal[xref:#Math-log10-uint256-enum-Math-Rounding-[`++log10++`]]
- :log256: pass:normal[xref:#Math-log256-uint256-[`++log256++`]]
- :log256: pass:normal[xref:#Math-log256-uint256-enum-Math-Rounding-[`++log256++`]]
- :unsignedRoundsUp: pass:normal[xref:#Math-unsignedRoundsUp-enum-Math-Rounding-[`++unsignedRoundsUp++`]]
- :add512-uint256-uint256: pass:normal[xref:#Math-add512-uint256-uint256-[`++add512++`]]
- :mul512-uint256-uint256: pass:normal[xref:#Math-mul512-uint256-uint256-[`++mul512++`]]
- :tryAdd-uint256-uint256: pass:normal[xref:#Math-tryAdd-uint256-uint256-[`++tryAdd++`]]
- :trySub-uint256-uint256: pass:normal[xref:#Math-trySub-uint256-uint256-[`++trySub++`]]
- :tryMul-uint256-uint256: pass:normal[xref:#Math-tryMul-uint256-uint256-[`++tryMul++`]]
- :tryDiv-uint256-uint256: pass:normal[xref:#Math-tryDiv-uint256-uint256-[`++tryDiv++`]]
- :tryMod-uint256-uint256: pass:normal[xref:#Math-tryMod-uint256-uint256-[`++tryMod++`]]
- :saturatingAdd-uint256-uint256: pass:normal[xref:#Math-saturatingAdd-uint256-uint256-[`++saturatingAdd++`]]
- :saturatingSub-uint256-uint256: pass:normal[xref:#Math-saturatingSub-uint256-uint256-[`++saturatingSub++`]]
- :saturatingMul-uint256-uint256: pass:normal[xref:#Math-saturatingMul-uint256-uint256-[`++saturatingMul++`]]
- :ternary-bool-uint256-uint256: pass:normal[xref:#Math-ternary-bool-uint256-uint256-[`++ternary++`]]
- :max-uint256-uint256: pass:normal[xref:#Math-max-uint256-uint256-[`++max++`]]
- :min-uint256-uint256: pass:normal[xref:#Math-min-uint256-uint256-[`++min++`]]
- :average-uint256-uint256: pass:normal[xref:#Math-average-uint256-uint256-[`++average++`]]
- :ceilDiv-uint256-uint256: pass:normal[xref:#Math-ceilDiv-uint256-uint256-[`++ceilDiv++`]]
- :mulDiv-uint256-uint256-uint256: pass:normal[xref:#Math-mulDiv-uint256-uint256-uint256-[`++mulDiv++`]]
- :mulDiv-uint256-uint256-uint256-enum-Math-Rounding: pass:normal[xref:#Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-[`++mulDiv++`]]
- :mulShr-uint256-uint256-uint8: pass:normal[xref:#Math-mulShr-uint256-uint256-uint8-[`++mulShr++`]]
- :mulShr-uint256-uint256-uint8-enum-Math-Rounding: pass:normal[xref:#Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-[`++mulShr++`]]
- :invMod-uint256-uint256: pass:normal[xref:#Math-invMod-uint256-uint256-[`++invMod++`]]
- :invModPrime-uint256-uint256: pass:normal[xref:#Math-invModPrime-uint256-uint256-[`++invModPrime++`]]
- :modExp-uint256-uint256-uint256: pass:normal[xref:#Math-modExp-uint256-uint256-uint256-[`++modExp++`]]
- :tryModExp-uint256-uint256-uint256: pass:normal[xref:#Math-tryModExp-uint256-uint256-uint256-[`++tryModExp++`]]
- :modExp-bytes-bytes-bytes: pass:normal[xref:#Math-modExp-bytes-bytes-bytes-[`++modExp++`]]
- :tryModExp-bytes-bytes-bytes: pass:normal[xref:#Math-tryModExp-bytes-bytes-bytes-[`++tryModExp++`]]
- :sqrt-uint256: pass:normal[xref:#Math-sqrt-uint256-[`++sqrt++`]]
- :sqrt-uint256-enum-Math-Rounding: pass:normal[xref:#Math-sqrt-uint256-enum-Math-Rounding-[`++sqrt++`]]
- :log2-uint256: pass:normal[xref:#Math-log2-uint256-[`++log2++`]]
- :log2-uint256-enum-Math-Rounding: pass:normal[xref:#Math-log2-uint256-enum-Math-Rounding-[`++log2++`]]
- :log10-uint256: pass:normal[xref:#Math-log10-uint256-[`++log10++`]]
- :log10-uint256-enum-Math-Rounding: pass:normal[xref:#Math-log10-uint256-enum-Math-Rounding-[`++log10++`]]
- :log256-uint256: pass:normal[xref:#Math-log256-uint256-[`++log256++`]]
- :log256-uint256-enum-Math-Rounding: pass:normal[xref:#Math-log256-uint256-enum-Math-Rounding-[`++log256++`]]
- :unsignedRoundsUp-enum-Math-Rounding: pass:normal[xref:#Math-unsignedRoundsUp-enum-Math-Rounding-[`++unsignedRoundsUp++`]]
- [.contract]
- [[Math]]
- === `++Math++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/math/Math.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/math/Math.sol";
- ```
- Standard math utilities missing in the Solidity language.
- [.contract-index]
- .Functions
- --
- * {xref-Math-add512-uint256-uint256-}[`++add512(a, b)++`]
- * {xref-Math-mul512-uint256-uint256-}[`++mul512(a, b)++`]
- * {xref-Math-tryAdd-uint256-uint256-}[`++tryAdd(a, b)++`]
- * {xref-Math-trySub-uint256-uint256-}[`++trySub(a, b)++`]
- * {xref-Math-tryMul-uint256-uint256-}[`++tryMul(a, b)++`]
- * {xref-Math-tryDiv-uint256-uint256-}[`++tryDiv(a, b)++`]
- * {xref-Math-tryMod-uint256-uint256-}[`++tryMod(a, b)++`]
- * {xref-Math-saturatingAdd-uint256-uint256-}[`++saturatingAdd(a, b)++`]
- * {xref-Math-saturatingSub-uint256-uint256-}[`++saturatingSub(a, b)++`]
- * {xref-Math-saturatingMul-uint256-uint256-}[`++saturatingMul(a, b)++`]
- * {xref-Math-ternary-bool-uint256-uint256-}[`++ternary(condition, a, b)++`]
- * {xref-Math-max-uint256-uint256-}[`++max(a, b)++`]
- * {xref-Math-min-uint256-uint256-}[`++min(a, b)++`]
- * {xref-Math-average-uint256-uint256-}[`++average(a, b)++`]
- * {xref-Math-ceilDiv-uint256-uint256-}[`++ceilDiv(a, b)++`]
- * {xref-Math-mulDiv-uint256-uint256-uint256-}[`++mulDiv(x, y, denominator)++`]
- * {xref-Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-}[`++mulDiv(x, y, denominator, rounding)++`]
- * {xref-Math-mulShr-uint256-uint256-uint8-}[`++mulShr(x, y, n)++`]
- * {xref-Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-}[`++mulShr(x, y, n, rounding)++`]
- * {xref-Math-invMod-uint256-uint256-}[`++invMod(a, n)++`]
- * {xref-Math-invModPrime-uint256-uint256-}[`++invModPrime(a, p)++`]
- * {xref-Math-modExp-uint256-uint256-uint256-}[`++modExp(b, e, m)++`]
- * {xref-Math-tryModExp-uint256-uint256-uint256-}[`++tryModExp(b, e, m)++`]
- * {xref-Math-modExp-bytes-bytes-bytes-}[`++modExp(b, e, m)++`]
- * {xref-Math-tryModExp-bytes-bytes-bytes-}[`++tryModExp(b, e, m)++`]
- * {xref-Math-sqrt-uint256-}[`++sqrt(a)++`]
- * {xref-Math-sqrt-uint256-enum-Math-Rounding-}[`++sqrt(a, rounding)++`]
- * {xref-Math-log2-uint256-}[`++log2(x)++`]
- * {xref-Math-log2-uint256-enum-Math-Rounding-}[`++log2(value, rounding)++`]
- * {xref-Math-log10-uint256-}[`++log10(value)++`]
- * {xref-Math-log10-uint256-enum-Math-Rounding-}[`++log10(value, rounding)++`]
- * {xref-Math-log256-uint256-}[`++log256(x)++`]
- * {xref-Math-log256-uint256-enum-Math-Rounding-}[`++log256(value, rounding)++`]
- * {xref-Math-unsignedRoundsUp-enum-Math-Rounding-}[`++unsignedRoundsUp(rounding)++`]
- --
- [.contract-item]
- [[Math-add512-uint256-uint256-]]
- ==== `[.contract-item-name]#++add512++#++(uint256 a, uint256 b) โ uint256 high, uint256 low++` [.item-kind]#internal#
- Return the 512-bit addition of two uint256.
- The result is stored in two 256 variables such that sum = high * 2ยฒโตโถ + low.
- [.contract-item]
- [[Math-mul512-uint256-uint256-]]
- ==== `[.contract-item-name]#++mul512++#++(uint256 a, uint256 b) โ uint256 high, uint256 low++` [.item-kind]#internal#
- Return the 512-bit multiplication of two uint256.
- The result is stored in two 256 variables such that product = high * 2ยฒโตโถ + low.
- [.contract-item]
- [[Math-tryAdd-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryAdd++#++(uint256 a, uint256 b) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the addition of two unsigned integers, with a success flag (no overflow).
- [.contract-item]
- [[Math-trySub-uint256-uint256-]]
- ==== `[.contract-item-name]#++trySub++#++(uint256 a, uint256 b) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the subtraction of two unsigned integers, with a success flag (no overflow).
- [.contract-item]
- [[Math-tryMul-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryMul++#++(uint256 a, uint256 b) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the multiplication of two unsigned integers, with a success flag (no overflow).
- [.contract-item]
- [[Math-tryDiv-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryDiv++#++(uint256 a, uint256 b) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the division of two unsigned integers, with a success flag (no division by zero).
- [.contract-item]
- [[Math-tryMod-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryMod++#++(uint256 a, uint256 b) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).
- [.contract-item]
- [[Math-saturatingAdd-uint256-uint256-]]
- ==== `[.contract-item-name]#++saturatingAdd++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Unsigned saturating addition, bounds to `2ยฒโตโถ - 1` instead of overflowing.
- [.contract-item]
- [[Math-saturatingSub-uint256-uint256-]]
- ==== `[.contract-item-name]#++saturatingSub++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Unsigned saturating subtraction, bounds to zero instead of overflowing.
- [.contract-item]
- [[Math-saturatingMul-uint256-uint256-]]
- ==== `[.contract-item-name]#++saturatingMul++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Unsigned saturating multiplication, bounds to `2ยฒโตโถ - 1` instead of overflowing.
- [.contract-item]
- [[Math-ternary-bool-uint256-uint256-]]
- ==== `[.contract-item-name]#++ternary++#++(bool condition, uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
- IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
- However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
- one branch when needed, making this function more expensive.
- [.contract-item]
- [[Math-max-uint256-uint256-]]
- ==== `[.contract-item-name]#++max++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Returns the largest of two numbers.
- [.contract-item]
- [[Math-min-uint256-uint256-]]
- ==== `[.contract-item-name]#++min++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Returns the smallest of two numbers.
- [.contract-item]
- [[Math-average-uint256-uint256-]]
- ==== `[.contract-item-name]#++average++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Returns the average of two numbers. The result is rounded towards
- zero.
- [.contract-item]
- [[Math-ceilDiv-uint256-uint256-]]
- ==== `[.contract-item-name]#++ceilDiv++#++(uint256 a, uint256 b) โ uint256++` [.item-kind]#internal#
- Returns the ceiling of the division of two numbers.
- This differs from standard division with `/` in that it rounds towards infinity instead
- of rounding towards zero.
- [.contract-item]
- [[Math-mulDiv-uint256-uint256-uint256-]]
- ==== `[.contract-item-name]#++mulDiv++#++(uint256 x, uint256 y, uint256 denominator) โ uint256 result++` [.item-kind]#internal#
- Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
- denominator == 0.
- Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
- Uniswap Labs also under MIT license.
- [.contract-item]
- [[Math-mulDiv-uint256-uint256-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++mulDiv++#++(uint256 x, uint256 y, uint256 denominator, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Calculates x * y / denominator with full precision, following the selected rounding direction.
- [.contract-item]
- [[Math-mulShr-uint256-uint256-uint8-]]
- ==== `[.contract-item-name]#++mulShr++#++(uint256 x, uint256 y, uint8 n) โ uint256 result++` [.item-kind]#internal#
- Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.
- [.contract-item]
- [[Math-mulShr-uint256-uint256-uint8-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++mulShr++#++(uint256 x, uint256 y, uint8 n, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Calculates x * y >> n with full precision, following the selected rounding direction.
- [.contract-item]
- [[Math-invMod-uint256-uint256-]]
- ==== `[.contract-item-name]#++invMod++#++(uint256 a, uint256 n) โ uint256++` [.item-kind]#internal#
- Calculate the modular multiplicative inverse of a number in Z/nZ.
- If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.
- If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.
- If the input value is not inversible, 0 is returned.
- NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the
- inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.
- [.contract-item]
- [[Math-invModPrime-uint256-uint256-]]
- ==== `[.contract-item-name]#++invModPrime++#++(uint256 a, uint256 p) โ uint256++` [.item-kind]#internal#
- Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.
- From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is
- prime, then `a**(p-1) โก 1 mod p`. As a consequence, we have `a * a**(p-2) โก 1 mod p`, which means that
- `a**(p-2)` is the modular multiplicative inverse of a in Fp.
- NOTE: this function does NOT check that `p` is a prime greater than `2`.
- [.contract-item]
- [[Math-modExp-uint256-uint256-uint256-]]
- ==== `[.contract-item-name]#++modExp++#++(uint256 b, uint256 e, uint256 m) โ uint256++` [.item-kind]#internal#
- Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)
- Requirements:
- - modulus can't be zero
- - underlying staticcall to precompile must succeed
- IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make
- sure the chain you're using it on supports the precompiled contract for modular exponentiation
- at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,
- the underlying function will succeed given the lack of a revert, but the result may be incorrectly
- interpreted as 0.
- [.contract-item]
- [[Math-tryModExp-uint256-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryModExp++#++(uint256 b, uint256 e, uint256 m) โ bool success, uint256 result++` [.item-kind]#internal#
- Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).
- It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying
- to operate modulo 0 or if the underlying precompile reverted.
- IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain
- you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in
- https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack
- of a revert, but the result may be incorrectly interpreted as 0.
- [.contract-item]
- [[Math-modExp-bytes-bytes-bytes-]]
- ==== `[.contract-item-name]#++modExp++#++(bytes b, bytes e, bytes m) โ bytes++` [.item-kind]#internal#
- Variant of {modExp} that supports inputs of arbitrary length.
- [.contract-item]
- [[Math-tryModExp-bytes-bytes-bytes-]]
- ==== `[.contract-item-name]#++tryModExp++#++(bytes b, bytes e, bytes m) โ bool success, bytes result++` [.item-kind]#internal#
- Variant of {tryModExp} that supports inputs of arbitrary length.
- [.contract-item]
- [[Math-sqrt-uint256-]]
- ==== `[.contract-item-name]#++sqrt++#++(uint256 a) โ uint256++` [.item-kind]#internal#
- Returns the square root of a number. If the number is not a perfect square, the value is rounded
- towards zero.
- This method is based on Newton's method for computing square roots; the algorithm is restricted to only
- using integer operations.
- [.contract-item]
- [[Math-sqrt-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++sqrt++#++(uint256 a, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Calculates sqrt(a), following the selected rounding direction.
- [.contract-item]
- [[Math-log2-uint256-]]
- ==== `[.contract-item-name]#++log2++#++(uint256 x) โ uint256 r++` [.item-kind]#internal#
- Return the log in base 2 of a positive value rounded towards zero.
- Returns 0 if given 0.
- [.contract-item]
- [[Math-log2-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++log2++#++(uint256 value, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Return the log in base 2, following the selected rounding direction, of a positive value.
- Returns 0 if given 0.
- [.contract-item]
- [[Math-log10-uint256-]]
- ==== `[.contract-item-name]#++log10++#++(uint256 value) โ uint256++` [.item-kind]#internal#
- Return the log in base 10 of a positive value rounded towards zero.
- Returns 0 if given 0.
- [.contract-item]
- [[Math-log10-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++log10++#++(uint256 value, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Return the log in base 10, following the selected rounding direction, of a positive value.
- Returns 0 if given 0.
- [.contract-item]
- [[Math-log256-uint256-]]
- ==== `[.contract-item-name]#++log256++#++(uint256 x) โ uint256 r++` [.item-kind]#internal#
- Return the log in base 256 of a positive value rounded towards zero.
- Returns 0 if given 0.
- Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
- [.contract-item]
- [[Math-log256-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++log256++#++(uint256 value, enum Math.Rounding rounding) โ uint256++` [.item-kind]#internal#
- Return the log in base 256, following the selected rounding direction, of a positive value.
- Returns 0 if given 0.
- [.contract-item]
- [[Math-unsignedRoundsUp-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++unsignedRoundsUp++#++(enum Math.Rounding rounding) โ bool++` [.item-kind]#internal#
- Returns whether a provided rounding mode is considered rounding up for unsigned integers.
- :ternary: pass:normal[xref:#SignedMath-ternary-bool-int256-int256-[`++ternary++`]]
- :max: pass:normal[xref:#SignedMath-max-int256-int256-[`++max++`]]
- :min: pass:normal[xref:#SignedMath-min-int256-int256-[`++min++`]]
- :average: pass:normal[xref:#SignedMath-average-int256-int256-[`++average++`]]
- :abs: pass:normal[xref:#SignedMath-abs-int256-[`++abs++`]]
- :ternary-bool-int256-int256: pass:normal[xref:#SignedMath-ternary-bool-int256-int256-[`++ternary++`]]
- :max-int256-int256: pass:normal[xref:#SignedMath-max-int256-int256-[`++max++`]]
- :min-int256-int256: pass:normal[xref:#SignedMath-min-int256-int256-[`++min++`]]
- :average-int256-int256: pass:normal[xref:#SignedMath-average-int256-int256-[`++average++`]]
- :abs-int256: pass:normal[xref:#SignedMath-abs-int256-[`++abs++`]]
- [.contract]
- [[SignedMath]]
- === `++SignedMath++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/math/SignedMath.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/math/SignedMath.sol";
- ```
- Standard signed math utilities missing in the Solidity language.
- [.contract-index]
- .Functions
- --
- * {xref-SignedMath-ternary-bool-int256-int256-}[`++ternary(condition, a, b)++`]
- * {xref-SignedMath-max-int256-int256-}[`++max(a, b)++`]
- * {xref-SignedMath-min-int256-int256-}[`++min(a, b)++`]
- * {xref-SignedMath-average-int256-int256-}[`++average(a, b)++`]
- * {xref-SignedMath-abs-int256-}[`++abs(n)++`]
- --
- [.contract-item]
- [[SignedMath-ternary-bool-int256-int256-]]
- ==== `[.contract-item-name]#++ternary++#++(bool condition, int256 a, int256 b) โ int256++` [.item-kind]#internal#
- Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
- IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
- However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
- one branch when needed, making this function more expensive.
- [.contract-item]
- [[SignedMath-max-int256-int256-]]
- ==== `[.contract-item-name]#++max++#++(int256 a, int256 b) โ int256++` [.item-kind]#internal#
- Returns the largest of two signed numbers.
- [.contract-item]
- [[SignedMath-min-int256-int256-]]
- ==== `[.contract-item-name]#++min++#++(int256 a, int256 b) โ int256++` [.item-kind]#internal#
- Returns the smallest of two signed numbers.
- [.contract-item]
- [[SignedMath-average-int256-int256-]]
- ==== `[.contract-item-name]#++average++#++(int256 a, int256 b) โ int256++` [.item-kind]#internal#
- Returns the average of two signed numbers without overflow.
- The result is rounded towards zero.
- [.contract-item]
- [[SignedMath-abs-int256-]]
- ==== `[.contract-item-name]#++abs++#++(int256 n) โ uint256++` [.item-kind]#internal#
- Returns the absolute unsigned value of a signed value.
- :SafeCastOverflowedUintDowncast: pass:normal[xref:#SafeCast-SafeCastOverflowedUintDowncast-uint8-uint256-[`++SafeCastOverflowedUintDowncast++`]]
- :SafeCastOverflowedIntToUint: pass:normal[xref:#SafeCast-SafeCastOverflowedIntToUint-int256-[`++SafeCastOverflowedIntToUint++`]]
- :SafeCastOverflowedIntDowncast: pass:normal[xref:#SafeCast-SafeCastOverflowedIntDowncast-uint8-int256-[`++SafeCastOverflowedIntDowncast++`]]
- :SafeCastOverflowedUintToInt: pass:normal[xref:#SafeCast-SafeCastOverflowedUintToInt-uint256-[`++SafeCastOverflowedUintToInt++`]]
- :toUint248: pass:normal[xref:#SafeCast-toUint248-uint256-[`++toUint248++`]]
- :toUint240: pass:normal[xref:#SafeCast-toUint240-uint256-[`++toUint240++`]]
- :toUint232: pass:normal[xref:#SafeCast-toUint232-uint256-[`++toUint232++`]]
- :toUint224: pass:normal[xref:#SafeCast-toUint224-uint256-[`++toUint224++`]]
- :toUint216: pass:normal[xref:#SafeCast-toUint216-uint256-[`++toUint216++`]]
- :toUint208: pass:normal[xref:#SafeCast-toUint208-uint256-[`++toUint208++`]]
- :toUint200: pass:normal[xref:#SafeCast-toUint200-uint256-[`++toUint200++`]]
- :toUint192: pass:normal[xref:#SafeCast-toUint192-uint256-[`++toUint192++`]]
- :toUint184: pass:normal[xref:#SafeCast-toUint184-uint256-[`++toUint184++`]]
- :toUint176: pass:normal[xref:#SafeCast-toUint176-uint256-[`++toUint176++`]]
- :toUint168: pass:normal[xref:#SafeCast-toUint168-uint256-[`++toUint168++`]]
- :toUint160: pass:normal[xref:#SafeCast-toUint160-uint256-[`++toUint160++`]]
- :toUint152: pass:normal[xref:#SafeCast-toUint152-uint256-[`++toUint152++`]]
- :toUint144: pass:normal[xref:#SafeCast-toUint144-uint256-[`++toUint144++`]]
- :toUint136: pass:normal[xref:#SafeCast-toUint136-uint256-[`++toUint136++`]]
- :toUint128: pass:normal[xref:#SafeCast-toUint128-uint256-[`++toUint128++`]]
- :toUint120: pass:normal[xref:#SafeCast-toUint120-uint256-[`++toUint120++`]]
- :toUint112: pass:normal[xref:#SafeCast-toUint112-uint256-[`++toUint112++`]]
- :toUint104: pass:normal[xref:#SafeCast-toUint104-uint256-[`++toUint104++`]]
- :toUint96: pass:normal[xref:#SafeCast-toUint96-uint256-[`++toUint96++`]]
- :toUint88: pass:normal[xref:#SafeCast-toUint88-uint256-[`++toUint88++`]]
- :toUint80: pass:normal[xref:#SafeCast-toUint80-uint256-[`++toUint80++`]]
- :toUint72: pass:normal[xref:#SafeCast-toUint72-uint256-[`++toUint72++`]]
- :toUint64: pass:normal[xref:#SafeCast-toUint64-uint256-[`++toUint64++`]]
- :toUint56: pass:normal[xref:#SafeCast-toUint56-uint256-[`++toUint56++`]]
- :toUint48: pass:normal[xref:#SafeCast-toUint48-uint256-[`++toUint48++`]]
- :toUint40: pass:normal[xref:#SafeCast-toUint40-uint256-[`++toUint40++`]]
- :toUint32: pass:normal[xref:#SafeCast-toUint32-uint256-[`++toUint32++`]]
- :toUint24: pass:normal[xref:#SafeCast-toUint24-uint256-[`++toUint24++`]]
- :toUint16: pass:normal[xref:#SafeCast-toUint16-uint256-[`++toUint16++`]]
- :toUint8: pass:normal[xref:#SafeCast-toUint8-uint256-[`++toUint8++`]]
- :toUint256: pass:normal[xref:#SafeCast-toUint256-int256-[`++toUint256++`]]
- :toInt248: pass:normal[xref:#SafeCast-toInt248-int256-[`++toInt248++`]]
- :toInt240: pass:normal[xref:#SafeCast-toInt240-int256-[`++toInt240++`]]
- :toInt232: pass:normal[xref:#SafeCast-toInt232-int256-[`++toInt232++`]]
- :toInt224: pass:normal[xref:#SafeCast-toInt224-int256-[`++toInt224++`]]
- :toInt216: pass:normal[xref:#SafeCast-toInt216-int256-[`++toInt216++`]]
- :toInt208: pass:normal[xref:#SafeCast-toInt208-int256-[`++toInt208++`]]
- :toInt200: pass:normal[xref:#SafeCast-toInt200-int256-[`++toInt200++`]]
- :toInt192: pass:normal[xref:#SafeCast-toInt192-int256-[`++toInt192++`]]
- :toInt184: pass:normal[xref:#SafeCast-toInt184-int256-[`++toInt184++`]]
- :toInt176: pass:normal[xref:#SafeCast-toInt176-int256-[`++toInt176++`]]
- :toInt168: pass:normal[xref:#SafeCast-toInt168-int256-[`++toInt168++`]]
- :toInt160: pass:normal[xref:#SafeCast-toInt160-int256-[`++toInt160++`]]
- :toInt152: pass:normal[xref:#SafeCast-toInt152-int256-[`++toInt152++`]]
- :toInt144: pass:normal[xref:#SafeCast-toInt144-int256-[`++toInt144++`]]
- :toInt136: pass:normal[xref:#SafeCast-toInt136-int256-[`++toInt136++`]]
- :toInt128: pass:normal[xref:#SafeCast-toInt128-int256-[`++toInt128++`]]
- :toInt120: pass:normal[xref:#SafeCast-toInt120-int256-[`++toInt120++`]]
- :toInt112: pass:normal[xref:#SafeCast-toInt112-int256-[`++toInt112++`]]
- :toInt104: pass:normal[xref:#SafeCast-toInt104-int256-[`++toInt104++`]]
- :toInt96: pass:normal[xref:#SafeCast-toInt96-int256-[`++toInt96++`]]
- :toInt88: pass:normal[xref:#SafeCast-toInt88-int256-[`++toInt88++`]]
- :toInt80: pass:normal[xref:#SafeCast-toInt80-int256-[`++toInt80++`]]
- :toInt72: pass:normal[xref:#SafeCast-toInt72-int256-[`++toInt72++`]]
- :toInt64: pass:normal[xref:#SafeCast-toInt64-int256-[`++toInt64++`]]
- :toInt56: pass:normal[xref:#SafeCast-toInt56-int256-[`++toInt56++`]]
- :toInt48: pass:normal[xref:#SafeCast-toInt48-int256-[`++toInt48++`]]
- :toInt40: pass:normal[xref:#SafeCast-toInt40-int256-[`++toInt40++`]]
- :toInt32: pass:normal[xref:#SafeCast-toInt32-int256-[`++toInt32++`]]
- :toInt24: pass:normal[xref:#SafeCast-toInt24-int256-[`++toInt24++`]]
- :toInt16: pass:normal[xref:#SafeCast-toInt16-int256-[`++toInt16++`]]
- :toInt8: pass:normal[xref:#SafeCast-toInt8-int256-[`++toInt8++`]]
- :toInt256: pass:normal[xref:#SafeCast-toInt256-uint256-[`++toInt256++`]]
- :toUint: pass:normal[xref:#SafeCast-toUint-bool-[`++toUint++`]]
- :toUint248-uint256: pass:normal[xref:#SafeCast-toUint248-uint256-[`++toUint248++`]]
- :toUint240-uint256: pass:normal[xref:#SafeCast-toUint240-uint256-[`++toUint240++`]]
- :toUint232-uint256: pass:normal[xref:#SafeCast-toUint232-uint256-[`++toUint232++`]]
- :toUint224-uint256: pass:normal[xref:#SafeCast-toUint224-uint256-[`++toUint224++`]]
- :toUint216-uint256: pass:normal[xref:#SafeCast-toUint216-uint256-[`++toUint216++`]]
- :toUint208-uint256: pass:normal[xref:#SafeCast-toUint208-uint256-[`++toUint208++`]]
- :toUint200-uint256: pass:normal[xref:#SafeCast-toUint200-uint256-[`++toUint200++`]]
- :toUint192-uint256: pass:normal[xref:#SafeCast-toUint192-uint256-[`++toUint192++`]]
- :toUint184-uint256: pass:normal[xref:#SafeCast-toUint184-uint256-[`++toUint184++`]]
- :toUint176-uint256: pass:normal[xref:#SafeCast-toUint176-uint256-[`++toUint176++`]]
- :toUint168-uint256: pass:normal[xref:#SafeCast-toUint168-uint256-[`++toUint168++`]]
- :toUint160-uint256: pass:normal[xref:#SafeCast-toUint160-uint256-[`++toUint160++`]]
- :toUint152-uint256: pass:normal[xref:#SafeCast-toUint152-uint256-[`++toUint152++`]]
- :toUint144-uint256: pass:normal[xref:#SafeCast-toUint144-uint256-[`++toUint144++`]]
- :toUint136-uint256: pass:normal[xref:#SafeCast-toUint136-uint256-[`++toUint136++`]]
- :toUint128-uint256: pass:normal[xref:#SafeCast-toUint128-uint256-[`++toUint128++`]]
- :toUint120-uint256: pass:normal[xref:#SafeCast-toUint120-uint256-[`++toUint120++`]]
- :toUint112-uint256: pass:normal[xref:#SafeCast-toUint112-uint256-[`++toUint112++`]]
- :toUint104-uint256: pass:normal[xref:#SafeCast-toUint104-uint256-[`++toUint104++`]]
- :toUint96-uint256: pass:normal[xref:#SafeCast-toUint96-uint256-[`++toUint96++`]]
- :toUint88-uint256: pass:normal[xref:#SafeCast-toUint88-uint256-[`++toUint88++`]]
- :toUint80-uint256: pass:normal[xref:#SafeCast-toUint80-uint256-[`++toUint80++`]]
- :toUint72-uint256: pass:normal[xref:#SafeCast-toUint72-uint256-[`++toUint72++`]]
- :toUint64-uint256: pass:normal[xref:#SafeCast-toUint64-uint256-[`++toUint64++`]]
- :toUint56-uint256: pass:normal[xref:#SafeCast-toUint56-uint256-[`++toUint56++`]]
- :toUint48-uint256: pass:normal[xref:#SafeCast-toUint48-uint256-[`++toUint48++`]]
- :toUint40-uint256: pass:normal[xref:#SafeCast-toUint40-uint256-[`++toUint40++`]]
- :toUint32-uint256: pass:normal[xref:#SafeCast-toUint32-uint256-[`++toUint32++`]]
- :toUint24-uint256: pass:normal[xref:#SafeCast-toUint24-uint256-[`++toUint24++`]]
- :toUint16-uint256: pass:normal[xref:#SafeCast-toUint16-uint256-[`++toUint16++`]]
- :toUint8-uint256: pass:normal[xref:#SafeCast-toUint8-uint256-[`++toUint8++`]]
- :toUint256-int256: pass:normal[xref:#SafeCast-toUint256-int256-[`++toUint256++`]]
- :toInt248-int256: pass:normal[xref:#SafeCast-toInt248-int256-[`++toInt248++`]]
- :toInt240-int256: pass:normal[xref:#SafeCast-toInt240-int256-[`++toInt240++`]]
- :toInt232-int256: pass:normal[xref:#SafeCast-toInt232-int256-[`++toInt232++`]]
- :toInt224-int256: pass:normal[xref:#SafeCast-toInt224-int256-[`++toInt224++`]]
- :toInt216-int256: pass:normal[xref:#SafeCast-toInt216-int256-[`++toInt216++`]]
- :toInt208-int256: pass:normal[xref:#SafeCast-toInt208-int256-[`++toInt208++`]]
- :toInt200-int256: pass:normal[xref:#SafeCast-toInt200-int256-[`++toInt200++`]]
- :toInt192-int256: pass:normal[xref:#SafeCast-toInt192-int256-[`++toInt192++`]]
- :toInt184-int256: pass:normal[xref:#SafeCast-toInt184-int256-[`++toInt184++`]]
- :toInt176-int256: pass:normal[xref:#SafeCast-toInt176-int256-[`++toInt176++`]]
- :toInt168-int256: pass:normal[xref:#SafeCast-toInt168-int256-[`++toInt168++`]]
- :toInt160-int256: pass:normal[xref:#SafeCast-toInt160-int256-[`++toInt160++`]]
- :toInt152-int256: pass:normal[xref:#SafeCast-toInt152-int256-[`++toInt152++`]]
- :toInt144-int256: pass:normal[xref:#SafeCast-toInt144-int256-[`++toInt144++`]]
- :toInt136-int256: pass:normal[xref:#SafeCast-toInt136-int256-[`++toInt136++`]]
- :toInt128-int256: pass:normal[xref:#SafeCast-toInt128-int256-[`++toInt128++`]]
- :toInt120-int256: pass:normal[xref:#SafeCast-toInt120-int256-[`++toInt120++`]]
- :toInt112-int256: pass:normal[xref:#SafeCast-toInt112-int256-[`++toInt112++`]]
- :toInt104-int256: pass:normal[xref:#SafeCast-toInt104-int256-[`++toInt104++`]]
- :toInt96-int256: pass:normal[xref:#SafeCast-toInt96-int256-[`++toInt96++`]]
- :toInt88-int256: pass:normal[xref:#SafeCast-toInt88-int256-[`++toInt88++`]]
- :toInt80-int256: pass:normal[xref:#SafeCast-toInt80-int256-[`++toInt80++`]]
- :toInt72-int256: pass:normal[xref:#SafeCast-toInt72-int256-[`++toInt72++`]]
- :toInt64-int256: pass:normal[xref:#SafeCast-toInt64-int256-[`++toInt64++`]]
- :toInt56-int256: pass:normal[xref:#SafeCast-toInt56-int256-[`++toInt56++`]]
- :toInt48-int256: pass:normal[xref:#SafeCast-toInt48-int256-[`++toInt48++`]]
- :toInt40-int256: pass:normal[xref:#SafeCast-toInt40-int256-[`++toInt40++`]]
- :toInt32-int256: pass:normal[xref:#SafeCast-toInt32-int256-[`++toInt32++`]]
- :toInt24-int256: pass:normal[xref:#SafeCast-toInt24-int256-[`++toInt24++`]]
- :toInt16-int256: pass:normal[xref:#SafeCast-toInt16-int256-[`++toInt16++`]]
- :toInt8-int256: pass:normal[xref:#SafeCast-toInt8-int256-[`++toInt8++`]]
- :toInt256-uint256: pass:normal[xref:#SafeCast-toInt256-uint256-[`++toInt256++`]]
- :toUint-bool: pass:normal[xref:#SafeCast-toUint-bool-[`++toUint++`]]
- [.contract]
- [[SafeCast]]
- === `++SafeCast++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/math/SafeCast.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/math/SafeCast.sol";
- ```
- Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
- checks.
- Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
- easily result in undesired exploitation or bugs, since developers usually
- assume that overflows raise errors. `SafeCast` restores this intuition by
- reverting the transaction when such an operation overflows.
- Using this library instead of the unchecked operations eliminates an entire
- class of bugs, so it's recommended to use it always.
- [.contract-index]
- .Functions
- --
- * {xref-SafeCast-toUint248-uint256-}[`++toUint248(value)++`]
- * {xref-SafeCast-toUint240-uint256-}[`++toUint240(value)++`]
- * {xref-SafeCast-toUint232-uint256-}[`++toUint232(value)++`]
- * {xref-SafeCast-toUint224-uint256-}[`++toUint224(value)++`]
- * {xref-SafeCast-toUint216-uint256-}[`++toUint216(value)++`]
- * {xref-SafeCast-toUint208-uint256-}[`++toUint208(value)++`]
- * {xref-SafeCast-toUint200-uint256-}[`++toUint200(value)++`]
- * {xref-SafeCast-toUint192-uint256-}[`++toUint192(value)++`]
- * {xref-SafeCast-toUint184-uint256-}[`++toUint184(value)++`]
- * {xref-SafeCast-toUint176-uint256-}[`++toUint176(value)++`]
- * {xref-SafeCast-toUint168-uint256-}[`++toUint168(value)++`]
- * {xref-SafeCast-toUint160-uint256-}[`++toUint160(value)++`]
- * {xref-SafeCast-toUint152-uint256-}[`++toUint152(value)++`]
- * {xref-SafeCast-toUint144-uint256-}[`++toUint144(value)++`]
- * {xref-SafeCast-toUint136-uint256-}[`++toUint136(value)++`]
- * {xref-SafeCast-toUint128-uint256-}[`++toUint128(value)++`]
- * {xref-SafeCast-toUint120-uint256-}[`++toUint120(value)++`]
- * {xref-SafeCast-toUint112-uint256-}[`++toUint112(value)++`]
- * {xref-SafeCast-toUint104-uint256-}[`++toUint104(value)++`]
- * {xref-SafeCast-toUint96-uint256-}[`++toUint96(value)++`]
- * {xref-SafeCast-toUint88-uint256-}[`++toUint88(value)++`]
- * {xref-SafeCast-toUint80-uint256-}[`++toUint80(value)++`]
- * {xref-SafeCast-toUint72-uint256-}[`++toUint72(value)++`]
- * {xref-SafeCast-toUint64-uint256-}[`++toUint64(value)++`]
- * {xref-SafeCast-toUint56-uint256-}[`++toUint56(value)++`]
- * {xref-SafeCast-toUint48-uint256-}[`++toUint48(value)++`]
- * {xref-SafeCast-toUint40-uint256-}[`++toUint40(value)++`]
- * {xref-SafeCast-toUint32-uint256-}[`++toUint32(value)++`]
- * {xref-SafeCast-toUint24-uint256-}[`++toUint24(value)++`]
- * {xref-SafeCast-toUint16-uint256-}[`++toUint16(value)++`]
- * {xref-SafeCast-toUint8-uint256-}[`++toUint8(value)++`]
- * {xref-SafeCast-toUint256-int256-}[`++toUint256(value)++`]
- * {xref-SafeCast-toInt248-int256-}[`++toInt248(value)++`]
- * {xref-SafeCast-toInt240-int256-}[`++toInt240(value)++`]
- * {xref-SafeCast-toInt232-int256-}[`++toInt232(value)++`]
- * {xref-SafeCast-toInt224-int256-}[`++toInt224(value)++`]
- * {xref-SafeCast-toInt216-int256-}[`++toInt216(value)++`]
- * {xref-SafeCast-toInt208-int256-}[`++toInt208(value)++`]
- * {xref-SafeCast-toInt200-int256-}[`++toInt200(value)++`]
- * {xref-SafeCast-toInt192-int256-}[`++toInt192(value)++`]
- * {xref-SafeCast-toInt184-int256-}[`++toInt184(value)++`]
- * {xref-SafeCast-toInt176-int256-}[`++toInt176(value)++`]
- * {xref-SafeCast-toInt168-int256-}[`++toInt168(value)++`]
- * {xref-SafeCast-toInt160-int256-}[`++toInt160(value)++`]
- * {xref-SafeCast-toInt152-int256-}[`++toInt152(value)++`]
- * {xref-SafeCast-toInt144-int256-}[`++toInt144(value)++`]
- * {xref-SafeCast-toInt136-int256-}[`++toInt136(value)++`]
- * {xref-SafeCast-toInt128-int256-}[`++toInt128(value)++`]
- * {xref-SafeCast-toInt120-int256-}[`++toInt120(value)++`]
- * {xref-SafeCast-toInt112-int256-}[`++toInt112(value)++`]
- * {xref-SafeCast-toInt104-int256-}[`++toInt104(value)++`]
- * {xref-SafeCast-toInt96-int256-}[`++toInt96(value)++`]
- * {xref-SafeCast-toInt88-int256-}[`++toInt88(value)++`]
- * {xref-SafeCast-toInt80-int256-}[`++toInt80(value)++`]
- * {xref-SafeCast-toInt72-int256-}[`++toInt72(value)++`]
- * {xref-SafeCast-toInt64-int256-}[`++toInt64(value)++`]
- * {xref-SafeCast-toInt56-int256-}[`++toInt56(value)++`]
- * {xref-SafeCast-toInt48-int256-}[`++toInt48(value)++`]
- * {xref-SafeCast-toInt40-int256-}[`++toInt40(value)++`]
- * {xref-SafeCast-toInt32-int256-}[`++toInt32(value)++`]
- * {xref-SafeCast-toInt24-int256-}[`++toInt24(value)++`]
- * {xref-SafeCast-toInt16-int256-}[`++toInt16(value)++`]
- * {xref-SafeCast-toInt8-int256-}[`++toInt8(value)++`]
- * {xref-SafeCast-toInt256-uint256-}[`++toInt256(value)++`]
- * {xref-SafeCast-toUint-bool-}[`++toUint(b)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-SafeCast-SafeCastOverflowedUintDowncast-uint8-uint256-}[`++SafeCastOverflowedUintDowncast(bits, value)++`]
- * {xref-SafeCast-SafeCastOverflowedIntToUint-int256-}[`++SafeCastOverflowedIntToUint(value)++`]
- * {xref-SafeCast-SafeCastOverflowedIntDowncast-uint8-int256-}[`++SafeCastOverflowedIntDowncast(bits, value)++`]
- * {xref-SafeCast-SafeCastOverflowedUintToInt-uint256-}[`++SafeCastOverflowedUintToInt(value)++`]
- --
- [.contract-item]
- [[SafeCast-toUint248-uint256-]]
- ==== `[.contract-item-name]#++toUint248++#++(uint256 value) โ uint248++` [.item-kind]#internal#
- Returns the downcasted uint248 from uint256, reverting on
- overflow (when the input is greater than largest uint248).
- Counterpart to Solidity's `uint248` operator.
- Requirements:
- - input must fit into 248 bits
- [.contract-item]
- [[SafeCast-toUint240-uint256-]]
- ==== `[.contract-item-name]#++toUint240++#++(uint256 value) โ uint240++` [.item-kind]#internal#
- Returns the downcasted uint240 from uint256, reverting on
- overflow (when the input is greater than largest uint240).
- Counterpart to Solidity's `uint240` operator.
- Requirements:
- - input must fit into 240 bits
- [.contract-item]
- [[SafeCast-toUint232-uint256-]]
- ==== `[.contract-item-name]#++toUint232++#++(uint256 value) โ uint232++` [.item-kind]#internal#
- Returns the downcasted uint232 from uint256, reverting on
- overflow (when the input is greater than largest uint232).
- Counterpart to Solidity's `uint232` operator.
- Requirements:
- - input must fit into 232 bits
- [.contract-item]
- [[SafeCast-toUint224-uint256-]]
- ==== `[.contract-item-name]#++toUint224++#++(uint256 value) โ uint224++` [.item-kind]#internal#
- Returns the downcasted uint224 from uint256, reverting on
- overflow (when the input is greater than largest uint224).
- Counterpart to Solidity's `uint224` operator.
- Requirements:
- - input must fit into 224 bits
- [.contract-item]
- [[SafeCast-toUint216-uint256-]]
- ==== `[.contract-item-name]#++toUint216++#++(uint256 value) โ uint216++` [.item-kind]#internal#
- Returns the downcasted uint216 from uint256, reverting on
- overflow (when the input is greater than largest uint216).
- Counterpart to Solidity's `uint216` operator.
- Requirements:
- - input must fit into 216 bits
- [.contract-item]
- [[SafeCast-toUint208-uint256-]]
- ==== `[.contract-item-name]#++toUint208++#++(uint256 value) โ uint208++` [.item-kind]#internal#
- Returns the downcasted uint208 from uint256, reverting on
- overflow (when the input is greater than largest uint208).
- Counterpart to Solidity's `uint208` operator.
- Requirements:
- - input must fit into 208 bits
- [.contract-item]
- [[SafeCast-toUint200-uint256-]]
- ==== `[.contract-item-name]#++toUint200++#++(uint256 value) โ uint200++` [.item-kind]#internal#
- Returns the downcasted uint200 from uint256, reverting on
- overflow (when the input is greater than largest uint200).
- Counterpart to Solidity's `uint200` operator.
- Requirements:
- - input must fit into 200 bits
- [.contract-item]
- [[SafeCast-toUint192-uint256-]]
- ==== `[.contract-item-name]#++toUint192++#++(uint256 value) โ uint192++` [.item-kind]#internal#
- Returns the downcasted uint192 from uint256, reverting on
- overflow (when the input is greater than largest uint192).
- Counterpart to Solidity's `uint192` operator.
- Requirements:
- - input must fit into 192 bits
- [.contract-item]
- [[SafeCast-toUint184-uint256-]]
- ==== `[.contract-item-name]#++toUint184++#++(uint256 value) โ uint184++` [.item-kind]#internal#
- Returns the downcasted uint184 from uint256, reverting on
- overflow (when the input is greater than largest uint184).
- Counterpart to Solidity's `uint184` operator.
- Requirements:
- - input must fit into 184 bits
- [.contract-item]
- [[SafeCast-toUint176-uint256-]]
- ==== `[.contract-item-name]#++toUint176++#++(uint256 value) โ uint176++` [.item-kind]#internal#
- Returns the downcasted uint176 from uint256, reverting on
- overflow (when the input is greater than largest uint176).
- Counterpart to Solidity's `uint176` operator.
- Requirements:
- - input must fit into 176 bits
- [.contract-item]
- [[SafeCast-toUint168-uint256-]]
- ==== `[.contract-item-name]#++toUint168++#++(uint256 value) โ uint168++` [.item-kind]#internal#
- Returns the downcasted uint168 from uint256, reverting on
- overflow (when the input is greater than largest uint168).
- Counterpart to Solidity's `uint168` operator.
- Requirements:
- - input must fit into 168 bits
- [.contract-item]
- [[SafeCast-toUint160-uint256-]]
- ==== `[.contract-item-name]#++toUint160++#++(uint256 value) โ uint160++` [.item-kind]#internal#
- Returns the downcasted uint160 from uint256, reverting on
- overflow (when the input is greater than largest uint160).
- Counterpart to Solidity's `uint160` operator.
- Requirements:
- - input must fit into 160 bits
- [.contract-item]
- [[SafeCast-toUint152-uint256-]]
- ==== `[.contract-item-name]#++toUint152++#++(uint256 value) โ uint152++` [.item-kind]#internal#
- Returns the downcasted uint152 from uint256, reverting on
- overflow (when the input is greater than largest uint152).
- Counterpart to Solidity's `uint152` operator.
- Requirements:
- - input must fit into 152 bits
- [.contract-item]
- [[SafeCast-toUint144-uint256-]]
- ==== `[.contract-item-name]#++toUint144++#++(uint256 value) โ uint144++` [.item-kind]#internal#
- Returns the downcasted uint144 from uint256, reverting on
- overflow (when the input is greater than largest uint144).
- Counterpart to Solidity's `uint144` operator.
- Requirements:
- - input must fit into 144 bits
- [.contract-item]
- [[SafeCast-toUint136-uint256-]]
- ==== `[.contract-item-name]#++toUint136++#++(uint256 value) โ uint136++` [.item-kind]#internal#
- Returns the downcasted uint136 from uint256, reverting on
- overflow (when the input is greater than largest uint136).
- Counterpart to Solidity's `uint136` operator.
- Requirements:
- - input must fit into 136 bits
- [.contract-item]
- [[SafeCast-toUint128-uint256-]]
- ==== `[.contract-item-name]#++toUint128++#++(uint256 value) โ uint128++` [.item-kind]#internal#
- Returns the downcasted uint128 from uint256, reverting on
- overflow (when the input is greater than largest uint128).
- Counterpart to Solidity's `uint128` operator.
- Requirements:
- - input must fit into 128 bits
- [.contract-item]
- [[SafeCast-toUint120-uint256-]]
- ==== `[.contract-item-name]#++toUint120++#++(uint256 value) โ uint120++` [.item-kind]#internal#
- Returns the downcasted uint120 from uint256, reverting on
- overflow (when the input is greater than largest uint120).
- Counterpart to Solidity's `uint120` operator.
- Requirements:
- - input must fit into 120 bits
- [.contract-item]
- [[SafeCast-toUint112-uint256-]]
- ==== `[.contract-item-name]#++toUint112++#++(uint256 value) โ uint112++` [.item-kind]#internal#
- Returns the downcasted uint112 from uint256, reverting on
- overflow (when the input is greater than largest uint112).
- Counterpart to Solidity's `uint112` operator.
- Requirements:
- - input must fit into 112 bits
- [.contract-item]
- [[SafeCast-toUint104-uint256-]]
- ==== `[.contract-item-name]#++toUint104++#++(uint256 value) โ uint104++` [.item-kind]#internal#
- Returns the downcasted uint104 from uint256, reverting on
- overflow (when the input is greater than largest uint104).
- Counterpart to Solidity's `uint104` operator.
- Requirements:
- - input must fit into 104 bits
- [.contract-item]
- [[SafeCast-toUint96-uint256-]]
- ==== `[.contract-item-name]#++toUint96++#++(uint256 value) โ uint96++` [.item-kind]#internal#
- Returns the downcasted uint96 from uint256, reverting on
- overflow (when the input is greater than largest uint96).
- Counterpart to Solidity's `uint96` operator.
- Requirements:
- - input must fit into 96 bits
- [.contract-item]
- [[SafeCast-toUint88-uint256-]]
- ==== `[.contract-item-name]#++toUint88++#++(uint256 value) โ uint88++` [.item-kind]#internal#
- Returns the downcasted uint88 from uint256, reverting on
- overflow (when the input is greater than largest uint88).
- Counterpart to Solidity's `uint88` operator.
- Requirements:
- - input must fit into 88 bits
- [.contract-item]
- [[SafeCast-toUint80-uint256-]]
- ==== `[.contract-item-name]#++toUint80++#++(uint256 value) โ uint80++` [.item-kind]#internal#
- Returns the downcasted uint80 from uint256, reverting on
- overflow (when the input is greater than largest uint80).
- Counterpart to Solidity's `uint80` operator.
- Requirements:
- - input must fit into 80 bits
- [.contract-item]
- [[SafeCast-toUint72-uint256-]]
- ==== `[.contract-item-name]#++toUint72++#++(uint256 value) โ uint72++` [.item-kind]#internal#
- Returns the downcasted uint72 from uint256, reverting on
- overflow (when the input is greater than largest uint72).
- Counterpart to Solidity's `uint72` operator.
- Requirements:
- - input must fit into 72 bits
- [.contract-item]
- [[SafeCast-toUint64-uint256-]]
- ==== `[.contract-item-name]#++toUint64++#++(uint256 value) โ uint64++` [.item-kind]#internal#
- Returns the downcasted uint64 from uint256, reverting on
- overflow (when the input is greater than largest uint64).
- Counterpart to Solidity's `uint64` operator.
- Requirements:
- - input must fit into 64 bits
- [.contract-item]
- [[SafeCast-toUint56-uint256-]]
- ==== `[.contract-item-name]#++toUint56++#++(uint256 value) โ uint56++` [.item-kind]#internal#
- Returns the downcasted uint56 from uint256, reverting on
- overflow (when the input is greater than largest uint56).
- Counterpart to Solidity's `uint56` operator.
- Requirements:
- - input must fit into 56 bits
- [.contract-item]
- [[SafeCast-toUint48-uint256-]]
- ==== `[.contract-item-name]#++toUint48++#++(uint256 value) โ uint48++` [.item-kind]#internal#
- Returns the downcasted uint48 from uint256, reverting on
- overflow (when the input is greater than largest uint48).
- Counterpart to Solidity's `uint48` operator.
- Requirements:
- - input must fit into 48 bits
- [.contract-item]
- [[SafeCast-toUint40-uint256-]]
- ==== `[.contract-item-name]#++toUint40++#++(uint256 value) โ uint40++` [.item-kind]#internal#
- Returns the downcasted uint40 from uint256, reverting on
- overflow (when the input is greater than largest uint40).
- Counterpart to Solidity's `uint40` operator.
- Requirements:
- - input must fit into 40 bits
- [.contract-item]
- [[SafeCast-toUint32-uint256-]]
- ==== `[.contract-item-name]#++toUint32++#++(uint256 value) โ uint32++` [.item-kind]#internal#
- Returns the downcasted uint32 from uint256, reverting on
- overflow (when the input is greater than largest uint32).
- Counterpart to Solidity's `uint32` operator.
- Requirements:
- - input must fit into 32 bits
- [.contract-item]
- [[SafeCast-toUint24-uint256-]]
- ==== `[.contract-item-name]#++toUint24++#++(uint256 value) โ uint24++` [.item-kind]#internal#
- Returns the downcasted uint24 from uint256, reverting on
- overflow (when the input is greater than largest uint24).
- Counterpart to Solidity's `uint24` operator.
- Requirements:
- - input must fit into 24 bits
- [.contract-item]
- [[SafeCast-toUint16-uint256-]]
- ==== `[.contract-item-name]#++toUint16++#++(uint256 value) โ uint16++` [.item-kind]#internal#
- Returns the downcasted uint16 from uint256, reverting on
- overflow (when the input is greater than largest uint16).
- Counterpart to Solidity's `uint16` operator.
- Requirements:
- - input must fit into 16 bits
- [.contract-item]
- [[SafeCast-toUint8-uint256-]]
- ==== `[.contract-item-name]#++toUint8++#++(uint256 value) โ uint8++` [.item-kind]#internal#
- Returns the downcasted uint8 from uint256, reverting on
- overflow (when the input is greater than largest uint8).
- Counterpart to Solidity's `uint8` operator.
- Requirements:
- - input must fit into 8 bits
- [.contract-item]
- [[SafeCast-toUint256-int256-]]
- ==== `[.contract-item-name]#++toUint256++#++(int256 value) โ uint256++` [.item-kind]#internal#
- Converts a signed int256 into an unsigned uint256.
- Requirements:
- - input must be greater than or equal to 0.
- [.contract-item]
- [[SafeCast-toInt248-int256-]]
- ==== `[.contract-item-name]#++toInt248++#++(int256 value) โ int248 downcasted++` [.item-kind]#internal#
- Returns the downcasted int248 from int256, reverting on
- overflow (when the input is less than smallest int248 or
- greater than largest int248).
- Counterpart to Solidity's `int248` operator.
- Requirements:
- - input must fit into 248 bits
- [.contract-item]
- [[SafeCast-toInt240-int256-]]
- ==== `[.contract-item-name]#++toInt240++#++(int256 value) โ int240 downcasted++` [.item-kind]#internal#
- Returns the downcasted int240 from int256, reverting on
- overflow (when the input is less than smallest int240 or
- greater than largest int240).
- Counterpart to Solidity's `int240` operator.
- Requirements:
- - input must fit into 240 bits
- [.contract-item]
- [[SafeCast-toInt232-int256-]]
- ==== `[.contract-item-name]#++toInt232++#++(int256 value) โ int232 downcasted++` [.item-kind]#internal#
- Returns the downcasted int232 from int256, reverting on
- overflow (when the input is less than smallest int232 or
- greater than largest int232).
- Counterpart to Solidity's `int232` operator.
- Requirements:
- - input must fit into 232 bits
- [.contract-item]
- [[SafeCast-toInt224-int256-]]
- ==== `[.contract-item-name]#++toInt224++#++(int256 value) โ int224 downcasted++` [.item-kind]#internal#
- Returns the downcasted int224 from int256, reverting on
- overflow (when the input is less than smallest int224 or
- greater than largest int224).
- Counterpart to Solidity's `int224` operator.
- Requirements:
- - input must fit into 224 bits
- [.contract-item]
- [[SafeCast-toInt216-int256-]]
- ==== `[.contract-item-name]#++toInt216++#++(int256 value) โ int216 downcasted++` [.item-kind]#internal#
- Returns the downcasted int216 from int256, reverting on
- overflow (when the input is less than smallest int216 or
- greater than largest int216).
- Counterpart to Solidity's `int216` operator.
- Requirements:
- - input must fit into 216 bits
- [.contract-item]
- [[SafeCast-toInt208-int256-]]
- ==== `[.contract-item-name]#++toInt208++#++(int256 value) โ int208 downcasted++` [.item-kind]#internal#
- Returns the downcasted int208 from int256, reverting on
- overflow (when the input is less than smallest int208 or
- greater than largest int208).
- Counterpart to Solidity's `int208` operator.
- Requirements:
- - input must fit into 208 bits
- [.contract-item]
- [[SafeCast-toInt200-int256-]]
- ==== `[.contract-item-name]#++toInt200++#++(int256 value) โ int200 downcasted++` [.item-kind]#internal#
- Returns the downcasted int200 from int256, reverting on
- overflow (when the input is less than smallest int200 or
- greater than largest int200).
- Counterpart to Solidity's `int200` operator.
- Requirements:
- - input must fit into 200 bits
- [.contract-item]
- [[SafeCast-toInt192-int256-]]
- ==== `[.contract-item-name]#++toInt192++#++(int256 value) โ int192 downcasted++` [.item-kind]#internal#
- Returns the downcasted int192 from int256, reverting on
- overflow (when the input is less than smallest int192 or
- greater than largest int192).
- Counterpart to Solidity's `int192` operator.
- Requirements:
- - input must fit into 192 bits
- [.contract-item]
- [[SafeCast-toInt184-int256-]]
- ==== `[.contract-item-name]#++toInt184++#++(int256 value) โ int184 downcasted++` [.item-kind]#internal#
- Returns the downcasted int184 from int256, reverting on
- overflow (when the input is less than smallest int184 or
- greater than largest int184).
- Counterpart to Solidity's `int184` operator.
- Requirements:
- - input must fit into 184 bits
- [.contract-item]
- [[SafeCast-toInt176-int256-]]
- ==== `[.contract-item-name]#++toInt176++#++(int256 value) โ int176 downcasted++` [.item-kind]#internal#
- Returns the downcasted int176 from int256, reverting on
- overflow (when the input is less than smallest int176 or
- greater than largest int176).
- Counterpart to Solidity's `int176` operator.
- Requirements:
- - input must fit into 176 bits
- [.contract-item]
- [[SafeCast-toInt168-int256-]]
- ==== `[.contract-item-name]#++toInt168++#++(int256 value) โ int168 downcasted++` [.item-kind]#internal#
- Returns the downcasted int168 from int256, reverting on
- overflow (when the input is less than smallest int168 or
- greater than largest int168).
- Counterpart to Solidity's `int168` operator.
- Requirements:
- - input must fit into 168 bits
- [.contract-item]
- [[SafeCast-toInt160-int256-]]
- ==== `[.contract-item-name]#++toInt160++#++(int256 value) โ int160 downcasted++` [.item-kind]#internal#
- Returns the downcasted int160 from int256, reverting on
- overflow (when the input is less than smallest int160 or
- greater than largest int160).
- Counterpart to Solidity's `int160` operator.
- Requirements:
- - input must fit into 160 bits
- [.contract-item]
- [[SafeCast-toInt152-int256-]]
- ==== `[.contract-item-name]#++toInt152++#++(int256 value) โ int152 downcasted++` [.item-kind]#internal#
- Returns the downcasted int152 from int256, reverting on
- overflow (when the input is less than smallest int152 or
- greater than largest int152).
- Counterpart to Solidity's `int152` operator.
- Requirements:
- - input must fit into 152 bits
- [.contract-item]
- [[SafeCast-toInt144-int256-]]
- ==== `[.contract-item-name]#++toInt144++#++(int256 value) โ int144 downcasted++` [.item-kind]#internal#
- Returns the downcasted int144 from int256, reverting on
- overflow (when the input is less than smallest int144 or
- greater than largest int144).
- Counterpart to Solidity's `int144` operator.
- Requirements:
- - input must fit into 144 bits
- [.contract-item]
- [[SafeCast-toInt136-int256-]]
- ==== `[.contract-item-name]#++toInt136++#++(int256 value) โ int136 downcasted++` [.item-kind]#internal#
- Returns the downcasted int136 from int256, reverting on
- overflow (when the input is less than smallest int136 or
- greater than largest int136).
- Counterpart to Solidity's `int136` operator.
- Requirements:
- - input must fit into 136 bits
- [.contract-item]
- [[SafeCast-toInt128-int256-]]
- ==== `[.contract-item-name]#++toInt128++#++(int256 value) โ int128 downcasted++` [.item-kind]#internal#
- Returns the downcasted int128 from int256, reverting on
- overflow (when the input is less than smallest int128 or
- greater than largest int128).
- Counterpart to Solidity's `int128` operator.
- Requirements:
- - input must fit into 128 bits
- [.contract-item]
- [[SafeCast-toInt120-int256-]]
- ==== `[.contract-item-name]#++toInt120++#++(int256 value) โ int120 downcasted++` [.item-kind]#internal#
- Returns the downcasted int120 from int256, reverting on
- overflow (when the input is less than smallest int120 or
- greater than largest int120).
- Counterpart to Solidity's `int120` operator.
- Requirements:
- - input must fit into 120 bits
- [.contract-item]
- [[SafeCast-toInt112-int256-]]
- ==== `[.contract-item-name]#++toInt112++#++(int256 value) โ int112 downcasted++` [.item-kind]#internal#
- Returns the downcasted int112 from int256, reverting on
- overflow (when the input is less than smallest int112 or
- greater than largest int112).
- Counterpart to Solidity's `int112` operator.
- Requirements:
- - input must fit into 112 bits
- [.contract-item]
- [[SafeCast-toInt104-int256-]]
- ==== `[.contract-item-name]#++toInt104++#++(int256 value) โ int104 downcasted++` [.item-kind]#internal#
- Returns the downcasted int104 from int256, reverting on
- overflow (when the input is less than smallest int104 or
- greater than largest int104).
- Counterpart to Solidity's `int104` operator.
- Requirements:
- - input must fit into 104 bits
- [.contract-item]
- [[SafeCast-toInt96-int256-]]
- ==== `[.contract-item-name]#++toInt96++#++(int256 value) โ int96 downcasted++` [.item-kind]#internal#
- Returns the downcasted int96 from int256, reverting on
- overflow (when the input is less than smallest int96 or
- greater than largest int96).
- Counterpart to Solidity's `int96` operator.
- Requirements:
- - input must fit into 96 bits
- [.contract-item]
- [[SafeCast-toInt88-int256-]]
- ==== `[.contract-item-name]#++toInt88++#++(int256 value) โ int88 downcasted++` [.item-kind]#internal#
- Returns the downcasted int88 from int256, reverting on
- overflow (when the input is less than smallest int88 or
- greater than largest int88).
- Counterpart to Solidity's `int88` operator.
- Requirements:
- - input must fit into 88 bits
- [.contract-item]
- [[SafeCast-toInt80-int256-]]
- ==== `[.contract-item-name]#++toInt80++#++(int256 value) โ int80 downcasted++` [.item-kind]#internal#
- Returns the downcasted int80 from int256, reverting on
- overflow (when the input is less than smallest int80 or
- greater than largest int80).
- Counterpart to Solidity's `int80` operator.
- Requirements:
- - input must fit into 80 bits
- [.contract-item]
- [[SafeCast-toInt72-int256-]]
- ==== `[.contract-item-name]#++toInt72++#++(int256 value) โ int72 downcasted++` [.item-kind]#internal#
- Returns the downcasted int72 from int256, reverting on
- overflow (when the input is less than smallest int72 or
- greater than largest int72).
- Counterpart to Solidity's `int72` operator.
- Requirements:
- - input must fit into 72 bits
- [.contract-item]
- [[SafeCast-toInt64-int256-]]
- ==== `[.contract-item-name]#++toInt64++#++(int256 value) โ int64 downcasted++` [.item-kind]#internal#
- Returns the downcasted int64 from int256, reverting on
- overflow (when the input is less than smallest int64 or
- greater than largest int64).
- Counterpart to Solidity's `int64` operator.
- Requirements:
- - input must fit into 64 bits
- [.contract-item]
- [[SafeCast-toInt56-int256-]]
- ==== `[.contract-item-name]#++toInt56++#++(int256 value) โ int56 downcasted++` [.item-kind]#internal#
- Returns the downcasted int56 from int256, reverting on
- overflow (when the input is less than smallest int56 or
- greater than largest int56).
- Counterpart to Solidity's `int56` operator.
- Requirements:
- - input must fit into 56 bits
- [.contract-item]
- [[SafeCast-toInt48-int256-]]
- ==== `[.contract-item-name]#++toInt48++#++(int256 value) โ int48 downcasted++` [.item-kind]#internal#
- Returns the downcasted int48 from int256, reverting on
- overflow (when the input is less than smallest int48 or
- greater than largest int48).
- Counterpart to Solidity's `int48` operator.
- Requirements:
- - input must fit into 48 bits
- [.contract-item]
- [[SafeCast-toInt40-int256-]]
- ==== `[.contract-item-name]#++toInt40++#++(int256 value) โ int40 downcasted++` [.item-kind]#internal#
- Returns the downcasted int40 from int256, reverting on
- overflow (when the input is less than smallest int40 or
- greater than largest int40).
- Counterpart to Solidity's `int40` operator.
- Requirements:
- - input must fit into 40 bits
- [.contract-item]
- [[SafeCast-toInt32-int256-]]
- ==== `[.contract-item-name]#++toInt32++#++(int256 value) โ int32 downcasted++` [.item-kind]#internal#
- Returns the downcasted int32 from int256, reverting on
- overflow (when the input is less than smallest int32 or
- greater than largest int32).
- Counterpart to Solidity's `int32` operator.
- Requirements:
- - input must fit into 32 bits
- [.contract-item]
- [[SafeCast-toInt24-int256-]]
- ==== `[.contract-item-name]#++toInt24++#++(int256 value) โ int24 downcasted++` [.item-kind]#internal#
- Returns the downcasted int24 from int256, reverting on
- overflow (when the input is less than smallest int24 or
- greater than largest int24).
- Counterpart to Solidity's `int24` operator.
- Requirements:
- - input must fit into 24 bits
- [.contract-item]
- [[SafeCast-toInt16-int256-]]
- ==== `[.contract-item-name]#++toInt16++#++(int256 value) โ int16 downcasted++` [.item-kind]#internal#
- Returns the downcasted int16 from int256, reverting on
- overflow (when the input is less than smallest int16 or
- greater than largest int16).
- Counterpart to Solidity's `int16` operator.
- Requirements:
- - input must fit into 16 bits
- [.contract-item]
- [[SafeCast-toInt8-int256-]]
- ==== `[.contract-item-name]#++toInt8++#++(int256 value) โ int8 downcasted++` [.item-kind]#internal#
- Returns the downcasted int8 from int256, reverting on
- overflow (when the input is less than smallest int8 or
- greater than largest int8).
- Counterpart to Solidity's `int8` operator.
- Requirements:
- - input must fit into 8 bits
- [.contract-item]
- [[SafeCast-toInt256-uint256-]]
- ==== `[.contract-item-name]#++toInt256++#++(uint256 value) โ int256++` [.item-kind]#internal#
- Converts an unsigned uint256 into a signed int256.
- Requirements:
- - input must be less than or equal to maxInt256.
- [.contract-item]
- [[SafeCast-toUint-bool-]]
- ==== `[.contract-item-name]#++toUint++#++(bool b) โ uint256 u++` [.item-kind]#internal#
- Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.
- [.contract-item]
- [[SafeCast-SafeCastOverflowedUintDowncast-uint8-uint256-]]
- ==== `[.contract-item-name]#++SafeCastOverflowedUintDowncast++#++(uint8 bits, uint256 value)++` [.item-kind]#error#
- Value doesn't fit in an uint of `bits` size.
- [.contract-item]
- [[SafeCast-SafeCastOverflowedIntToUint-int256-]]
- ==== `[.contract-item-name]#++SafeCastOverflowedIntToUint++#++(int256 value)++` [.item-kind]#error#
- An int value doesn't fit in an uint of `bits` size.
- [.contract-item]
- [[SafeCast-SafeCastOverflowedIntDowncast-uint8-int256-]]
- ==== `[.contract-item-name]#++SafeCastOverflowedIntDowncast++#++(uint8 bits, int256 value)++` [.item-kind]#error#
- Value doesn't fit in an int of `bits` size.
- [.contract-item]
- [[SafeCast-SafeCastOverflowedUintToInt-uint256-]]
- ==== `[.contract-item-name]#++SafeCastOverflowedUintToInt++#++(uint256 value)++` [.item-kind]#error#
- An uint value doesn't fit in an int of `bits` size.
- == Security
- :ReentrancyGuardReentrantCall: pass:normal[xref:#ReentrancyGuard-ReentrancyGuardReentrantCall--[`++ReentrancyGuardReentrantCall++`]]
- :constructor: pass:normal[xref:#ReentrancyGuard-constructor--[`++constructor++`]]
- :nonReentrant: pass:normal[xref:#ReentrancyGuard-nonReentrant--[`++nonReentrant++`]]
- :_reentrancyGuardEntered: pass:normal[xref:#ReentrancyGuard-_reentrancyGuardEntered--[`++_reentrancyGuardEntered++`]]
- :constructor-: pass:normal[xref:#ReentrancyGuard-constructor--[`++constructor++`]]
- :_reentrancyGuardEntered-: pass:normal[xref:#ReentrancyGuard-_reentrancyGuardEntered--[`++_reentrancyGuardEntered++`]]
- [.contract]
- [[ReentrancyGuard]]
- === `++ReentrancyGuard++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/ReentrancyGuard.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
- ```
- Contract module that helps prevent reentrant calls to a function.
- Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
- available, which can be applied to functions to make sure there are no nested
- (reentrant) calls to them.
- Note that because there is a single `nonReentrant` guard, functions marked as
- `nonReentrant` may not call one another. This can be worked around by making
- those functions `private`, and then adding `external` `nonReentrant` entry
- points to them.
- TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
- consider using {ReentrancyGuardTransient} instead.
- TIP: If you would like to learn more about reentrancy and alternative ways
- to protect against it, check out our blog post
- https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
- [.contract-index]
- .Modifiers
- --
- * {xref-ReentrancyGuard-nonReentrant--}[`++nonReentrant()++`]
- --
- [.contract-index]
- .Functions
- --
- * {xref-ReentrancyGuard-constructor--}[`++constructor()++`]
- * {xref-ReentrancyGuard-_reentrancyGuardEntered--}[`++_reentrancyGuardEntered()++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ReentrancyGuard-ReentrancyGuardReentrantCall--}[`++ReentrancyGuardReentrantCall()++`]
- --
- [.contract-item]
- [[ReentrancyGuard-nonReentrant--]]
- ==== `[.contract-item-name]#++nonReentrant++#++()++` [.item-kind]#modifier#
- Prevents a contract from calling itself, directly or indirectly.
- Calling a `nonReentrant` function from another `nonReentrant`
- function is not supported. It is possible to prevent this from happening
- by making the `nonReentrant` function external, and making it call a
- `private` function that does the actual work.
- [.contract-item]
- [[ReentrancyGuard-constructor--]]
- ==== `[.contract-item-name]#++constructor++#++()++` [.item-kind]#internal#
- [.contract-item]
- [[ReentrancyGuard-_reentrancyGuardEntered--]]
- ==== `[.contract-item-name]#++_reentrancyGuardEntered++#++() โ bool++` [.item-kind]#internal#
- Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
- `nonReentrant` function in the call stack.
- [.contract-item]
- [[ReentrancyGuard-ReentrancyGuardReentrantCall--]]
- ==== `[.contract-item-name]#++ReentrancyGuardReentrantCall++#++()++` [.item-kind]#error#
- Unauthorized reentrant call.
- :ReentrancyGuardReentrantCall: pass:normal[xref:#ReentrancyGuardTransient-ReentrancyGuardReentrantCall--[`++ReentrancyGuardReentrantCall++`]]
- :nonReentrant: pass:normal[xref:#ReentrancyGuardTransient-nonReentrant--[`++nonReentrant++`]]
- :_reentrancyGuardEntered: pass:normal[xref:#ReentrancyGuardTransient-_reentrancyGuardEntered--[`++_reentrancyGuardEntered++`]]
- :_reentrancyGuardEntered-: pass:normal[xref:#ReentrancyGuardTransient-_reentrancyGuardEntered--[`++_reentrancyGuardEntered++`]]
- [.contract]
- [[ReentrancyGuardTransient]]
- === `++ReentrancyGuardTransient++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/ReentrancyGuardTransient.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol";
- ```
- Variant of {ReentrancyGuard} that uses transient storage.
- NOTE: This variant only works on networks where EIP-1153 is available.
- _Available since v5.1._
- [.contract-index]
- .Modifiers
- --
- * {xref-ReentrancyGuardTransient-nonReentrant--}[`++nonReentrant()++`]
- --
- [.contract-index]
- .Functions
- --
- * {xref-ReentrancyGuardTransient-_reentrancyGuardEntered--}[`++_reentrancyGuardEntered()++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ReentrancyGuardTransient-ReentrancyGuardReentrantCall--}[`++ReentrancyGuardReentrantCall()++`]
- --
- [.contract-item]
- [[ReentrancyGuardTransient-nonReentrant--]]
- ==== `[.contract-item-name]#++nonReentrant++#++()++` [.item-kind]#modifier#
- Prevents a contract from calling itself, directly or indirectly.
- Calling a `nonReentrant` function from another `nonReentrant`
- function is not supported. It is possible to prevent this from happening
- by making the `nonReentrant` function external, and making it call a
- `private` function that does the actual work.
- [.contract-item]
- [[ReentrancyGuardTransient-_reentrancyGuardEntered--]]
- ==== `[.contract-item-name]#++_reentrancyGuardEntered++#++() โ bool++` [.item-kind]#internal#
- Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
- `nonReentrant` function in the call stack.
- [.contract-item]
- [[ReentrancyGuardTransient-ReentrancyGuardReentrantCall--]]
- ==== `[.contract-item-name]#++ReentrancyGuardReentrantCall++#++()++` [.item-kind]#error#
- Unauthorized reentrant call.
- :Paused: pass:normal[xref:#Pausable-Paused-address-[`++Paused++`]]
- :Unpaused: pass:normal[xref:#Pausable-Unpaused-address-[`++Unpaused++`]]
- :EnforcedPause: pass:normal[xref:#Pausable-EnforcedPause--[`++EnforcedPause++`]]
- :ExpectedPause: pass:normal[xref:#Pausable-ExpectedPause--[`++ExpectedPause++`]]
- :whenNotPaused: pass:normal[xref:#Pausable-whenNotPaused--[`++whenNotPaused++`]]
- :whenPaused: pass:normal[xref:#Pausable-whenPaused--[`++whenPaused++`]]
- :paused: pass:normal[xref:#Pausable-paused--[`++paused++`]]
- :_requireNotPaused: pass:normal[xref:#Pausable-_requireNotPaused--[`++_requireNotPaused++`]]
- :_requirePaused: pass:normal[xref:#Pausable-_requirePaused--[`++_requirePaused++`]]
- :_pause: pass:normal[xref:#Pausable-_pause--[`++_pause++`]]
- :_unpause: pass:normal[xref:#Pausable-_unpause--[`++_unpause++`]]
- :paused-: pass:normal[xref:#Pausable-paused--[`++paused++`]]
- :_requireNotPaused-: pass:normal[xref:#Pausable-_requireNotPaused--[`++_requireNotPaused++`]]
- :_requirePaused-: pass:normal[xref:#Pausable-_requirePaused--[`++_requirePaused++`]]
- :_pause-: pass:normal[xref:#Pausable-_pause--[`++_pause++`]]
- :_unpause-: pass:normal[xref:#Pausable-_unpause--[`++_unpause++`]]
- [.contract]
- [[Pausable]]
- === `++Pausable++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Pausable.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Pausable.sol";
- ```
- Contract module which allows children to implement an emergency stop
- mechanism that can be triggered by an authorized account.
- This module is used through inheritance. It will make available the
- modifiers `whenNotPaused` and `whenPaused`, which can be applied to
- the functions of your contract. Note that they will not be pausable by
- simply including this module, only once the modifiers are put in place.
- [.contract-index]
- .Modifiers
- --
- * {xref-Pausable-whenNotPaused--}[`++whenNotPaused()++`]
- * {xref-Pausable-whenPaused--}[`++whenPaused()++`]
- --
- [.contract-index]
- .Functions
- --
- * {xref-Pausable-paused--}[`++paused()++`]
- * {xref-Pausable-_requireNotPaused--}[`++_requireNotPaused()++`]
- * {xref-Pausable-_requirePaused--}[`++_requirePaused()++`]
- * {xref-Pausable-_pause--}[`++_pause()++`]
- * {xref-Pausable-_unpause--}[`++_unpause()++`]
- --
- [.contract-index]
- .Events
- --
- * {xref-Pausable-Paused-address-}[`++Paused(account)++`]
- * {xref-Pausable-Unpaused-address-}[`++Unpaused(account)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Pausable-EnforcedPause--}[`++EnforcedPause()++`]
- * {xref-Pausable-ExpectedPause--}[`++ExpectedPause()++`]
- --
- [.contract-item]
- [[Pausable-whenNotPaused--]]
- ==== `[.contract-item-name]#++whenNotPaused++#++()++` [.item-kind]#modifier#
- Modifier to make a function callable only when the contract is not paused.
- Requirements:
- - The contract must not be paused.
- [.contract-item]
- [[Pausable-whenPaused--]]
- ==== `[.contract-item-name]#++whenPaused++#++()++` [.item-kind]#modifier#
- Modifier to make a function callable only when the contract is paused.
- Requirements:
- - The contract must be paused.
- [.contract-item]
- [[Pausable-paused--]]
- ==== `[.contract-item-name]#++paused++#++() โ bool++` [.item-kind]#public#
- Returns true if the contract is paused, and false otherwise.
- [.contract-item]
- [[Pausable-_requireNotPaused--]]
- ==== `[.contract-item-name]#++_requireNotPaused++#++()++` [.item-kind]#internal#
- Throws if the contract is paused.
- [.contract-item]
- [[Pausable-_requirePaused--]]
- ==== `[.contract-item-name]#++_requirePaused++#++()++` [.item-kind]#internal#
- Throws if the contract is not paused.
- [.contract-item]
- [[Pausable-_pause--]]
- ==== `[.contract-item-name]#++_pause++#++()++` [.item-kind]#internal#
- Triggers stopped state.
- Requirements:
- - The contract must not be paused.
- [.contract-item]
- [[Pausable-_unpause--]]
- ==== `[.contract-item-name]#++_unpause++#++()++` [.item-kind]#internal#
- Returns to normal state.
- Requirements:
- - The contract must be paused.
- [.contract-item]
- [[Pausable-Paused-address-]]
- ==== `[.contract-item-name]#++Paused++#++(address account)++` [.item-kind]#event#
- Emitted when the pause is triggered by `account`.
- [.contract-item]
- [[Pausable-Unpaused-address-]]
- ==== `[.contract-item-name]#++Unpaused++#++(address account)++` [.item-kind]#event#
- Emitted when the pause is lifted by `account`.
- [.contract-item]
- [[Pausable-EnforcedPause--]]
- ==== `[.contract-item-name]#++EnforcedPause++#++()++` [.item-kind]#error#
- The operation failed because the contract is paused.
- [.contract-item]
- [[Pausable-ExpectedPause--]]
- ==== `[.contract-item-name]#++ExpectedPause++#++()++` [.item-kind]#error#
- The operation failed because the contract is not paused.
- :InvalidAccountNonce: pass:normal[xref:#Nonces-InvalidAccountNonce-address-uint256-[`++InvalidAccountNonce++`]]
- :nonces: pass:normal[xref:#Nonces-nonces-address-[`++nonces++`]]
- :_useNonce: pass:normal[xref:#Nonces-_useNonce-address-[`++_useNonce++`]]
- :_useCheckedNonce: pass:normal[xref:#Nonces-_useCheckedNonce-address-uint256-[`++_useCheckedNonce++`]]
- :nonces-address: pass:normal[xref:#Nonces-nonces-address-[`++nonces++`]]
- :_useNonce-address: pass:normal[xref:#Nonces-_useNonce-address-[`++_useNonce++`]]
- :_useCheckedNonce-address-uint256: pass:normal[xref:#Nonces-_useCheckedNonce-address-uint256-[`++_useCheckedNonce++`]]
- [.contract]
- [[Nonces]]
- === `++Nonces++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Nonces.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Nonces.sol";
- ```
- Provides tracking nonces for addresses. Nonces will only increment.
- [.contract-index]
- .Functions
- --
- * {xref-Nonces-nonces-address-}[`++nonces(owner)++`]
- * {xref-Nonces-_useNonce-address-}[`++_useNonce(owner)++`]
- * {xref-Nonces-_useCheckedNonce-address-uint256-}[`++_useCheckedNonce(owner, nonce)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Nonces-InvalidAccountNonce-address-uint256-}[`++InvalidAccountNonce(account, currentNonce)++`]
- --
- [.contract-item]
- [[Nonces-nonces-address-]]
- ==== `[.contract-item-name]#++nonces++#++(address owner) โ uint256++` [.item-kind]#public#
- Returns the next unused nonce for an address.
- [.contract-item]
- [[Nonces-_useNonce-address-]]
- ==== `[.contract-item-name]#++_useNonce++#++(address owner) โ uint256++` [.item-kind]#internal#
- Consumes a nonce.
- Returns the current value and increments nonce.
- [.contract-item]
- [[Nonces-_useCheckedNonce-address-uint256-]]
- ==== `[.contract-item-name]#++_useCheckedNonce++#++(address owner, uint256 nonce)++` [.item-kind]#internal#
- Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
- [.contract-item]
- [[Nonces-InvalidAccountNonce-address-uint256-]]
- ==== `[.contract-item-name]#++InvalidAccountNonce++#++(address account, uint256 currentNonce)++` [.item-kind]#error#
- The nonce used for an `account` is not the expected current nonce.
- :nonces: pass:normal[xref:#NoncesKeyed-nonces-address-uint192-[`++nonces++`]]
- :_useNonce: pass:normal[xref:#NoncesKeyed-_useNonce-address-uint192-[`++_useNonce++`]]
- :_useCheckedNonce: pass:normal[xref:#NoncesKeyed-_useCheckedNonce-address-uint256-[`++_useCheckedNonce++`]]
- :_useCheckedNonce: pass:normal[xref:#NoncesKeyed-_useCheckedNonce-address-uint192-uint64-[`++_useCheckedNonce++`]]
- :nonces-address-uint192: pass:normal[xref:#NoncesKeyed-nonces-address-uint192-[`++nonces++`]]
- :_useNonce-address-uint192: pass:normal[xref:#NoncesKeyed-_useNonce-address-uint192-[`++_useNonce++`]]
- :_useCheckedNonce-address-uint256: pass:normal[xref:#NoncesKeyed-_useCheckedNonce-address-uint256-[`++_useCheckedNonce++`]]
- :_useCheckedNonce-address-uint192-uint64: pass:normal[xref:#NoncesKeyed-_useCheckedNonce-address-uint192-uint64-[`++_useCheckedNonce++`]]
- [.contract]
- [[NoncesKeyed]]
- === `++NoncesKeyed++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/NoncesKeyed.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/NoncesKeyed.sol";
- ```
- Alternative to {Nonces}, that supports key-ed nonces.
- Follows the https://eips.ethereum.org/EIPS/eip-4337#semi-abstracted-nonce-support[ERC-4337's semi-abstracted nonce system].
- NOTE: This contract inherits from {Nonces} and reuses its storage for the first nonce key (i.e. `0`). This
- makes upgrading from {Nonces} to {NoncesKeyed} safe when using their upgradeable versions (e.g. `NoncesKeyedUpgradeable`).
- Doing so will NOT reset the current state of nonces, avoiding replay attacks where a nonce is reused after the upgrade.
- [.contract-index]
- .Functions
- --
- * {xref-NoncesKeyed-nonces-address-uint192-}[`++nonces(owner, key)++`]
- * {xref-NoncesKeyed-_useNonce-address-uint192-}[`++_useNonce(owner, key)++`]
- * {xref-NoncesKeyed-_useCheckedNonce-address-uint256-}[`++_useCheckedNonce(owner, keyNonce)++`]
- * {xref-NoncesKeyed-_useCheckedNonce-address-uint192-uint64-}[`++_useCheckedNonce(owner, key, nonce)++`]
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-nonces-address-}[`++nonces(owner)++`]
- * {xref-Nonces-_useNonce-address-}[`++_useNonce(owner)++`]
- --
- [.contract-index]
- .Errors
- --
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-InvalidAccountNonce-address-uint256-}[`++InvalidAccountNonce(account, currentNonce)++`]
- --
- [.contract-item]
- [[NoncesKeyed-nonces-address-uint192-]]
- ==== `[.contract-item-name]#++nonces++#++(address owner, uint192 key) โ uint256++` [.item-kind]#public#
- Returns the next unused nonce for an address and key. Result contains the key prefix.
- [.contract-item]
- [[NoncesKeyed-_useNonce-address-uint192-]]
- ==== `[.contract-item-name]#++_useNonce++#++(address owner, uint192 key) โ uint256++` [.item-kind]#internal#
- Consumes the next unused nonce for an address and key.
- Returns the current value without the key prefix. Consumed nonce is increased, so calling this function twice
- with the same arguments will return different (sequential) results.
- [.contract-item]
- [[NoncesKeyed-_useCheckedNonce-address-uint256-]]
- ==== `[.contract-item-name]#++_useCheckedNonce++#++(address owner, uint256 keyNonce)++` [.item-kind]#internal#
- Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
- This version takes the key and the nonce in a single uint256 parameter:
- - use the first 24 bytes for the key
- - use the last 8 bytes for the nonce
- [.contract-item]
- [[NoncesKeyed-_useCheckedNonce-address-uint192-uint64-]]
- ==== `[.contract-item-name]#++_useCheckedNonce++#++(address owner, uint192 key, uint64 nonce)++` [.item-kind]#internal#
- Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.
- This version takes the key and the nonce as two different parameters.
- == Introspection
- This set of interfaces and contracts deal with https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts, that is, examining which functions can be called on them. This is usually referred to as a contract's _interface_.
- Ethereum contracts have no native concept of an interface, so applications must usually simply trust they are not making an incorrect call. For trusted setups this is a non-issue, but often unknown and untrusted third-party addresses need to be interacted with. There may even not be any direct calls to them! (e.g. ERC-20 tokens may be sent to a contract that lacks a way to transfer them out of it, locking them forever). In these cases, a contract _declaring_ its interface can be very helpful in preventing errors.
- :supportsInterface: pass:normal[xref:#IERC165-supportsInterface-bytes4-[`++supportsInterface++`]]
- :supportsInterface-bytes4: pass:normal[xref:#IERC165-supportsInterface-bytes4-[`++supportsInterface++`]]
- [.contract]
- [[IERC165]]
- === `++IERC165++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/introspection/IERC165.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
- ```
- Interface of the ERC-165 standard, as defined in the
- https://eips.ethereum.org/EIPS/eip-165[ERC].
- Implementers can declare support of contract interfaces, which can then be
- queried by others ({ERC165Checker}).
- For an implementation, see {ERC165}.
- [.contract-index]
- .Functions
- --
- * {xref-IERC165-supportsInterface-bytes4-}[`++supportsInterface(interfaceId)++`]
- --
- [.contract-item]
- [[IERC165-supportsInterface-bytes4-]]
- ==== `[.contract-item-name]#++supportsInterface++#++(bytes4 interfaceId) โ bool++` [.item-kind]#external#
- Returns true if this contract implements the interface defined by
- `interfaceId`. See the corresponding
- https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
- to learn more about how these ids are created.
- This function call must use less than 30 000 gas.
- :supportsInterface: pass:normal[xref:#ERC165-supportsInterface-bytes4-[`++supportsInterface++`]]
- :supportsInterface-bytes4: pass:normal[xref:#ERC165-supportsInterface-bytes4-[`++supportsInterface++`]]
- [.contract]
- [[ERC165]]
- === `++ERC165++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/introspection/ERC165.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
- ```
- Implementation of the {IERC165} interface.
- Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
- for the additional interface id that will be supported. For example:
- ```solidity
- function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
- return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
- }
- ```
- [.contract-index]
- .Functions
- --
- * {xref-ERC165-supportsInterface-bytes4-}[`++supportsInterface(interfaceId)++`]
- [.contract-subindex-inherited]
- .IERC165
- --
- [.contract-item]
- [[ERC165-supportsInterface-bytes4-]]
- ==== `[.contract-item-name]#++supportsInterface++#++(bytes4 interfaceId) โ bool++` [.item-kind]#public#
- Returns true if this contract implements the interface defined by
- `interfaceId`. See the corresponding
- https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
- to learn more about how these ids are created.
- This function call must use less than 30 000 gas.
- :supportsERC165: pass:normal[xref:#ERC165Checker-supportsERC165-address-[`++supportsERC165++`]]
- :supportsInterface: pass:normal[xref:#ERC165Checker-supportsInterface-address-bytes4-[`++supportsInterface++`]]
- :getSupportedInterfaces: pass:normal[xref:#ERC165Checker-getSupportedInterfaces-address-bytes4---[`++getSupportedInterfaces++`]]
- :supportsAllInterfaces: pass:normal[xref:#ERC165Checker-supportsAllInterfaces-address-bytes4---[`++supportsAllInterfaces++`]]
- :supportsERC165InterfaceUnchecked: pass:normal[xref:#ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-[`++supportsERC165InterfaceUnchecked++`]]
- :supportsERC165-address: pass:normal[xref:#ERC165Checker-supportsERC165-address-[`++supportsERC165++`]]
- :supportsInterface-address-bytes4: pass:normal[xref:#ERC165Checker-supportsInterface-address-bytes4-[`++supportsInterface++`]]
- :getSupportedInterfaces-address-bytes4--: pass:normal[xref:#ERC165Checker-getSupportedInterfaces-address-bytes4---[`++getSupportedInterfaces++`]]
- :supportsAllInterfaces-address-bytes4--: pass:normal[xref:#ERC165Checker-supportsAllInterfaces-address-bytes4---[`++supportsAllInterfaces++`]]
- :supportsERC165InterfaceUnchecked-address-bytes4: pass:normal[xref:#ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-[`++supportsERC165InterfaceUnchecked++`]]
- [.contract]
- [[ERC165Checker]]
- === `++ERC165Checker++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/introspection/ERC165Checker.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
- ```
- Library used to query support of an interface declared via {IERC165}.
- Note that these functions return the actual result of the query: they do not
- `revert` if an interface is not supported. It is up to the caller to decide
- what to do in these cases.
- [.contract-index]
- .Functions
- --
- * {xref-ERC165Checker-supportsERC165-address-}[`++supportsERC165(account)++`]
- * {xref-ERC165Checker-supportsInterface-address-bytes4-}[`++supportsInterface(account, interfaceId)++`]
- * {xref-ERC165Checker-getSupportedInterfaces-address-bytes4---}[`++getSupportedInterfaces(account, interfaceIds)++`]
- * {xref-ERC165Checker-supportsAllInterfaces-address-bytes4---}[`++supportsAllInterfaces(account, interfaceIds)++`]
- * {xref-ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-}[`++supportsERC165InterfaceUnchecked(account, interfaceId)++`]
- --
- [.contract-item]
- [[ERC165Checker-supportsERC165-address-]]
- ==== `[.contract-item-name]#++supportsERC165++#++(address account) โ bool++` [.item-kind]#internal#
- Returns true if `account` supports the {IERC165} interface.
- [.contract-item]
- [[ERC165Checker-supportsInterface-address-bytes4-]]
- ==== `[.contract-item-name]#++supportsInterface++#++(address account, bytes4 interfaceId) โ bool++` [.item-kind]#internal#
- Returns true if `account` supports the interface defined by
- `interfaceId`. Support for {IERC165} itself is queried automatically.
- See {IERC165-supportsInterface}.
- [.contract-item]
- [[ERC165Checker-getSupportedInterfaces-address-bytes4---]]
- ==== `[.contract-item-name]#++getSupportedInterfaces++#++(address account, bytes4[] interfaceIds) โ bool[]++` [.item-kind]#internal#
- Returns a boolean array where each value corresponds to the
- interfaces passed in and whether they're supported or not. This allows
- you to batch check interfaces for a contract where your expectation
- is that some interfaces may not be supported.
- See {IERC165-supportsInterface}.
- [.contract-item]
- [[ERC165Checker-supportsAllInterfaces-address-bytes4---]]
- ==== `[.contract-item-name]#++supportsAllInterfaces++#++(address account, bytes4[] interfaceIds) โ bool++` [.item-kind]#internal#
- Returns true if `account` supports all the interfaces defined in
- `interfaceIds`. Support for {IERC165} itself is queried automatically.
- Batch-querying can lead to gas savings by skipping repeated checks for
- {IERC165} support.
- See {IERC165-supportsInterface}.
- [.contract-item]
- [[ERC165Checker-supportsERC165InterfaceUnchecked-address-bytes4-]]
- ==== `[.contract-item-name]#++supportsERC165InterfaceUnchecked++#++(address account, bytes4 interfaceId) โ bool++` [.item-kind]#internal#
- Assumes that account contains a contract that supports ERC-165, otherwise
- the behavior of this method is undefined. This precondition can be checked
- with {supportsERC165}.
- Some precompiled contracts will falsely indicate support for a given interface, so caution
- should be exercised when using this function.
- Interface identification is specified in ERC-165.
- == Data Structures
- :BitMap: pass:normal[xref:#BitMaps-BitMap[`++BitMap++`]]
- :get: pass:normal[xref:#BitMaps-get-struct-BitMaps-BitMap-uint256-[`++get++`]]
- :setTo: pass:normal[xref:#BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-[`++setTo++`]]
- :set: pass:normal[xref:#BitMaps-set-struct-BitMaps-BitMap-uint256-[`++set++`]]
- :unset: pass:normal[xref:#BitMaps-unset-struct-BitMaps-BitMap-uint256-[`++unset++`]]
- :get-struct-BitMaps-BitMap-uint256: pass:normal[xref:#BitMaps-get-struct-BitMaps-BitMap-uint256-[`++get++`]]
- :setTo-struct-BitMaps-BitMap-uint256-bool: pass:normal[xref:#BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-[`++setTo++`]]
- :set-struct-BitMaps-BitMap-uint256: pass:normal[xref:#BitMaps-set-struct-BitMaps-BitMap-uint256-[`++set++`]]
- :unset-struct-BitMaps-BitMap-uint256: pass:normal[xref:#BitMaps-unset-struct-BitMaps-BitMap-uint256-[`++unset++`]]
- [.contract]
- [[BitMaps]]
- === `++BitMaps++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/BitMaps.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/BitMaps.sol";
- ```
- Library for managing uint256 to bool mapping in a compact and efficient way, provided the keys are sequential.
- Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
- BitMaps pack 256 booleans across each bit of a single 256-bit slot of `uint256` type.
- Hence booleans corresponding to 256 _sequential_ indices would only consume a single slot,
- unlike the regular `bool` which would consume an entire slot for a single value.
- This results in gas savings in two ways:
- - Setting a zero value to non-zero only once every 256 times
- - Accessing the same warm slot for every 256 _sequential_ indices
- [.contract-index]
- .Functions
- --
- * {xref-BitMaps-get-struct-BitMaps-BitMap-uint256-}[`++get(bitmap, index)++`]
- * {xref-BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-}[`++setTo(bitmap, index, value)++`]
- * {xref-BitMaps-set-struct-BitMaps-BitMap-uint256-}[`++set(bitmap, index)++`]
- * {xref-BitMaps-unset-struct-BitMaps-BitMap-uint256-}[`++unset(bitmap, index)++`]
- --
- [.contract-item]
- [[BitMaps-get-struct-BitMaps-BitMap-uint256-]]
- ==== `[.contract-item-name]#++get++#++(struct BitMaps.BitMap bitmap, uint256 index) โ bool++` [.item-kind]#internal#
- Returns whether the bit at `index` is set.
- [.contract-item]
- [[BitMaps-setTo-struct-BitMaps-BitMap-uint256-bool-]]
- ==== `[.contract-item-name]#++setTo++#++(struct BitMaps.BitMap bitmap, uint256 index, bool value)++` [.item-kind]#internal#
- Sets the bit at `index` to the boolean `value`.
- [.contract-item]
- [[BitMaps-set-struct-BitMaps-BitMap-uint256-]]
- ==== `[.contract-item-name]#++set++#++(struct BitMaps.BitMap bitmap, uint256 index)++` [.item-kind]#internal#
- Sets the bit at `index`.
- [.contract-item]
- [[BitMaps-unset-struct-BitMaps-BitMap-uint256-]]
- ==== `[.contract-item-name]#++unset++#++(struct BitMaps.BitMap bitmap, uint256 index)++` [.item-kind]#internal#
- Unsets the bit at `index`.
- :EnumerableMapNonexistentKey: pass:normal[xref:#EnumerableMap-EnumerableMapNonexistentKey-bytes32-[`++EnumerableMapNonexistentKey++`]]
- :Bytes32ToBytes32Map: pass:normal[xref:#EnumerableMap-Bytes32ToBytes32Map[`++Bytes32ToBytes32Map++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-[`++keys++`]]
- :UintToUintMap: pass:normal[xref:#EnumerableMap-UintToUintMap[`++UintToUintMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToUintMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-[`++keys++`]]
- :UintToAddressMap: pass:normal[xref:#EnumerableMap-UintToAddressMap[`++UintToAddressMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-[`++keys++`]]
- :UintToBytes32Map: pass:normal[xref:#EnumerableMap-UintToBytes32Map[`++UintToBytes32Map++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-[`++keys++`]]
- :AddressToUintMap: pass:normal[xref:#EnumerableMap-AddressToUintMap[`++AddressToUintMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-[`++keys++`]]
- :AddressToAddressMap: pass:normal[xref:#EnumerableMap-AddressToAddressMap[`++AddressToAddressMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-[`++keys++`]]
- :AddressToBytes32Map: pass:normal[xref:#EnumerableMap-AddressToBytes32Map[`++AddressToBytes32Map++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-[`++keys++`]]
- :Bytes32ToUintMap: pass:normal[xref:#EnumerableMap-Bytes32ToUintMap[`++Bytes32ToUintMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-[`++keys++`]]
- :Bytes32ToAddressMap: pass:normal[xref:#EnumerableMap-Bytes32ToAddressMap[`++Bytes32ToAddressMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-[`++keys++`]]
- :EnumerableMapNonexistentBytesKey: pass:normal[xref:#EnumerableMap-EnumerableMapNonexistentBytesKey-bytes-[`++EnumerableMapNonexistentBytesKey++`]]
- :BytesToBytesMap: pass:normal[xref:#EnumerableMap-BytesToBytesMap[`++BytesToBytesMap++`]]
- :set: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-[`++set++`]]
- :remove: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-[`++length++`]]
- :at: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-[`++at++`]]
- :tryGet: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-[`++tryGet++`]]
- :get: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-[`++get++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-[`++keys++`]]
- :keys: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-[`++set++`]]
- :remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++remove++`]]
- :clear-struct-EnumerableMap-Bytes32ToBytes32Map: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-[`++clear++`]]
- :contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++contains++`]]
- :length-struct-EnumerableMap-Bytes32ToBytes32Map: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-[`++length++`]]
- :at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++tryGet++`]]
- :get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-[`++get++`]]
- :keys-struct-EnumerableMap-Bytes32ToBytes32Map: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-[`++keys++`]]
- :keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-UintToUintMap-uint256-uint256: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-[`++set++`]]
- :remove-struct-EnumerableMap-UintToUintMap-uint256: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-[`++remove++`]]
- :clear-struct-EnumerableMap-UintToUintMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-[`++clear++`]]
- :contains-struct-EnumerableMap-UintToUintMap-uint256: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-[`++contains++`]]
- :length-struct-EnumerableMap-UintToUintMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToUintMap-[`++length++`]]
- :at-struct-EnumerableMap-UintToUintMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-UintToUintMap-uint256: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-[`++tryGet++`]]
- :get-struct-EnumerableMap-UintToUintMap-uint256: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-[`++get++`]]
- :keys-struct-EnumerableMap-UintToUintMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-[`++keys++`]]
- :keys-struct-EnumerableMap-UintToUintMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-UintToAddressMap-uint256-address: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-[`++set++`]]
- :remove-struct-EnumerableMap-UintToAddressMap-uint256: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-[`++remove++`]]
- :clear-struct-EnumerableMap-UintToAddressMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-[`++clear++`]]
- :contains-struct-EnumerableMap-UintToAddressMap-uint256: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-[`++contains++`]]
- :length-struct-EnumerableMap-UintToAddressMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-[`++length++`]]
- :at-struct-EnumerableMap-UintToAddressMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-UintToAddressMap-uint256: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-[`++tryGet++`]]
- :get-struct-EnumerableMap-UintToAddressMap-uint256: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-[`++get++`]]
- :keys-struct-EnumerableMap-UintToAddressMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-[`++keys++`]]
- :keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-[`++set++`]]
- :remove-struct-EnumerableMap-UintToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-[`++remove++`]]
- :clear-struct-EnumerableMap-UintToBytes32Map: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-[`++clear++`]]
- :contains-struct-EnumerableMap-UintToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-[`++contains++`]]
- :length-struct-EnumerableMap-UintToBytes32Map: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-[`++length++`]]
- :at-struct-EnumerableMap-UintToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-UintToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-[`++tryGet++`]]
- :get-struct-EnumerableMap-UintToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-[`++get++`]]
- :keys-struct-EnumerableMap-UintToBytes32Map: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-[`++keys++`]]
- :keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-AddressToUintMap-address-uint256: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-[`++set++`]]
- :remove-struct-EnumerableMap-AddressToUintMap-address: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-[`++remove++`]]
- :clear-struct-EnumerableMap-AddressToUintMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-[`++clear++`]]
- :contains-struct-EnumerableMap-AddressToUintMap-address: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-[`++contains++`]]
- :length-struct-EnumerableMap-AddressToUintMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-[`++length++`]]
- :at-struct-EnumerableMap-AddressToUintMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-AddressToUintMap-address: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-[`++tryGet++`]]
- :get-struct-EnumerableMap-AddressToUintMap-address: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-[`++get++`]]
- :keys-struct-EnumerableMap-AddressToUintMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-[`++keys++`]]
- :keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-AddressToAddressMap-address-address: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-[`++set++`]]
- :remove-struct-EnumerableMap-AddressToAddressMap-address: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-[`++remove++`]]
- :clear-struct-EnumerableMap-AddressToAddressMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-[`++clear++`]]
- :contains-struct-EnumerableMap-AddressToAddressMap-address: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-[`++contains++`]]
- :length-struct-EnumerableMap-AddressToAddressMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-[`++length++`]]
- :at-struct-EnumerableMap-AddressToAddressMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-AddressToAddressMap-address: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-[`++tryGet++`]]
- :get-struct-EnumerableMap-AddressToAddressMap-address: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-[`++get++`]]
- :keys-struct-EnumerableMap-AddressToAddressMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-[`++keys++`]]
- :keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-[`++set++`]]
- :remove-struct-EnumerableMap-AddressToBytes32Map-address: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-[`++remove++`]]
- :clear-struct-EnumerableMap-AddressToBytes32Map: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-[`++clear++`]]
- :contains-struct-EnumerableMap-AddressToBytes32Map-address: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-[`++contains++`]]
- :length-struct-EnumerableMap-AddressToBytes32Map: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-[`++length++`]]
- :at-struct-EnumerableMap-AddressToBytes32Map-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-AddressToBytes32Map-address: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-[`++tryGet++`]]
- :get-struct-EnumerableMap-AddressToBytes32Map-address: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-[`++get++`]]
- :keys-struct-EnumerableMap-AddressToBytes32Map: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-[`++keys++`]]
- :keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-[`++set++`]]
- :remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++remove++`]]
- :clear-struct-EnumerableMap-Bytes32ToUintMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-[`++clear++`]]
- :contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++contains++`]]
- :length-struct-EnumerableMap-Bytes32ToUintMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-[`++length++`]]
- :at-struct-EnumerableMap-Bytes32ToUintMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++tryGet++`]]
- :get-struct-EnumerableMap-Bytes32ToUintMap-bytes32: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-[`++get++`]]
- :keys-struct-EnumerableMap-Bytes32ToUintMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-[`++keys++`]]
- :keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-[`++set++`]]
- :remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++remove++`]]
- :clear-struct-EnumerableMap-Bytes32ToAddressMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-[`++clear++`]]
- :contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++contains++`]]
- :length-struct-EnumerableMap-Bytes32ToAddressMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-[`++length++`]]
- :at-struct-EnumerableMap-Bytes32ToAddressMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++tryGet++`]]
- :get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-[`++get++`]]
- :keys-struct-EnumerableMap-Bytes32ToAddressMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-[`++keys++`]]
- :keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-[`++keys++`]]
- :set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes: pass:normal[xref:#EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-[`++set++`]]
- :remove-struct-EnumerableMap-BytesToBytesMap-bytes: pass:normal[xref:#EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-[`++remove++`]]
- :clear-struct-EnumerableMap-BytesToBytesMap: pass:normal[xref:#EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-[`++clear++`]]
- :contains-struct-EnumerableMap-BytesToBytesMap-bytes: pass:normal[xref:#EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-[`++contains++`]]
- :length-struct-EnumerableMap-BytesToBytesMap: pass:normal[xref:#EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-[`++length++`]]
- :at-struct-EnumerableMap-BytesToBytesMap-uint256: pass:normal[xref:#EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-[`++at++`]]
- :tryGet-struct-EnumerableMap-BytesToBytesMap-bytes: pass:normal[xref:#EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-[`++tryGet++`]]
- :get-struct-EnumerableMap-BytesToBytesMap-bytes: pass:normal[xref:#EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-[`++get++`]]
- :keys-struct-EnumerableMap-BytesToBytesMap: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-[`++keys++`]]
- :keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256: pass:normal[xref:#EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-[`++keys++`]]
- [.contract]
- [[EnumerableMap]]
- === `++EnumerableMap++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/EnumerableMap.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";
- ```
- Library for managing an enumerable variant of Solidity's
- https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
- type.
- Maps have the following properties:
- - Entries are added, removed, and checked for existence in constant time
- (O(1)).
- - Entries are enumerated in O(n). No guarantees are made on the ordering.
- - Map can be cleared (all entries removed) in O(n).
- ```solidity
- contract Example {
- // Add the library methods
- using EnumerableMap for EnumerableMap.UintToAddressMap;
- // Declare a set state variable
- EnumerableMap.UintToAddressMap private myMap;
- }
- ```
- The following map types are supported:
- - `uint256 -> address` (`UintToAddressMap`) since v3.0.0
- - `address -> uint256` (`AddressToUintMap`) since v4.6.0
- - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0
- - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0
- - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0
- - `uint256 -> bytes32` (`UintToBytes32Map`) since v5.1.0
- - `address -> address` (`AddressToAddressMap`) since v5.1.0
- - `address -> bytes32` (`AddressToBytes32Map`) since v5.1.0
- - `bytes32 -> address` (`Bytes32ToAddressMap`) since v5.1.0
- - `bytes -> bytes` (`BytesToBytesMap`) since v5.4.0
- [WARNING]
- ====
- Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
- unusable.
- See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
- In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an
- array of EnumerableMap.
- ====
- [.contract-index]
- .Functions
- --
- * {xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-UintToUintMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-}[`++keys(map, start, end)++`]
- * {xref-EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-}[`++set(map, key, value)++`]
- * {xref-EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-}[`++remove(map, key)++`]
- * {xref-EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-}[`++clear(map)++`]
- * {xref-EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-}[`++contains(map, key)++`]
- * {xref-EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-}[`++length(map)++`]
- * {xref-EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-}[`++at(map, index)++`]
- * {xref-EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-}[`++tryGet(map, key)++`]
- * {xref-EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-}[`++get(map, key)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-}[`++keys(map)++`]
- * {xref-EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-}[`++keys(map, start, end)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-EnumerableMap-EnumerableMapNonexistentKey-bytes32-}[`++EnumerableMapNonexistentKey(key)++`]
- * {xref-EnumerableMap-EnumerableMapNonexistentBytesKey-bytes-}[`++EnumerableMapNonexistentBytesKey(key)++`]
- --
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.Bytes32ToBytes32Map map, bytes32 key, bytes32 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.Bytes32ToBytes32Map map, bytes32 key) โ bool++` [.item-kind]#internal#
- Removes a key-value pair from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-Bytes32ToBytes32Map-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.Bytes32ToBytes32Map map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the map grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.Bytes32ToBytes32Map map, bytes32 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-Bytes32ToBytes32Map-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.Bytes32ToBytes32Map map) โ uint256++` [.item-kind]#internal#
- Returns the number of key-value pairs in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.Bytes32ToBytes32Map map, uint256 index) โ bytes32 key, bytes32 value++` [.item-kind]#internal#
- Returns the key-value pair stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of entries inside the
- array, and it may change when more entries are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.Bytes32ToBytes32Map map, bytes32 key) โ bool exists, bytes32 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-Bytes32ToBytes32Map-bytes32-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.Bytes32ToBytes32Map map, bytes32 key) โ bytes32++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToBytes32Map map) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToBytes32Map-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToBytes32Map map, uint256 start, uint256 end) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-UintToUintMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.UintToUintMap map, uint256 key, uint256 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-UintToUintMap-uint256-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.UintToUintMap map, uint256 key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-UintToUintMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.UintToUintMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-UintToUintMap-uint256-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.UintToUintMap map, uint256 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-UintToUintMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.UintToUintMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-UintToUintMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.UintToUintMap map, uint256 index) โ uint256 key, uint256 value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-UintToUintMap-uint256-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.UintToUintMap map, uint256 key) โ bool exists, uint256 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-UintToUintMap-uint256-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.UintToUintMap map, uint256 key) โ uint256++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToUintMap map) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToUintMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToUintMap map, uint256 start, uint256 end) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-UintToAddressMap-uint256-address-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.UintToAddressMap map, uint256 key, address value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-UintToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.UintToAddressMap map, uint256 key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-UintToAddressMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.UintToAddressMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-UintToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.UintToAddressMap map, uint256 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-UintToAddressMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.UintToAddressMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-UintToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.UintToAddressMap map, uint256 index) โ uint256 key, address value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-UintToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.UintToAddressMap map, uint256 key) โ bool exists, address value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-UintToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.UintToAddressMap map, uint256 key) โ address++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToAddressMap map) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToAddressMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToAddressMap map, uint256 start, uint256 end) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-UintToBytes32Map-uint256-bytes32-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.UintToBytes32Map map, uint256 key, bytes32 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-UintToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.UintToBytes32Map map, uint256 key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-UintToBytes32Map-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.UintToBytes32Map map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-UintToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.UintToBytes32Map map, uint256 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-UintToBytes32Map-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.UintToBytes32Map map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-UintToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.UintToBytes32Map map, uint256 index) โ uint256 key, bytes32 value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-UintToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.UintToBytes32Map map, uint256 key) โ bool exists, bytes32 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-UintToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.UintToBytes32Map map, uint256 key) โ bytes32++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToBytes32Map map) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-UintToBytes32Map-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.UintToBytes32Map map, uint256 start, uint256 end) โ uint256[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-AddressToUintMap-address-uint256-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.AddressToUintMap map, address key, uint256 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-AddressToUintMap-address-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.AddressToUintMap map, address key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-AddressToUintMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.AddressToUintMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-AddressToUintMap-address-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.AddressToUintMap map, address key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-AddressToUintMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.AddressToUintMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-AddressToUintMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.AddressToUintMap map, uint256 index) โ address key, uint256 value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-AddressToUintMap-address-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.AddressToUintMap map, address key) โ bool exists, uint256 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-AddressToUintMap-address-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.AddressToUintMap map, address key) โ uint256++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToUintMap map) โ address[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToUintMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToUintMap map, uint256 start, uint256 end) โ address[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-AddressToAddressMap-address-address-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.AddressToAddressMap map, address key, address value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-AddressToAddressMap-address-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.AddressToAddressMap map, address key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-AddressToAddressMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.AddressToAddressMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-AddressToAddressMap-address-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.AddressToAddressMap map, address key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-AddressToAddressMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.AddressToAddressMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-AddressToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.AddressToAddressMap map, uint256 index) โ address key, address value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-AddressToAddressMap-address-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.AddressToAddressMap map, address key) โ bool exists, address value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-AddressToAddressMap-address-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.AddressToAddressMap map, address key) โ address++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToAddressMap map) โ address[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToAddressMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToAddressMap map, uint256 start, uint256 end) โ address[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-AddressToBytes32Map-address-bytes32-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.AddressToBytes32Map map, address key, bytes32 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-AddressToBytes32Map-address-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.AddressToBytes32Map map, address key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-AddressToBytes32Map-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.AddressToBytes32Map map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-AddressToBytes32Map-address-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.AddressToBytes32Map map, address key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-AddressToBytes32Map-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.AddressToBytes32Map map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-AddressToBytes32Map-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.AddressToBytes32Map map, uint256 index) โ address key, bytes32 value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-AddressToBytes32Map-address-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.AddressToBytes32Map map, address key) โ bool exists, bytes32 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-AddressToBytes32Map-address-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.AddressToBytes32Map map, address key) โ bytes32++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToBytes32Map map) โ address[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-AddressToBytes32Map-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.AddressToBytes32Map map, uint256 start, uint256 end) โ address[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-Bytes32ToUintMap-bytes32-uint256-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.Bytes32ToUintMap map, bytes32 key, uint256 value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-Bytes32ToUintMap-bytes32-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.Bytes32ToUintMap map, bytes32 key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-Bytes32ToUintMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.Bytes32ToUintMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-Bytes32ToUintMap-bytes32-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.Bytes32ToUintMap map, bytes32 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-Bytes32ToUintMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.Bytes32ToUintMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-Bytes32ToUintMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.Bytes32ToUintMap map, uint256 index) โ bytes32 key, uint256 value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToUintMap-bytes32-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.Bytes32ToUintMap map, bytes32 key) โ bool exists, uint256 value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-Bytes32ToUintMap-bytes32-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.Bytes32ToUintMap map, bytes32 key) โ uint256++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToUintMap map) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToUintMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToUintMap map, uint256 start, uint256 end) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-address-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.Bytes32ToAddressMap map, bytes32 key, address value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.Bytes32ToAddressMap map, bytes32 key) โ bool++` [.item-kind]#internal#
- Removes a value from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-Bytes32ToAddressMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.Bytes32ToAddressMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: This function has an unbounded cost that scales with map size. Developers should keep in mind that
- using it may render the function uncallable if the map grows to the point where clearing it consumes too much
- gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.Bytes32ToAddressMap map, bytes32 key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-Bytes32ToAddressMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.Bytes32ToAddressMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-Bytes32ToAddressMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.Bytes32ToAddressMap map, uint256 index) โ bytes32 key, address value++` [.item-kind]#internal#
- Returns the element stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.Bytes32ToAddressMap map, bytes32 key) โ bool exists, address value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-Bytes32ToAddressMap-bytes32-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.Bytes32ToAddressMap map, bytes32 key) โ address++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToAddressMap map) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-Bytes32ToAddressMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.Bytes32ToAddressMap map, uint256 start, uint256 end) โ bytes32[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-set-struct-EnumerableMap-BytesToBytesMap-bytes-bytes-]]
- ==== `[.contract-item-name]#++set++#++(struct EnumerableMap.BytesToBytesMap map, bytes key, bytes value) โ bool++` [.item-kind]#internal#
- Adds a key-value pair to a map, or updates the value for an existing
- key. O(1).
- Returns true if the key was added to the map, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableMap-remove-struct-EnumerableMap-BytesToBytesMap-bytes-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableMap.BytesToBytesMap map, bytes key) โ bool++` [.item-kind]#internal#
- Removes a key-value pair from a map. O(1).
- Returns true if the key was removed from the map, that is if it was present.
- [.contract-item]
- [[EnumerableMap-clear-struct-EnumerableMap-BytesToBytesMap-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableMap.BytesToBytesMap map)++` [.item-kind]#internal#
- Removes all the entries from a map. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the map grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-contains-struct-EnumerableMap-BytesToBytesMap-bytes-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableMap.BytesToBytesMap map, bytes key) โ bool++` [.item-kind]#internal#
- Returns true if the key is in the map. O(1).
- [.contract-item]
- [[EnumerableMap-length-struct-EnumerableMap-BytesToBytesMap-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableMap.BytesToBytesMap map) โ uint256++` [.item-kind]#internal#
- Returns the number of key-value pairs in the map. O(1).
- [.contract-item]
- [[EnumerableMap-at-struct-EnumerableMap-BytesToBytesMap-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableMap.BytesToBytesMap map, uint256 index) โ bytes key, bytes value++` [.item-kind]#internal#
- Returns the key-value pair stored at position `index` in the map. O(1).
- Note that there are no guarantees on the ordering of entries inside the
- array, and it may change when more entries are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableMap-tryGet-struct-EnumerableMap-BytesToBytesMap-bytes-]]
- ==== `[.contract-item-name]#++tryGet++#++(struct EnumerableMap.BytesToBytesMap map, bytes key) โ bool exists, bytes value++` [.item-kind]#internal#
- Tries to return the value associated with `key`. O(1).
- Does not revert if `key` is not in the map.
- [.contract-item]
- [[EnumerableMap-get-struct-EnumerableMap-BytesToBytesMap-bytes-]]
- ==== `[.contract-item-name]#++get++#++(struct EnumerableMap.BytesToBytesMap map, bytes key) โ bytes value++` [.item-kind]#internal#
- Returns the value associated with `key`. O(1).
- Requirements:
- - `key` must be in the map.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.BytesToBytesMap map) โ bytes[]++` [.item-kind]#internal#
- Returns an array containing all the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-keys-struct-EnumerableMap-BytesToBytesMap-uint256-uint256-]]
- ==== `[.contract-item-name]#++keys++#++(struct EnumerableMap.BytesToBytesMap map, uint256 start, uint256 end) โ bytes[]++` [.item-kind]#internal#
- Returns an array containing a slice of the keys
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableMap-EnumerableMapNonexistentKey-bytes32-]]
- ==== `[.contract-item-name]#++EnumerableMapNonexistentKey++#++(bytes32 key)++` [.item-kind]#error#
- Query for a nonexistent map key.
- [.contract-item]
- [[EnumerableMap-EnumerableMapNonexistentBytesKey-bytes-]]
- ==== `[.contract-item-name]#++EnumerableMapNonexistentBytesKey++#++(bytes key)++` [.item-kind]#error#
- Query for a nonexistent map key.
- :Set: pass:normal[xref:#EnumerableSet-Set[`++Set++`]]
- :Bytes32Set: pass:normal[xref:#EnumerableSet-Bytes32Set[`++Bytes32Set++`]]
- :add: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-[`++add++`]]
- :remove: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-Bytes32Set-[`++length++`]]
- :at: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-[`++at++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-[`++values++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-[`++values++`]]
- :AddressSet: pass:normal[xref:#EnumerableSet-AddressSet[`++AddressSet++`]]
- :add: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-AddressSet-address-[`++add++`]]
- :remove: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-AddressSet-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-AddressSet-[`++length++`]]
- :at: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-[`++at++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-AddressSet-[`++values++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-[`++values++`]]
- :UintSet: pass:normal[xref:#EnumerableSet-UintSet[`++UintSet++`]]
- :add: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-[`++add++`]]
- :remove: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-UintSet-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-UintSet-[`++length++`]]
- :at: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-[`++at++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-UintSet-[`++values++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-[`++values++`]]
- :StringSet: pass:normal[xref:#EnumerableSet-StringSet[`++StringSet++`]]
- :add: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-StringSet-string-[`++add++`]]
- :remove: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-StringSet-string-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-StringSet-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-StringSet-string-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-StringSet-[`++length++`]]
- :at: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-[`++at++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-StringSet-[`++values++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-[`++values++`]]
- :BytesSet: pass:normal[xref:#EnumerableSet-BytesSet[`++BytesSet++`]]
- :add: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-[`++add++`]]
- :remove: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-[`++remove++`]]
- :clear: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-BytesSet-[`++clear++`]]
- :contains: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-[`++contains++`]]
- :length: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-BytesSet-[`++length++`]]
- :at: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-[`++at++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-BytesSet-[`++values++`]]
- :values: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-[`++values++`]]
- :add-struct-EnumerableSet-Bytes32Set-bytes32: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-[`++add++`]]
- :remove-struct-EnumerableSet-Bytes32Set-bytes32: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-[`++remove++`]]
- :clear-struct-EnumerableSet-Bytes32Set: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-[`++clear++`]]
- :contains-struct-EnumerableSet-Bytes32Set-bytes32: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-[`++contains++`]]
- :length-struct-EnumerableSet-Bytes32Set: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-Bytes32Set-[`++length++`]]
- :at-struct-EnumerableSet-Bytes32Set-uint256: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-[`++at++`]]
- :values-struct-EnumerableSet-Bytes32Set: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-[`++values++`]]
- :values-struct-EnumerableSet-Bytes32Set-uint256-uint256: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-[`++values++`]]
- :add-struct-EnumerableSet-AddressSet-address: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-AddressSet-address-[`++add++`]]
- :remove-struct-EnumerableSet-AddressSet-address: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-[`++remove++`]]
- :clear-struct-EnumerableSet-AddressSet: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-AddressSet-[`++clear++`]]
- :contains-struct-EnumerableSet-AddressSet-address: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-[`++contains++`]]
- :length-struct-EnumerableSet-AddressSet: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-AddressSet-[`++length++`]]
- :at-struct-EnumerableSet-AddressSet-uint256: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-[`++at++`]]
- :values-struct-EnumerableSet-AddressSet: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-AddressSet-[`++values++`]]
- :values-struct-EnumerableSet-AddressSet-uint256-uint256: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-[`++values++`]]
- :add-struct-EnumerableSet-UintSet-uint256: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-[`++add++`]]
- :remove-struct-EnumerableSet-UintSet-uint256: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-[`++remove++`]]
- :clear-struct-EnumerableSet-UintSet: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-UintSet-[`++clear++`]]
- :contains-struct-EnumerableSet-UintSet-uint256: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-[`++contains++`]]
- :length-struct-EnumerableSet-UintSet: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-UintSet-[`++length++`]]
- :at-struct-EnumerableSet-UintSet-uint256: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-[`++at++`]]
- :values-struct-EnumerableSet-UintSet: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-UintSet-[`++values++`]]
- :values-struct-EnumerableSet-UintSet-uint256-uint256: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-[`++values++`]]
- :add-struct-EnumerableSet-StringSet-string: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-StringSet-string-[`++add++`]]
- :remove-struct-EnumerableSet-StringSet-string: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-StringSet-string-[`++remove++`]]
- :clear-struct-EnumerableSet-StringSet: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-StringSet-[`++clear++`]]
- :contains-struct-EnumerableSet-StringSet-string: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-StringSet-string-[`++contains++`]]
- :length-struct-EnumerableSet-StringSet: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-StringSet-[`++length++`]]
- :at-struct-EnumerableSet-StringSet-uint256: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-[`++at++`]]
- :values-struct-EnumerableSet-StringSet: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-StringSet-[`++values++`]]
- :values-struct-EnumerableSet-StringSet-uint256-uint256: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-[`++values++`]]
- :add-struct-EnumerableSet-BytesSet-bytes: pass:normal[xref:#EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-[`++add++`]]
- :remove-struct-EnumerableSet-BytesSet-bytes: pass:normal[xref:#EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-[`++remove++`]]
- :clear-struct-EnumerableSet-BytesSet: pass:normal[xref:#EnumerableSet-clear-struct-EnumerableSet-BytesSet-[`++clear++`]]
- :contains-struct-EnumerableSet-BytesSet-bytes: pass:normal[xref:#EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-[`++contains++`]]
- :length-struct-EnumerableSet-BytesSet: pass:normal[xref:#EnumerableSet-length-struct-EnumerableSet-BytesSet-[`++length++`]]
- :at-struct-EnumerableSet-BytesSet-uint256: pass:normal[xref:#EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-[`++at++`]]
- :values-struct-EnumerableSet-BytesSet: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-BytesSet-[`++values++`]]
- :values-struct-EnumerableSet-BytesSet-uint256-uint256: pass:normal[xref:#EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-[`++values++`]]
- [.contract]
- [[EnumerableSet]]
- === `++EnumerableSet++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/EnumerableSet.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
- ```
- Library for managing
- https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
- types.
- Sets have the following properties:
- - Elements are added, removed, and checked for existence in constant time
- (O(1)).
- - Elements are enumerated in O(n). No guarantees are made on the ordering.
- - Set can be cleared (all elements removed) in O(n).
- ```solidity
- contract Example {
- // Add the library methods
- using EnumerableSet for EnumerableSet.AddressSet;
- // Declare a set state variable
- EnumerableSet.AddressSet private mySet;
- }
- ```
- The following types are supported:
- - `bytes32` (`Bytes32Set`) since v3.3.0
- - `address` (`AddressSet`) since v3.3.0
- - `uint256` (`UintSet`) since v3.3.0
- - `string` (`StringSet`) since v5.4.0
- - `bytes` (`BytesSet`) since v5.4.0
- [WARNING]
- ====
- Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
- unusable.
- See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
- In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
- array of EnumerableSet.
- ====
- [.contract-index]
- .Functions
- --
- * {xref-EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-}[`++add(set, value)++`]
- * {xref-EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-}[`++remove(set, value)++`]
- * {xref-EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-}[`++clear(set)++`]
- * {xref-EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-}[`++contains(set, value)++`]
- * {xref-EnumerableSet-length-struct-EnumerableSet-Bytes32Set-}[`++length(set)++`]
- * {xref-EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-}[`++at(set, index)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-Bytes32Set-}[`++values(set)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-}[`++values(set, start, end)++`]
- * {xref-EnumerableSet-add-struct-EnumerableSet-AddressSet-address-}[`++add(set, value)++`]
- * {xref-EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-}[`++remove(set, value)++`]
- * {xref-EnumerableSet-clear-struct-EnumerableSet-AddressSet-}[`++clear(set)++`]
- * {xref-EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-}[`++contains(set, value)++`]
- * {xref-EnumerableSet-length-struct-EnumerableSet-AddressSet-}[`++length(set)++`]
- * {xref-EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-}[`++at(set, index)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-AddressSet-}[`++values(set)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-}[`++values(set, start, end)++`]
- * {xref-EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-}[`++add(set, value)++`]
- * {xref-EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-}[`++remove(set, value)++`]
- * {xref-EnumerableSet-clear-struct-EnumerableSet-UintSet-}[`++clear(set)++`]
- * {xref-EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-}[`++contains(set, value)++`]
- * {xref-EnumerableSet-length-struct-EnumerableSet-UintSet-}[`++length(set)++`]
- * {xref-EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-}[`++at(set, index)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-UintSet-}[`++values(set)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-}[`++values(set, start, end)++`]
- * {xref-EnumerableSet-add-struct-EnumerableSet-StringSet-string-}[`++add(set, value)++`]
- * {xref-EnumerableSet-remove-struct-EnumerableSet-StringSet-string-}[`++remove(set, value)++`]
- * {xref-EnumerableSet-clear-struct-EnumerableSet-StringSet-}[`++clear(set)++`]
- * {xref-EnumerableSet-contains-struct-EnumerableSet-StringSet-string-}[`++contains(set, value)++`]
- * {xref-EnumerableSet-length-struct-EnumerableSet-StringSet-}[`++length(set)++`]
- * {xref-EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-}[`++at(set, index)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-StringSet-}[`++values(set)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-}[`++values(set, start, end)++`]
- * {xref-EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-}[`++add(set, value)++`]
- * {xref-EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-}[`++remove(set, value)++`]
- * {xref-EnumerableSet-clear-struct-EnumerableSet-BytesSet-}[`++clear(set)++`]
- * {xref-EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-}[`++contains(set, value)++`]
- * {xref-EnumerableSet-length-struct-EnumerableSet-BytesSet-}[`++length(set)++`]
- * {xref-EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-}[`++at(set, index)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-BytesSet-}[`++values(set)++`]
- * {xref-EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-}[`++values(set, start, end)++`]
- --
- [.contract-item]
- [[EnumerableSet-add-struct-EnumerableSet-Bytes32Set-bytes32-]]
- ==== `[.contract-item-name]#++add++#++(struct EnumerableSet.Bytes32Set set, bytes32 value) โ bool++` [.item-kind]#internal#
- Add a value to a set. O(1).
- Returns true if the value was added to the set, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableSet-remove-struct-EnumerableSet-Bytes32Set-bytes32-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableSet.Bytes32Set set, bytes32 value) โ bool++` [.item-kind]#internal#
- Removes a value from a set. O(1).
- Returns true if the value was removed from the set, that is if it was
- present.
- [.contract-item]
- [[EnumerableSet-clear-struct-EnumerableSet-Bytes32Set-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableSet.Bytes32Set set)++` [.item-kind]#internal#
- Removes all the values from a set. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-contains-struct-EnumerableSet-Bytes32Set-bytes32-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableSet.Bytes32Set set, bytes32 value) โ bool++` [.item-kind]#internal#
- Returns true if the value is in the set. O(1).
- [.contract-item]
- [[EnumerableSet-length-struct-EnumerableSet-Bytes32Set-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableSet.Bytes32Set set) โ uint256++` [.item-kind]#internal#
- Returns the number of values in the set. O(1).
- [.contract-item]
- [[EnumerableSet-at-struct-EnumerableSet-Bytes32Set-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableSet.Bytes32Set set, uint256 index) โ bytes32++` [.item-kind]#internal#
- Returns the value stored at position `index` in the set. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-Bytes32Set-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.Bytes32Set set) โ bytes32[]++` [.item-kind]#internal#
- Return the entire set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-Bytes32Set-uint256-uint256-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.Bytes32Set set, uint256 start, uint256 end) โ bytes32[]++` [.item-kind]#internal#
- Return a slice of the set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-add-struct-EnumerableSet-AddressSet-address-]]
- ==== `[.contract-item-name]#++add++#++(struct EnumerableSet.AddressSet set, address value) โ bool++` [.item-kind]#internal#
- Add a value to a set. O(1).
- Returns true if the value was added to the set, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableSet.AddressSet set, address value) โ bool++` [.item-kind]#internal#
- Removes a value from a set. O(1).
- Returns true if the value was removed from the set, that is if it was
- present.
- [.contract-item]
- [[EnumerableSet-clear-struct-EnumerableSet-AddressSet-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableSet.AddressSet set)++` [.item-kind]#internal#
- Removes all the values from a set. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableSet.AddressSet set, address value) โ bool++` [.item-kind]#internal#
- Returns true if the value is in the set. O(1).
- [.contract-item]
- [[EnumerableSet-length-struct-EnumerableSet-AddressSet-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableSet.AddressSet set) โ uint256++` [.item-kind]#internal#
- Returns the number of values in the set. O(1).
- [.contract-item]
- [[EnumerableSet-at-struct-EnumerableSet-AddressSet-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableSet.AddressSet set, uint256 index) โ address++` [.item-kind]#internal#
- Returns the value stored at position `index` in the set. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-AddressSet-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.AddressSet set) โ address[]++` [.item-kind]#internal#
- Return the entire set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-AddressSet-uint256-uint256-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.AddressSet set, uint256 start, uint256 end) โ address[]++` [.item-kind]#internal#
- Return a slice of the set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-add-struct-EnumerableSet-UintSet-uint256-]]
- ==== `[.contract-item-name]#++add++#++(struct EnumerableSet.UintSet set, uint256 value) โ bool++` [.item-kind]#internal#
- Add a value to a set. O(1).
- Returns true if the value was added to the set, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableSet-remove-struct-EnumerableSet-UintSet-uint256-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableSet.UintSet set, uint256 value) โ bool++` [.item-kind]#internal#
- Removes a value from a set. O(1).
- Returns true if the value was removed from the set, that is if it was
- present.
- [.contract-item]
- [[EnumerableSet-clear-struct-EnumerableSet-UintSet-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableSet.UintSet set)++` [.item-kind]#internal#
- Removes all the values from a set. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-contains-struct-EnumerableSet-UintSet-uint256-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableSet.UintSet set, uint256 value) โ bool++` [.item-kind]#internal#
- Returns true if the value is in the set. O(1).
- [.contract-item]
- [[EnumerableSet-length-struct-EnumerableSet-UintSet-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableSet.UintSet set) โ uint256++` [.item-kind]#internal#
- Returns the number of values in the set. O(1).
- [.contract-item]
- [[EnumerableSet-at-struct-EnumerableSet-UintSet-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableSet.UintSet set, uint256 index) โ uint256++` [.item-kind]#internal#
- Returns the value stored at position `index` in the set. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-UintSet-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.UintSet set) โ uint256[]++` [.item-kind]#internal#
- Return the entire set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-UintSet-uint256-uint256-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.UintSet set, uint256 start, uint256 end) โ uint256[]++` [.item-kind]#internal#
- Return a slice of the set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-add-struct-EnumerableSet-StringSet-string-]]
- ==== `[.contract-item-name]#++add++#++(struct EnumerableSet.StringSet set, string value) โ bool++` [.item-kind]#internal#
- Add a value to a set. O(1).
- Returns true if the value was added to the set, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableSet-remove-struct-EnumerableSet-StringSet-string-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableSet.StringSet set, string value) โ bool++` [.item-kind]#internal#
- Removes a value from a set. O(1).
- Returns true if the value was removed from the set, that is if it was
- present.
- [.contract-item]
- [[EnumerableSet-clear-struct-EnumerableSet-StringSet-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableSet.StringSet set)++` [.item-kind]#internal#
- Removes all the values from a set. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-contains-struct-EnumerableSet-StringSet-string-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableSet.StringSet set, string value) โ bool++` [.item-kind]#internal#
- Returns true if the value is in the set. O(1).
- [.contract-item]
- [[EnumerableSet-length-struct-EnumerableSet-StringSet-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableSet.StringSet set) โ uint256++` [.item-kind]#internal#
- Returns the number of values on the set. O(1).
- [.contract-item]
- [[EnumerableSet-at-struct-EnumerableSet-StringSet-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableSet.StringSet set, uint256 index) โ string++` [.item-kind]#internal#
- Returns the value stored at position `index` in the set. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-StringSet-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.StringSet set) โ string[]++` [.item-kind]#internal#
- Return the entire set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-StringSet-uint256-uint256-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.StringSet set, uint256 start, uint256 end) โ string[]++` [.item-kind]#internal#
- Return a slice of the set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-add-struct-EnumerableSet-BytesSet-bytes-]]
- ==== `[.contract-item-name]#++add++#++(struct EnumerableSet.BytesSet set, bytes value) โ bool++` [.item-kind]#internal#
- Add a value to a set. O(1).
- Returns true if the value was added to the set, that is if it was not
- already present.
- [.contract-item]
- [[EnumerableSet-remove-struct-EnumerableSet-BytesSet-bytes-]]
- ==== `[.contract-item-name]#++remove++#++(struct EnumerableSet.BytesSet set, bytes value) โ bool++` [.item-kind]#internal#
- Removes a value from a set. O(1).
- Returns true if the value was removed from the set, that is if it was
- present.
- [.contract-item]
- [[EnumerableSet-clear-struct-EnumerableSet-BytesSet-]]
- ==== `[.contract-item-name]#++clear++#++(struct EnumerableSet.BytesSet set)++` [.item-kind]#internal#
- Removes all the values from a set. O(n).
- WARNING: Developers should keep in mind that this function has an unbounded cost and using it may render the
- function uncallable if the set grows to the point where clearing it consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-contains-struct-EnumerableSet-BytesSet-bytes-]]
- ==== `[.contract-item-name]#++contains++#++(struct EnumerableSet.BytesSet set, bytes value) โ bool++` [.item-kind]#internal#
- Returns true if the value is in the set. O(1).
- [.contract-item]
- [[EnumerableSet-length-struct-EnumerableSet-BytesSet-]]
- ==== `[.contract-item-name]#++length++#++(struct EnumerableSet.BytesSet set) โ uint256++` [.item-kind]#internal#
- Returns the number of values on the set. O(1).
- [.contract-item]
- [[EnumerableSet-at-struct-EnumerableSet-BytesSet-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct EnumerableSet.BytesSet set, uint256 index) โ bytes++` [.item-kind]#internal#
- Returns the value stored at position `index` in the set. O(1).
- Note that there are no guarantees on the ordering of values inside the
- array, and it may change when more values are added or removed.
- Requirements:
- - `index` must be strictly less than {length}.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-BytesSet-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.BytesSet set) โ bytes[]++` [.item-kind]#internal#
- Return the entire set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- [.contract-item]
- [[EnumerableSet-values-struct-EnumerableSet-BytesSet-uint256-uint256-]]
- ==== `[.contract-item-name]#++values++#++(struct EnumerableSet.BytesSet set, uint256 start, uint256 end) โ bytes[]++` [.item-kind]#internal#
- Return a slice of the set in an array
- WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
- to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
- this function has an unbounded cost, and using it as part of a state-changing function may render the function
- uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
- :Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-Bytes32Deque[`++Bytes32Deque++`]]
- :pushBack: pass:normal[xref:#DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-[`++pushBack++`]]
- :popBack: pass:normal[xref:#DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-[`++popBack++`]]
- :pushFront: pass:normal[xref:#DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-[`++pushFront++`]]
- :popFront: pass:normal[xref:#DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-[`++popFront++`]]
- :front: pass:normal[xref:#DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-[`++front++`]]
- :back: pass:normal[xref:#DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-[`++back++`]]
- :at: pass:normal[xref:#DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-[`++at++`]]
- :clear: pass:normal[xref:#DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-[`++clear++`]]
- :length: pass:normal[xref:#DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-[`++length++`]]
- :empty: pass:normal[xref:#DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-[`++empty++`]]
- :pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32: pass:normal[xref:#DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-[`++pushBack++`]]
- :popBack-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-[`++popBack++`]]
- :pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32: pass:normal[xref:#DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-[`++pushFront++`]]
- :popFront-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-[`++popFront++`]]
- :front-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-[`++front++`]]
- :back-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-[`++back++`]]
- :at-struct-DoubleEndedQueue-Bytes32Deque-uint256: pass:normal[xref:#DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-[`++at++`]]
- :clear-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-[`++clear++`]]
- :length-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-[`++length++`]]
- :empty-struct-DoubleEndedQueue-Bytes32Deque: pass:normal[xref:#DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-[`++empty++`]]
- [.contract]
- [[DoubleEndedQueue]]
- === `++DoubleEndedQueue++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/DoubleEndedQueue.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol";
- ```
- A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of
- the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and
- FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that
- the existing queue contents are left in storage.
- The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be
- used in storage, and not in memory.
- ```solidity
- DoubleEndedQueue.Bytes32Deque queue;
- ```
- [.contract-index]
- .Functions
- --
- * {xref-DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-}[`++pushBack(deque, value)++`]
- * {xref-DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-}[`++popBack(deque)++`]
- * {xref-DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-}[`++pushFront(deque, value)++`]
- * {xref-DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-}[`++popFront(deque)++`]
- * {xref-DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-}[`++front(deque)++`]
- * {xref-DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-}[`++back(deque)++`]
- * {xref-DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-}[`++at(deque, index)++`]
- * {xref-DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-}[`++clear(deque)++`]
- * {xref-DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-}[`++length(deque)++`]
- * {xref-DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-}[`++empty(deque)++`]
- --
- [.contract-item]
- [[DoubleEndedQueue-pushBack-struct-DoubleEndedQueue-Bytes32Deque-bytes32-]]
- ==== `[.contract-item-name]#++pushBack++#++(struct DoubleEndedQueue.Bytes32Deque deque, bytes32 value)++` [.item-kind]#internal#
- Inserts an item at the end of the queue.
- Reverts with {Panic-RESOURCE_ERROR} if the queue is full.
- [.contract-item]
- [[DoubleEndedQueue-popBack-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++popBack++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ bytes32 value++` [.item-kind]#internal#
- Removes the item at the end of the queue and returns it.
- Reverts with {Panic-EMPTY_ARRAY_POP} if the queue is empty.
- [.contract-item]
- [[DoubleEndedQueue-pushFront-struct-DoubleEndedQueue-Bytes32Deque-bytes32-]]
- ==== `[.contract-item-name]#++pushFront++#++(struct DoubleEndedQueue.Bytes32Deque deque, bytes32 value)++` [.item-kind]#internal#
- Inserts an item at the beginning of the queue.
- Reverts with {Panic-RESOURCE_ERROR} if the queue is full.
- [.contract-item]
- [[DoubleEndedQueue-popFront-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++popFront++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ bytes32 value++` [.item-kind]#internal#
- Removes the item at the beginning of the queue and returns it.
- Reverts with {Panic-EMPTY_ARRAY_POP} if the queue is empty.
- [.contract-item]
- [[DoubleEndedQueue-front-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++front++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ bytes32 value++` [.item-kind]#internal#
- Returns the item at the beginning of the queue.
- Reverts with {Panic-ARRAY_OUT_OF_BOUNDS} if the queue is empty.
- [.contract-item]
- [[DoubleEndedQueue-back-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++back++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ bytes32 value++` [.item-kind]#internal#
- Returns the item at the end of the queue.
- Reverts with {Panic-ARRAY_OUT_OF_BOUNDS} if the queue is empty.
- [.contract-item]
- [[DoubleEndedQueue-at-struct-DoubleEndedQueue-Bytes32Deque-uint256-]]
- ==== `[.contract-item-name]#++at++#++(struct DoubleEndedQueue.Bytes32Deque deque, uint256 index) โ bytes32 value++` [.item-kind]#internal#
- Return the item at a position in the queue given by `index`, with the first item at 0 and last item at
- `length(deque) - 1`.
- Reverts with {Panic-ARRAY_OUT_OF_BOUNDS} if the index is out of bounds.
- [.contract-item]
- [[DoubleEndedQueue-clear-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++clear++#++(struct DoubleEndedQueue.Bytes32Deque deque)++` [.item-kind]#internal#
- Resets the queue back to being empty.
- NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses
- out on potential gas refunds.
- [.contract-item]
- [[DoubleEndedQueue-length-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++length++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ uint256++` [.item-kind]#internal#
- Returns the number of items in the queue.
- [.contract-item]
- [[DoubleEndedQueue-empty-struct-DoubleEndedQueue-Bytes32Deque-]]
- ==== `[.contract-item-name]#++empty++#++(struct DoubleEndedQueue.Bytes32Deque deque) โ bool++` [.item-kind]#internal#
- Returns true if the queue is empty.
- :InvalidBufferSize: pass:normal[xref:#CircularBuffer-InvalidBufferSize--[`++InvalidBufferSize++`]]
- :Bytes32CircularBuffer: pass:normal[xref:#CircularBuffer-Bytes32CircularBuffer[`++Bytes32CircularBuffer++`]]
- :setup: pass:normal[xref:#CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-[`++setup++`]]
- :clear: pass:normal[xref:#CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-[`++clear++`]]
- :push: pass:normal[xref:#CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-[`++push++`]]
- :count: pass:normal[xref:#CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-[`++count++`]]
- :length: pass:normal[xref:#CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-[`++length++`]]
- :last: pass:normal[xref:#CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-[`++last++`]]
- :includes: pass:normal[xref:#CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-[`++includes++`]]
- :setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256: pass:normal[xref:#CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-[`++setup++`]]
- :clear-struct-CircularBuffer-Bytes32CircularBuffer: pass:normal[xref:#CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-[`++clear++`]]
- :push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32: pass:normal[xref:#CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-[`++push++`]]
- :count-struct-CircularBuffer-Bytes32CircularBuffer: pass:normal[xref:#CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-[`++count++`]]
- :length-struct-CircularBuffer-Bytes32CircularBuffer: pass:normal[xref:#CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-[`++length++`]]
- :last-struct-CircularBuffer-Bytes32CircularBuffer-uint256: pass:normal[xref:#CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-[`++last++`]]
- :includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32: pass:normal[xref:#CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-[`++includes++`]]
- [.contract]
- [[CircularBuffer]]
- === `++CircularBuffer++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/CircularBuffer.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/CircularBuffer.sol";
- ```
- A fixed-size buffer for keeping `bytes32` items in storage.
- This data structure allows for pushing elements to it, and when its length exceeds the specified fixed size,
- new items take the place of the oldest element in the buffer, keeping at most `N` elements in the
- structure.
- Elements can't be removed but the data structure can be cleared. See {clear}.
- Complexity:
- - insertion ({push}): O(1)
- - lookup ({last}): O(1)
- - inclusion ({includes}): O(N) (worst case)
- - reset ({clear}): O(1)
- * The struct is called `Bytes32CircularBuffer`. Other types can be cast to and from `bytes32`. This data structure
- can only be used in storage, and not in memory.
- Example usage:
- ```solidity
- contract Example {
- // Add the library methods
- using CircularBuffer for CircularBuffer.Bytes32CircularBuffer;
- // Declare a buffer storage variable
- CircularBuffer.Bytes32CircularBuffer private myBuffer;
- }
- ```
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-}[`++setup(self, size)++`]
- * {xref-CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-}[`++clear(self)++`]
- * {xref-CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-}[`++push(self, value)++`]
- * {xref-CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-}[`++count(self)++`]
- * {xref-CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-}[`++length(self)++`]
- * {xref-CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-}[`++last(self, i)++`]
- * {xref-CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-}[`++includes(self, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-CircularBuffer-InvalidBufferSize--}[`++InvalidBufferSize()++`]
- --
- [.contract-item]
- [[CircularBuffer-setup-struct-CircularBuffer-Bytes32CircularBuffer-uint256-]]
- ==== `[.contract-item-name]#++setup++#++(struct CircularBuffer.Bytes32CircularBuffer self, uint256 size)++` [.item-kind]#internal#
- Initialize a new CircularBuffer of a given size.
- If the CircularBuffer was already setup and used, calling that function again will reset it to a blank state.
- NOTE: The size of the buffer will affect the execution of {includes} function, as it has a complexity of O(N).
- Consider a large buffer size may render the function unusable.
- [.contract-item]
- [[CircularBuffer-clear-struct-CircularBuffer-Bytes32CircularBuffer-]]
- ==== `[.contract-item-name]#++clear++#++(struct CircularBuffer.Bytes32CircularBuffer self)++` [.item-kind]#internal#
- Clear all data in the buffer without resetting memory, keeping the existing size.
- [.contract-item]
- [[CircularBuffer-push-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-]]
- ==== `[.contract-item-name]#++push++#++(struct CircularBuffer.Bytes32CircularBuffer self, bytes32 value)++` [.item-kind]#internal#
- Push a new value to the buffer. If the buffer is already full, the new value replaces the oldest value in
- the buffer.
- [.contract-item]
- [[CircularBuffer-count-struct-CircularBuffer-Bytes32CircularBuffer-]]
- ==== `[.contract-item-name]#++count++#++(struct CircularBuffer.Bytes32CircularBuffer self) โ uint256++` [.item-kind]#internal#
- Number of values currently in the buffer. This value is 0 for an empty buffer, and cannot exceed the size of
- the buffer.
- [.contract-item]
- [[CircularBuffer-length-struct-CircularBuffer-Bytes32CircularBuffer-]]
- ==== `[.contract-item-name]#++length++#++(struct CircularBuffer.Bytes32CircularBuffer self) โ uint256++` [.item-kind]#internal#
- Length of the buffer. This is the maximum number of elements kept in the buffer.
- [.contract-item]
- [[CircularBuffer-last-struct-CircularBuffer-Bytes32CircularBuffer-uint256-]]
- ==== `[.contract-item-name]#++last++#++(struct CircularBuffer.Bytes32CircularBuffer self, uint256 i) โ bytes32++` [.item-kind]#internal#
- Getter for the i-th value in the buffer, from the end.
- Reverts with {Panic-ARRAY_OUT_OF_BOUNDS} if trying to access an element that was not pushed, or that was
- dropped to make room for newer elements.
- [.contract-item]
- [[CircularBuffer-includes-struct-CircularBuffer-Bytes32CircularBuffer-bytes32-]]
- ==== `[.contract-item-name]#++includes++#++(struct CircularBuffer.Bytes32CircularBuffer self, bytes32 value) โ bool++` [.item-kind]#internal#
- Check if a given value is in the buffer.
- [.contract-item]
- [[CircularBuffer-InvalidBufferSize--]]
- ==== `[.contract-item-name]#++InvalidBufferSize++#++()++` [.item-kind]#error#
- Error emitted when trying to setup a buffer with a size of 0.
- :CheckpointUnorderedInsertion: pass:normal[xref:#Checkpoints-CheckpointUnorderedInsertion--[`++CheckpointUnorderedInsertion++`]]
- :Trace224: pass:normal[xref:#Checkpoints-Trace224[`++Trace224++`]]
- :Checkpoint224: pass:normal[xref:#Checkpoints-Checkpoint224[`++Checkpoint224++`]]
- :push: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-[`++push++`]]
- :lowerLookup: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-[`++lowerLookup++`]]
- :upperLookup: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-[`++upperLookup++`]]
- :upperLookupRecent: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-[`++upperLookupRecent++`]]
- :latest: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace224-[`++latest++`]]
- :latestCheckpoint: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-[`++latestCheckpoint++`]]
- :length: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace224-[`++length++`]]
- :at: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace224-uint32-[`++at++`]]
- :Trace208: pass:normal[xref:#Checkpoints-Trace208[`++Trace208++`]]
- :Checkpoint208: pass:normal[xref:#Checkpoints-Checkpoint208[`++Checkpoint208++`]]
- :push: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-[`++push++`]]
- :lowerLookup: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-[`++lowerLookup++`]]
- :upperLookup: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-[`++upperLookup++`]]
- :upperLookupRecent: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-[`++upperLookupRecent++`]]
- :latest: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace208-[`++latest++`]]
- :latestCheckpoint: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-[`++latestCheckpoint++`]]
- :length: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace208-[`++length++`]]
- :at: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace208-uint32-[`++at++`]]
- :Trace160: pass:normal[xref:#Checkpoints-Trace160[`++Trace160++`]]
- :Checkpoint160: pass:normal[xref:#Checkpoints-Checkpoint160[`++Checkpoint160++`]]
- :push: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-[`++push++`]]
- :lowerLookup: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-[`++lowerLookup++`]]
- :upperLookup: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-[`++upperLookup++`]]
- :upperLookupRecent: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-[`++upperLookupRecent++`]]
- :latest: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace160-[`++latest++`]]
- :latestCheckpoint: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-[`++latestCheckpoint++`]]
- :length: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace160-[`++length++`]]
- :at: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace160-uint32-[`++at++`]]
- :push-struct-Checkpoints-Trace224-uint32-uint224: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-[`++push++`]]
- :lowerLookup-struct-Checkpoints-Trace224-uint32: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-[`++lowerLookup++`]]
- :upperLookup-struct-Checkpoints-Trace224-uint32: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-[`++upperLookup++`]]
- :upperLookupRecent-struct-Checkpoints-Trace224-uint32: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-[`++upperLookupRecent++`]]
- :latest-struct-Checkpoints-Trace224: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace224-[`++latest++`]]
- :latestCheckpoint-struct-Checkpoints-Trace224: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-[`++latestCheckpoint++`]]
- :length-struct-Checkpoints-Trace224: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace224-[`++length++`]]
- :at-struct-Checkpoints-Trace224-uint32: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace224-uint32-[`++at++`]]
- :push-struct-Checkpoints-Trace208-uint48-uint208: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-[`++push++`]]
- :lowerLookup-struct-Checkpoints-Trace208-uint48: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-[`++lowerLookup++`]]
- :upperLookup-struct-Checkpoints-Trace208-uint48: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-[`++upperLookup++`]]
- :upperLookupRecent-struct-Checkpoints-Trace208-uint48: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-[`++upperLookupRecent++`]]
- :latest-struct-Checkpoints-Trace208: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace208-[`++latest++`]]
- :latestCheckpoint-struct-Checkpoints-Trace208: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-[`++latestCheckpoint++`]]
- :length-struct-Checkpoints-Trace208: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace208-[`++length++`]]
- :at-struct-Checkpoints-Trace208-uint32: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace208-uint32-[`++at++`]]
- :push-struct-Checkpoints-Trace160-uint96-uint160: pass:normal[xref:#Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-[`++push++`]]
- :lowerLookup-struct-Checkpoints-Trace160-uint96: pass:normal[xref:#Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-[`++lowerLookup++`]]
- :upperLookup-struct-Checkpoints-Trace160-uint96: pass:normal[xref:#Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-[`++upperLookup++`]]
- :upperLookupRecent-struct-Checkpoints-Trace160-uint96: pass:normal[xref:#Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-[`++upperLookupRecent++`]]
- :latest-struct-Checkpoints-Trace160: pass:normal[xref:#Checkpoints-latest-struct-Checkpoints-Trace160-[`++latest++`]]
- :latestCheckpoint-struct-Checkpoints-Trace160: pass:normal[xref:#Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-[`++latestCheckpoint++`]]
- :length-struct-Checkpoints-Trace160: pass:normal[xref:#Checkpoints-length-struct-Checkpoints-Trace160-[`++length++`]]
- :at-struct-Checkpoints-Trace160-uint32: pass:normal[xref:#Checkpoints-at-struct-Checkpoints-Trace160-uint32-[`++at++`]]
- [.contract]
- [[Checkpoints]]
- === `++Checkpoints++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/Checkpoints.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
- ```
- This library defines the `Trace*` struct, for checkpointing values as they change at different points in
- time, and later looking up past values by block number. See {Votes} as an example.
- To create a history of checkpoints define a variable type `Checkpoints.Trace*` in your contract, and store a new
- checkpoint for the current transaction block using the {push} function.
- [.contract-index]
- .Functions
- --
- * {xref-Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-}[`++push(self, key, value)++`]
- * {xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-}[`++lowerLookup(self, key)++`]
- * {xref-Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-}[`++upperLookup(self, key)++`]
- * {xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-}[`++upperLookupRecent(self, key)++`]
- * {xref-Checkpoints-latest-struct-Checkpoints-Trace224-}[`++latest(self)++`]
- * {xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-}[`++latestCheckpoint(self)++`]
- * {xref-Checkpoints-length-struct-Checkpoints-Trace224-}[`++length(self)++`]
- * {xref-Checkpoints-at-struct-Checkpoints-Trace224-uint32-}[`++at(self, pos)++`]
- * {xref-Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-}[`++push(self, key, value)++`]
- * {xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-}[`++lowerLookup(self, key)++`]
- * {xref-Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-}[`++upperLookup(self, key)++`]
- * {xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-}[`++upperLookupRecent(self, key)++`]
- * {xref-Checkpoints-latest-struct-Checkpoints-Trace208-}[`++latest(self)++`]
- * {xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-}[`++latestCheckpoint(self)++`]
- * {xref-Checkpoints-length-struct-Checkpoints-Trace208-}[`++length(self)++`]
- * {xref-Checkpoints-at-struct-Checkpoints-Trace208-uint32-}[`++at(self, pos)++`]
- * {xref-Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-}[`++push(self, key, value)++`]
- * {xref-Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-}[`++lowerLookup(self, key)++`]
- * {xref-Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-}[`++upperLookup(self, key)++`]
- * {xref-Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-}[`++upperLookupRecent(self, key)++`]
- * {xref-Checkpoints-latest-struct-Checkpoints-Trace160-}[`++latest(self)++`]
- * {xref-Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-}[`++latestCheckpoint(self)++`]
- * {xref-Checkpoints-length-struct-Checkpoints-Trace160-}[`++length(self)++`]
- * {xref-Checkpoints-at-struct-Checkpoints-Trace160-uint32-}[`++at(self, pos)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Checkpoints-CheckpointUnorderedInsertion--}[`++CheckpointUnorderedInsertion()++`]
- --
- [.contract-item]
- [[Checkpoints-push-struct-Checkpoints-Trace224-uint32-uint224-]]
- ==== `[.contract-item-name]#++push++#++(struct Checkpoints.Trace224 self, uint32 key, uint224 value) โ uint224 oldValue, uint224 newValue++` [.item-kind]#internal#
- Pushes a (`key`, `value`) pair into a Trace224 so that it is stored as the checkpoint.
- Returns previous value and new value.
- IMPORTANT: Never accept `key` as a user input, since an arbitrary `type(uint32).max` key set will disable the
- library.
- [.contract-item]
- [[Checkpoints-lowerLookup-struct-Checkpoints-Trace224-uint32-]]
- ==== `[.contract-item-name]#++lowerLookup++#++(struct Checkpoints.Trace224 self, uint32 key) โ uint224++` [.item-kind]#internal#
- Returns the value in the first (oldest) checkpoint with key greater or equal than the search key, or zero if
- there is none.
- [.contract-item]
- [[Checkpoints-upperLookup-struct-Checkpoints-Trace224-uint32-]]
- ==== `[.contract-item-name]#++upperLookup++#++(struct Checkpoints.Trace224 self, uint32 key) โ uint224++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- [.contract-item]
- [[Checkpoints-upperLookupRecent-struct-Checkpoints-Trace224-uint32-]]
- ==== `[.contract-item-name]#++upperLookupRecent++#++(struct Checkpoints.Trace224 self, uint32 key) โ uint224++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- NOTE: This is a variant of {upperLookup} that is optimized to find "recent" checkpoint (checkpoints with high
- keys).
- [.contract-item]
- [[Checkpoints-latest-struct-Checkpoints-Trace224-]]
- ==== `[.contract-item-name]#++latest++#++(struct Checkpoints.Trace224 self) โ uint224++` [.item-kind]#internal#
- Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
- [.contract-item]
- [[Checkpoints-latestCheckpoint-struct-Checkpoints-Trace224-]]
- ==== `[.contract-item-name]#++latestCheckpoint++#++(struct Checkpoints.Trace224 self) โ bool exists, uint32 _key, uint224 _value++` [.item-kind]#internal#
- Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
- in the most recent checkpoint.
- [.contract-item]
- [[Checkpoints-length-struct-Checkpoints-Trace224-]]
- ==== `[.contract-item-name]#++length++#++(struct Checkpoints.Trace224 self) โ uint256++` [.item-kind]#internal#
- Returns the number of checkpoints.
- [.contract-item]
- [[Checkpoints-at-struct-Checkpoints-Trace224-uint32-]]
- ==== `[.contract-item-name]#++at++#++(struct Checkpoints.Trace224 self, uint32 pos) โ struct Checkpoints.Checkpoint224++` [.item-kind]#internal#
- Returns checkpoint at given position.
- [.contract-item]
- [[Checkpoints-push-struct-Checkpoints-Trace208-uint48-uint208-]]
- ==== `[.contract-item-name]#++push++#++(struct Checkpoints.Trace208 self, uint48 key, uint208 value) โ uint208 oldValue, uint208 newValue++` [.item-kind]#internal#
- Pushes a (`key`, `value`) pair into a Trace208 so that it is stored as the checkpoint.
- Returns previous value and new value.
- IMPORTANT: Never accept `key` as a user input, since an arbitrary `type(uint48).max` key set will disable the
- library.
- [.contract-item]
- [[Checkpoints-lowerLookup-struct-Checkpoints-Trace208-uint48-]]
- ==== `[.contract-item-name]#++lowerLookup++#++(struct Checkpoints.Trace208 self, uint48 key) โ uint208++` [.item-kind]#internal#
- Returns the value in the first (oldest) checkpoint with key greater or equal than the search key, or zero if
- there is none.
- [.contract-item]
- [[Checkpoints-upperLookup-struct-Checkpoints-Trace208-uint48-]]
- ==== `[.contract-item-name]#++upperLookup++#++(struct Checkpoints.Trace208 self, uint48 key) โ uint208++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- [.contract-item]
- [[Checkpoints-upperLookupRecent-struct-Checkpoints-Trace208-uint48-]]
- ==== `[.contract-item-name]#++upperLookupRecent++#++(struct Checkpoints.Trace208 self, uint48 key) โ uint208++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- NOTE: This is a variant of {upperLookup} that is optimized to find "recent" checkpoint (checkpoints with high
- keys).
- [.contract-item]
- [[Checkpoints-latest-struct-Checkpoints-Trace208-]]
- ==== `[.contract-item-name]#++latest++#++(struct Checkpoints.Trace208 self) โ uint208++` [.item-kind]#internal#
- Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
- [.contract-item]
- [[Checkpoints-latestCheckpoint-struct-Checkpoints-Trace208-]]
- ==== `[.contract-item-name]#++latestCheckpoint++#++(struct Checkpoints.Trace208 self) โ bool exists, uint48 _key, uint208 _value++` [.item-kind]#internal#
- Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
- in the most recent checkpoint.
- [.contract-item]
- [[Checkpoints-length-struct-Checkpoints-Trace208-]]
- ==== `[.contract-item-name]#++length++#++(struct Checkpoints.Trace208 self) โ uint256++` [.item-kind]#internal#
- Returns the number of checkpoints.
- [.contract-item]
- [[Checkpoints-at-struct-Checkpoints-Trace208-uint32-]]
- ==== `[.contract-item-name]#++at++#++(struct Checkpoints.Trace208 self, uint32 pos) โ struct Checkpoints.Checkpoint208++` [.item-kind]#internal#
- Returns checkpoint at given position.
- [.contract-item]
- [[Checkpoints-push-struct-Checkpoints-Trace160-uint96-uint160-]]
- ==== `[.contract-item-name]#++push++#++(struct Checkpoints.Trace160 self, uint96 key, uint160 value) โ uint160 oldValue, uint160 newValue++` [.item-kind]#internal#
- Pushes a (`key`, `value`) pair into a Trace160 so that it is stored as the checkpoint.
- Returns previous value and new value.
- IMPORTANT: Never accept `key` as a user input, since an arbitrary `type(uint96).max` key set will disable the
- library.
- [.contract-item]
- [[Checkpoints-lowerLookup-struct-Checkpoints-Trace160-uint96-]]
- ==== `[.contract-item-name]#++lowerLookup++#++(struct Checkpoints.Trace160 self, uint96 key) โ uint160++` [.item-kind]#internal#
- Returns the value in the first (oldest) checkpoint with key greater or equal than the search key, or zero if
- there is none.
- [.contract-item]
- [[Checkpoints-upperLookup-struct-Checkpoints-Trace160-uint96-]]
- ==== `[.contract-item-name]#++upperLookup++#++(struct Checkpoints.Trace160 self, uint96 key) โ uint160++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- [.contract-item]
- [[Checkpoints-upperLookupRecent-struct-Checkpoints-Trace160-uint96-]]
- ==== `[.contract-item-name]#++upperLookupRecent++#++(struct Checkpoints.Trace160 self, uint96 key) โ uint160++` [.item-kind]#internal#
- Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
- if there is none.
- NOTE: This is a variant of {upperLookup} that is optimized to find "recent" checkpoint (checkpoints with high
- keys).
- [.contract-item]
- [[Checkpoints-latest-struct-Checkpoints-Trace160-]]
- ==== `[.contract-item-name]#++latest++#++(struct Checkpoints.Trace160 self) โ uint160++` [.item-kind]#internal#
- Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
- [.contract-item]
- [[Checkpoints-latestCheckpoint-struct-Checkpoints-Trace160-]]
- ==== `[.contract-item-name]#++latestCheckpoint++#++(struct Checkpoints.Trace160 self) โ bool exists, uint96 _key, uint160 _value++` [.item-kind]#internal#
- Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
- in the most recent checkpoint.
- [.contract-item]
- [[Checkpoints-length-struct-Checkpoints-Trace160-]]
- ==== `[.contract-item-name]#++length++#++(struct Checkpoints.Trace160 self) โ uint256++` [.item-kind]#internal#
- Returns the number of checkpoints.
- [.contract-item]
- [[Checkpoints-at-struct-Checkpoints-Trace160-uint32-]]
- ==== `[.contract-item-name]#++at++#++(struct Checkpoints.Trace160 self, uint32 pos) โ struct Checkpoints.Checkpoint160++` [.item-kind]#internal#
- Returns checkpoint at given position.
- [.contract-item]
- [[Checkpoints-CheckpointUnorderedInsertion--]]
- ==== `[.contract-item-name]#++CheckpointUnorderedInsertion++#++()++` [.item-kind]#error#
- A value was attempted to be inserted on a past checkpoint.
- :Uint256Heap: pass:normal[xref:#Heap-Uint256Heap[`++Uint256Heap++`]]
- :peek: pass:normal[xref:#Heap-peek-struct-Heap-Uint256Heap-[`++peek++`]]
- :pop: pass:normal[xref:#Heap-pop-struct-Heap-Uint256Heap-[`++pop++`]]
- :pop: pass:normal[xref:#Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--[`++pop++`]]
- :insert: pass:normal[xref:#Heap-insert-struct-Heap-Uint256Heap-uint256-[`++insert++`]]
- :insert: pass:normal[xref:#Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--[`++insert++`]]
- :replace: pass:normal[xref:#Heap-replace-struct-Heap-Uint256Heap-uint256-[`++replace++`]]
- :replace: pass:normal[xref:#Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--[`++replace++`]]
- :length: pass:normal[xref:#Heap-length-struct-Heap-Uint256Heap-[`++length++`]]
- :clear: pass:normal[xref:#Heap-clear-struct-Heap-Uint256Heap-[`++clear++`]]
- :peek-struct-Heap-Uint256Heap: pass:normal[xref:#Heap-peek-struct-Heap-Uint256Heap-[`++peek++`]]
- :pop-struct-Heap-Uint256Heap: pass:normal[xref:#Heap-pop-struct-Heap-Uint256Heap-[`++pop++`]]
- :pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool-: pass:normal[xref:#Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--[`++pop++`]]
- :insert-struct-Heap-Uint256Heap-uint256: pass:normal[xref:#Heap-insert-struct-Heap-Uint256Heap-uint256-[`++insert++`]]
- :insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool-: pass:normal[xref:#Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--[`++insert++`]]
- :replace-struct-Heap-Uint256Heap-uint256: pass:normal[xref:#Heap-replace-struct-Heap-Uint256Heap-uint256-[`++replace++`]]
- :replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool-: pass:normal[xref:#Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--[`++replace++`]]
- :length-struct-Heap-Uint256Heap: pass:normal[xref:#Heap-length-struct-Heap-Uint256Heap-[`++length++`]]
- :clear-struct-Heap-Uint256Heap: pass:normal[xref:#Heap-clear-struct-Heap-Uint256Heap-[`++clear++`]]
- [.contract]
- [[Heap]]
- === `++Heap++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/Heap.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/Heap.sol";
- ```
- Library for managing https://en.wikipedia.org/wiki/Binary_heap[binary heap] that can be used as
- https://en.wikipedia.org/wiki/Priority_queue[priority queue].
- Heaps are represented as a tree of values where the first element (index 0) is the root, and where the node at
- index i is the child of the node at index (i-1)/2 and the parent of nodes at index 2*i+1 and 2*i+2. Each node
- stores an element of the heap.
- The structure is ordered so that each node is bigger than its parent. An immediate consequence is that the
- highest priority value is the one at the root. This value can be looked up in constant time (O(1)) at
- `heap.tree[0]`
- The structure is designed to perform the following operations with the corresponding complexities:
- * peek (get the highest priority value): O(1)
- * insert (insert a value): O(log(n))
- * pop (remove the highest priority value): O(log(n))
- * replace (replace the highest priority value with a new value): O(log(n))
- * length (get the number of elements): O(1)
- * clear (remove all elements): O(1)
- IMPORTANT: This library allows for the use of custom comparator functions. Given that manipulating
- memory can lead to unexpected behavior. Consider verifying that the comparator does not manipulate
- the Heap's state directly and that it follows the Solidity memory safety rules.
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-Heap-peek-struct-Heap-Uint256Heap-}[`++peek(self)++`]
- * {xref-Heap-pop-struct-Heap-Uint256Heap-}[`++pop(self)++`]
- * {xref-Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--}[`++pop(self, comp)++`]
- * {xref-Heap-insert-struct-Heap-Uint256Heap-uint256-}[`++insert(self, value)++`]
- * {xref-Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--}[`++insert(self, value, comp)++`]
- * {xref-Heap-replace-struct-Heap-Uint256Heap-uint256-}[`++replace(self, newValue)++`]
- * {xref-Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--}[`++replace(self, newValue, comp)++`]
- * {xref-Heap-length-struct-Heap-Uint256Heap-}[`++length(self)++`]
- * {xref-Heap-clear-struct-Heap-Uint256Heap-}[`++clear(self)++`]
- --
- [.contract-item]
- [[Heap-peek-struct-Heap-Uint256Heap-]]
- ==== `[.contract-item-name]#++peek++#++(struct Heap.Uint256Heap self) โ uint256++` [.item-kind]#internal#
- Lookup the root element of the heap.
- [.contract-item]
- [[Heap-pop-struct-Heap-Uint256Heap-]]
- ==== `[.contract-item-name]#++pop++#++(struct Heap.Uint256Heap self) โ uint256++` [.item-kind]#internal#
- Remove (and return) the root element for the heap using the default comparator.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-pop-struct-Heap-Uint256Heap-function--uint256-uint256--view-returns--bool--]]
- ==== `[.contract-item-name]#++pop++#++(struct Heap.Uint256Heap self, function (uint256,uint256) view returns (bool) comp) โ uint256++` [.item-kind]#internal#
- Remove (and return) the root element for the heap using the provided comparator.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-insert-struct-Heap-Uint256Heap-uint256-]]
- ==== `[.contract-item-name]#++insert++#++(struct Heap.Uint256Heap self, uint256 value)++` [.item-kind]#internal#
- Insert a new element in the heap using the default comparator.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-insert-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--]]
- ==== `[.contract-item-name]#++insert++#++(struct Heap.Uint256Heap self, uint256 value, function (uint256,uint256) view returns (bool) comp)++` [.item-kind]#internal#
- Insert a new element in the heap using the provided comparator.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-replace-struct-Heap-Uint256Heap-uint256-]]
- ==== `[.contract-item-name]#++replace++#++(struct Heap.Uint256Heap self, uint256 newValue) โ uint256++` [.item-kind]#internal#
- Return the root element for the heap, and replace it with a new value, using the default comparator.
- This is equivalent to using {pop} and {insert}, but requires only one rebalancing operation.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-replace-struct-Heap-Uint256Heap-uint256-function--uint256-uint256--view-returns--bool--]]
- ==== `[.contract-item-name]#++replace++#++(struct Heap.Uint256Heap self, uint256 newValue, function (uint256,uint256) view returns (bool) comp) โ uint256++` [.item-kind]#internal#
- Return the root element for the heap, and replace it with a new value, using the provided comparator.
- This is equivalent to using {pop} and {insert}, but requires only one rebalancing operation.
- NOTE: All inserting and removal from a heap should always be done using the same comparator. Mixing comparator
- during the lifecycle of a heap will result in undefined behavior.
- [.contract-item]
- [[Heap-length-struct-Heap-Uint256Heap-]]
- ==== `[.contract-item-name]#++length++#++(struct Heap.Uint256Heap self) โ uint256++` [.item-kind]#internal#
- Returns the number of elements in the heap.
- [.contract-item]
- [[Heap-clear-struct-Heap-Uint256Heap-]]
- ==== `[.contract-item-name]#++clear++#++(struct Heap.Uint256Heap self)++` [.item-kind]#internal#
- Removes all elements in the heap.
- :MerkleTreeUpdateInvalidIndex: pass:normal[xref:#MerkleTree-MerkleTreeUpdateInvalidIndex-uint256-uint256-[`++MerkleTreeUpdateInvalidIndex++`]]
- :MerkleTreeUpdateInvalidProof: pass:normal[xref:#MerkleTree-MerkleTreeUpdateInvalidProof--[`++MerkleTreeUpdateInvalidProof++`]]
- :Bytes32PushTree: pass:normal[xref:#MerkleTree-Bytes32PushTree[`++Bytes32PushTree++`]]
- :setup: pass:normal[xref:#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-[`++setup++`]]
- :setup: pass:normal[xref:#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--[`++setup++`]]
- :push: pass:normal[xref:#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-[`++push++`]]
- :push: pass:normal[xref:#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--[`++push++`]]
- :update: pass:normal[xref:#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---[`++update++`]]
- :update: pass:normal[xref:#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--[`++update++`]]
- :depth: pass:normal[xref:#MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-[`++depth++`]]
- :setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32: pass:normal[xref:#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-[`++setup++`]]
- :setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32-: pass:normal[xref:#MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--[`++setup++`]]
- :push-struct-MerkleTree-Bytes32PushTree-bytes32: pass:normal[xref:#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-[`++push++`]]
- :push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32-: pass:normal[xref:#MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--[`++push++`]]
- :update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32--: pass:normal[xref:#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---[`++update++`]]
- :update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32-: pass:normal[xref:#MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--[`++update++`]]
- :depth-struct-MerkleTree-Bytes32PushTree: pass:normal[xref:#MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-[`++depth++`]]
- [.contract]
- [[MerkleTree]]
- === `++MerkleTree++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/structs/MerkleTree.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/structs/MerkleTree.sol";
- ```
- Library for managing https://wikipedia.org/wiki/Merkle_Tree[Merkle Tree] data structures.
- Each tree is a complete binary tree with the ability to sequentially insert leaves, changing them from a zero to a
- non-zero value and updating its root. This structure allows inserting commitments (or other entries) that are not
- stored, but can be proven to be part of the tree at a later time if the root is kept. See {MerkleProof}.
- A tree is defined by the following parameters:
- * Depth: The number of levels in the tree, it also defines the maximum number of leaves as 2**depth.
- * Zero value: The value that represents an empty leaf. Used to avoid regular zero values to be part of the tree.
- * Hashing function: A cryptographic hash function used to produce internal nodes. Defaults to {Hashes-commutativeKeccak256}.
- NOTE: Building trees using non-commutative hashing functions (i.e. `H(a, b) != H(b, a)`) is supported. However,
- proving the inclusion of a leaf in such trees is not possible with the {MerkleProof} library since it only supports
- _commutative_ hashing functions.
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-}[`++setup(self, treeDepth, zero)++`]
- * {xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--}[`++setup(self, treeDepth, zero, fnHash)++`]
- * {xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-}[`++push(self, leaf)++`]
- * {xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--}[`++push(self, leaf, fnHash)++`]
- * {xref-MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---}[`++update(self, index, oldValue, newValue, proof)++`]
- * {xref-MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--}[`++update(self, index, oldValue, newValue, proof, fnHash)++`]
- * {xref-MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-}[`++depth(self)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-MerkleTree-MerkleTreeUpdateInvalidIndex-uint256-uint256-}[`++MerkleTreeUpdateInvalidIndex(index, length)++`]
- * {xref-MerkleTree-MerkleTreeUpdateInvalidProof--}[`++MerkleTreeUpdateInvalidProof()++`]
- --
- [.contract-item]
- [[MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-]]
- ==== `[.contract-item-name]#++setup++#++(struct MerkleTree.Bytes32PushTree self, uint8 treeDepth, bytes32 zero) โ bytes32 initialRoot++` [.item-kind]#internal#
- Initialize a {Bytes32PushTree} using {Hashes-commutativeKeccak256} to hash internal nodes.
- The capacity of the tree (i.e. number of leaves) is set to `2**treeDepth`.
- Calling this function on MerkleTree that was already setup and used will reset it to a blank state.
- Once a tree is setup, any push to it must use the same hashing function. This means that values
- should be pushed to it using the default {xref-MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-}[push] function.
- IMPORTANT: The zero value should be carefully chosen since it will be stored in the tree representing
- empty leaves. It should be a value that is not expected to be part of the tree.
- [.contract-item]
- [[MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-function--bytes32-bytes32--view-returns--bytes32--]]
- ==== `[.contract-item-name]#++setup++#++(struct MerkleTree.Bytes32PushTree self, uint8 treeDepth, bytes32 zero, function (bytes32,bytes32) view returns (bytes32) fnHash) โ bytes32 initialRoot++` [.item-kind]#internal#
- Same as {xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-}[setup], but allows to specify a custom hashing function.
- Once a tree is setup, any push to it must use the same hashing function. This means that values
- should be pushed to it using the custom push function, which should be the same one as used during the setup.
- IMPORTANT: Providing a custom hashing function is a security-sensitive operation since it may
- compromise the soundness of the tree.
- NOTE: Consider verifying that the hashing function does not manipulate the memory state directly and that it
- follows the Solidity memory safety rules. Otherwise, it may lead to unexpected behavior.
- [.contract-item]
- [[MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-]]
- ==== `[.contract-item-name]#++push++#++(struct MerkleTree.Bytes32PushTree self, bytes32 leaf) โ uint256 index, bytes32 newRoot++` [.item-kind]#internal#
- Insert a new leaf in the tree, and compute the new root. Returns the position of the inserted leaf in the
- tree, and the resulting root.
- Hashing the leaf before calling this function is recommended as a protection against
- second pre-image attacks.
- This variant uses {Hashes-commutativeKeccak256} to hash internal nodes. It should only be used on merkle trees
- that were setup using the same (default) hashing function (i.e. by calling
- {xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-}[the default setup] function).
- [.contract-item]
- [[MerkleTree-push-struct-MerkleTree-Bytes32PushTree-bytes32-function--bytes32-bytes32--view-returns--bytes32--]]
- ==== `[.contract-item-name]#++push++#++(struct MerkleTree.Bytes32PushTree self, bytes32 leaf, function (bytes32,bytes32) view returns (bytes32) fnHash) โ uint256 index, bytes32 newRoot++` [.item-kind]#internal#
- Insert a new leaf in the tree, and compute the new root. Returns the position of the inserted leaf in the
- tree, and the resulting root.
- Hashing the leaf before calling this function is recommended as a protection against
- second pre-image attacks.
- This variant uses a custom hashing function to hash internal nodes. It should only be called with the same
- function as the one used during the initial setup of the merkle tree.
- [.contract-item]
- [[MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---]]
- ==== `[.contract-item-name]#++update++#++(struct MerkleTree.Bytes32PushTree self, uint256 index, bytes32 oldValue, bytes32 newValue, bytes32[] proof) โ bytes32 oldRoot, bytes32 newRoot++` [.item-kind]#internal#
- Change the value of the leaf at position `index` from `oldValue` to `newValue`. Returns the recomputed "old"
- root (before the update) and "new" root (after the update). The caller must verify that the reconstructed old
- root is the last known one.
- The `proof` must be an up-to-date inclusion proof for the leaf being updated. This means that this function is
- vulnerable to front-running. Any {push} or {update} operation (that changes the root of the tree) would render
- all "in flight" updates invalid.
- This variant uses {Hashes-commutativeKeccak256} to hash internal nodes. It should only be used on merkle trees
- that were setup using the same (default) hashing function (i.e. by calling
- {xref-MerkleTree-setup-struct-MerkleTree-Bytes32PushTree-uint8-bytes32-}[the default setup] function).
- [.contract-item]
- [[MerkleTree-update-struct-MerkleTree-Bytes32PushTree-uint256-bytes32-bytes32-bytes32---function--bytes32-bytes32--view-returns--bytes32--]]
- ==== `[.contract-item-name]#++update++#++(struct MerkleTree.Bytes32PushTree self, uint256 index, bytes32 oldValue, bytes32 newValue, bytes32[] proof, function (bytes32,bytes32) view returns (bytes32) fnHash) โ bytes32 oldRoot, bytes32 newRoot++` [.item-kind]#internal#
- Change the value of the leaf at position `index` from `oldValue` to `newValue`. Returns the recomputed "old"
- root (before the update) and "new" root (after the update). The caller must verify that the reconstructed old
- root is the last known one.
- The `proof` must be an up-to-date inclusion proof for the leaf being update. This means that this function is
- vulnerable to front-running. Any {push} or {update} operation (that changes the root of the tree) would render
- all "in flight" updates invalid.
- This variant uses a custom hashing function to hash internal nodes. It should only be called with the same
- function as the one used during the initial setup of the merkle tree.
- [.contract-item]
- [[MerkleTree-depth-struct-MerkleTree-Bytes32PushTree-]]
- ==== `[.contract-item-name]#++depth++#++(struct MerkleTree.Bytes32PushTree self) โ uint256++` [.item-kind]#internal#
- Tree's depth (set at initialization)
- [.contract-item]
- [[MerkleTree-MerkleTreeUpdateInvalidIndex-uint256-uint256-]]
- ==== `[.contract-item-name]#++MerkleTreeUpdateInvalidIndex++#++(uint256 index, uint256 length)++` [.item-kind]#error#
- Error emitted when trying to update a leaf that was not previously pushed.
- [.contract-item]
- [[MerkleTree-MerkleTreeUpdateInvalidProof--]]
- ==== `[.contract-item-name]#++MerkleTreeUpdateInvalidProof++#++()++` [.item-kind]#error#
- Error emitted when the proof used during an update is invalid (could not reproduce the side).
- == Libraries
- :Create2EmptyBytecode: pass:normal[xref:#Create2-Create2EmptyBytecode--[`++Create2EmptyBytecode++`]]
- :deploy: pass:normal[xref:#Create2-deploy-uint256-bytes32-bytes-[`++deploy++`]]
- :computeAddress: pass:normal[xref:#Create2-computeAddress-bytes32-bytes32-[`++computeAddress++`]]
- :computeAddress: pass:normal[xref:#Create2-computeAddress-bytes32-bytes32-address-[`++computeAddress++`]]
- :deploy-uint256-bytes32-bytes: pass:normal[xref:#Create2-deploy-uint256-bytes32-bytes-[`++deploy++`]]
- :computeAddress-bytes32-bytes32: pass:normal[xref:#Create2-computeAddress-bytes32-bytes32-[`++computeAddress++`]]
- :computeAddress-bytes32-bytes32-address: pass:normal[xref:#Create2-computeAddress-bytes32-bytes32-address-[`++computeAddress++`]]
- [.contract]
- [[Create2]]
- === `++Create2++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Create2.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Create2.sol";
- ```
- Helper to make usage of the `CREATE2` EVM opcode easier and safer.
- `CREATE2` can be used to compute in advance the address where a smart
- contract will be deployed, which allows for interesting new mechanisms known
- as 'counterfactual interactions'.
- See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
- information.
- [.contract-index]
- .Functions
- --
- * {xref-Create2-deploy-uint256-bytes32-bytes-}[`++deploy(amount, salt, bytecode)++`]
- * {xref-Create2-computeAddress-bytes32-bytes32-}[`++computeAddress(salt, bytecodeHash)++`]
- * {xref-Create2-computeAddress-bytes32-bytes32-address-}[`++computeAddress(salt, bytecodeHash, deployer)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Create2-Create2EmptyBytecode--}[`++Create2EmptyBytecode()++`]
- --
- [.contract-item]
- [[Create2-deploy-uint256-bytes32-bytes-]]
- ==== `[.contract-item-name]#++deploy++#++(uint256 amount, bytes32 salt, bytes bytecode) โ address addr++` [.item-kind]#internal#
- Deploys a contract using `CREATE2`. The address where the contract
- will be deployed can be known in advance via {computeAddress}.
- The bytecode for a contract can be obtained from Solidity with
- `type(contractName).creationCode`.
- Requirements:
- - `bytecode` must not be empty.
- - `salt` must have not been used for `bytecode` already.
- - the factory must have a balance of at least `amount`.
- - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
- [.contract-item]
- [[Create2-computeAddress-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++computeAddress++#++(bytes32 salt, bytes32 bytecodeHash) โ address++` [.item-kind]#internal#
- Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
- `bytecodeHash` or `salt` will result in a new destination address.
- [.contract-item]
- [[Create2-computeAddress-bytes32-bytes32-address-]]
- ==== `[.contract-item-name]#++computeAddress++#++(bytes32 salt, bytes32 bytecodeHash, address deployer) โ address addr++` [.item-kind]#internal#
- Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
- `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
- [.contract-item]
- [[Create2-Create2EmptyBytecode--]]
- ==== `[.contract-item-name]#++Create2EmptyBytecode++#++()++` [.item-kind]#error#
- There's no code to deploy.
- :AddressEmptyCode: pass:normal[xref:#Address-AddressEmptyCode-address-[`++AddressEmptyCode++`]]
- :sendValue: pass:normal[xref:#Address-sendValue-address-payable-uint256-[`++sendValue++`]]
- :functionCall: pass:normal[xref:#Address-functionCall-address-bytes-[`++functionCall++`]]
- :functionCallWithValue: pass:normal[xref:#Address-functionCallWithValue-address-bytes-uint256-[`++functionCallWithValue++`]]
- :functionStaticCall: pass:normal[xref:#Address-functionStaticCall-address-bytes-[`++functionStaticCall++`]]
- :functionDelegateCall: pass:normal[xref:#Address-functionDelegateCall-address-bytes-[`++functionDelegateCall++`]]
- :verifyCallResultFromTarget: pass:normal[xref:#Address-verifyCallResultFromTarget-address-bool-bytes-[`++verifyCallResultFromTarget++`]]
- :verifyCallResult: pass:normal[xref:#Address-verifyCallResult-bool-bytes-[`++verifyCallResult++`]]
- :sendValue-address-payable-uint256: pass:normal[xref:#Address-sendValue-address-payable-uint256-[`++sendValue++`]]
- :functionCall-address-bytes: pass:normal[xref:#Address-functionCall-address-bytes-[`++functionCall++`]]
- :functionCallWithValue-address-bytes-uint256: pass:normal[xref:#Address-functionCallWithValue-address-bytes-uint256-[`++functionCallWithValue++`]]
- :functionStaticCall-address-bytes: pass:normal[xref:#Address-functionStaticCall-address-bytes-[`++functionStaticCall++`]]
- :functionDelegateCall-address-bytes: pass:normal[xref:#Address-functionDelegateCall-address-bytes-[`++functionDelegateCall++`]]
- :verifyCallResultFromTarget-address-bool-bytes: pass:normal[xref:#Address-verifyCallResultFromTarget-address-bool-bytes-[`++verifyCallResultFromTarget++`]]
- :verifyCallResult-bool-bytes: pass:normal[xref:#Address-verifyCallResult-bool-bytes-[`++verifyCallResult++`]]
- [.contract]
- [[Address]]
- === `++Address++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Address.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Address.sol";
- ```
- Collection of functions related to the address type
- [.contract-index]
- .Functions
- --
- * {xref-Address-sendValue-address-payable-uint256-}[`++sendValue(recipient, amount)++`]
- * {xref-Address-functionCall-address-bytes-}[`++functionCall(target, data)++`]
- * {xref-Address-functionCallWithValue-address-bytes-uint256-}[`++functionCallWithValue(target, data, value)++`]
- * {xref-Address-functionStaticCall-address-bytes-}[`++functionStaticCall(target, data)++`]
- * {xref-Address-functionDelegateCall-address-bytes-}[`++functionDelegateCall(target, data)++`]
- * {xref-Address-verifyCallResultFromTarget-address-bool-bytes-}[`++verifyCallResultFromTarget(target, success, returndata)++`]
- * {xref-Address-verifyCallResult-bool-bytes-}[`++verifyCallResult(success, returndata)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Address-AddressEmptyCode-address-}[`++AddressEmptyCode(target)++`]
- --
- [.contract-item]
- [[Address-sendValue-address-payable-uint256-]]
- ==== `[.contract-item-name]#++sendValue++#++(address payable recipient, uint256 amount)++` [.item-kind]#internal#
- Replacement for Solidity's `transfer`: sends `amount` wei to
- `recipient`, forwarding all available gas and reverting on errors.
- https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
- of certain opcodes, possibly making contracts go over the 2300 gas limit
- imposed by `transfer`, making them unable to receive funds via
- `transfer`. {sendValue} removes this limitation.
- https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
- IMPORTANT: because control is transferred to `recipient`, care must be
- taken to not create reentrancy vulnerabilities. Consider using
- {ReentrancyGuard} or the
- https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
- [.contract-item]
- [[Address-functionCall-address-bytes-]]
- ==== `[.contract-item-name]#++functionCall++#++(address target, bytes data) โ bytes++` [.item-kind]#internal#
- Performs a Solidity function call using a low level `call`. A
- plain `call` is an unsafe replacement for a function call: use this
- function instead.
- If `target` reverts with a revert reason or custom error, it is bubbled
- up by this function (like regular Solidity function calls). However, if
- the call reverted with no returned reason, this function reverts with a
- {Errors.FailedCall} error.
- Returns the raw returned data. To convert to the expected return value,
- use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
- Requirements:
- - `target` must be a contract.
- - calling `target` with `data` must not revert.
- [.contract-item]
- [[Address-functionCallWithValue-address-bytes-uint256-]]
- ==== `[.contract-item-name]#++functionCallWithValue++#++(address target, bytes data, uint256 value) โ bytes++` [.item-kind]#internal#
- Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
- but also transferring `value` wei to `target`.
- Requirements:
- - the calling contract must have an ETH balance of at least `value`.
- - the called Solidity function must be `payable`.
- [.contract-item]
- [[Address-functionStaticCall-address-bytes-]]
- ==== `[.contract-item-name]#++functionStaticCall++#++(address target, bytes data) โ bytes++` [.item-kind]#internal#
- Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
- but performing a static call.
- [.contract-item]
- [[Address-functionDelegateCall-address-bytes-]]
- ==== `[.contract-item-name]#++functionDelegateCall++#++(address target, bytes data) โ bytes++` [.item-kind]#internal#
- Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
- but performing a delegate call.
- [.contract-item]
- [[Address-verifyCallResultFromTarget-address-bool-bytes-]]
- ==== `[.contract-item-name]#++verifyCallResultFromTarget++#++(address target, bool success, bytes returndata) โ bytes++` [.item-kind]#internal#
- Tool to verify that a low level call to smart-contract was successful, and reverts if the target
- was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
- of an unsuccessful call.
- [.contract-item]
- [[Address-verifyCallResult-bool-bytes-]]
- ==== `[.contract-item-name]#++verifyCallResult++#++(bool success, bytes returndata) โ bytes++` [.item-kind]#internal#
- Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
- revert reason or with a default {Errors.FailedCall} error.
- [.contract-item]
- [[Address-AddressEmptyCode-address-]]
- ==== `[.contract-item-name]#++AddressEmptyCode++#++(address target)++` [.item-kind]#error#
- There's no code at `target` (it is not a contract).
- :sort: pass:normal[xref:#Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--[`++sort++`]]
- :sort: pass:normal[xref:#Arrays-sort-uint256---[`++sort++`]]
- :sort: pass:normal[xref:#Arrays-sort-address---function--address-address--pure-returns--bool--[`++sort++`]]
- :sort: pass:normal[xref:#Arrays-sort-address---[`++sort++`]]
- :sort: pass:normal[xref:#Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--[`++sort++`]]
- :sort: pass:normal[xref:#Arrays-sort-bytes32---[`++sort++`]]
- :findUpperBound: pass:normal[xref:#Arrays-findUpperBound-uint256---uint256-[`++findUpperBound++`]]
- :lowerBound: pass:normal[xref:#Arrays-lowerBound-uint256---uint256-[`++lowerBound++`]]
- :upperBound: pass:normal[xref:#Arrays-upperBound-uint256---uint256-[`++upperBound++`]]
- :lowerBoundMemory: pass:normal[xref:#Arrays-lowerBoundMemory-uint256---uint256-[`++lowerBoundMemory++`]]
- :upperBoundMemory: pass:normal[xref:#Arrays-upperBoundMemory-uint256---uint256-[`++upperBoundMemory++`]]
- :unsafeAccess: pass:normal[xref:#Arrays-unsafeAccess-address---uint256-[`++unsafeAccess++`]]
- :unsafeAccess: pass:normal[xref:#Arrays-unsafeAccess-bytes32---uint256-[`++unsafeAccess++`]]
- :unsafeAccess: pass:normal[xref:#Arrays-unsafeAccess-uint256---uint256-[`++unsafeAccess++`]]
- :unsafeAccess: pass:normal[xref:#Arrays-unsafeAccess-bytes---uint256-[`++unsafeAccess++`]]
- :unsafeAccess: pass:normal[xref:#Arrays-unsafeAccess-string---uint256-[`++unsafeAccess++`]]
- :unsafeMemoryAccess: pass:normal[xref:#Arrays-unsafeMemoryAccess-address---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess: pass:normal[xref:#Arrays-unsafeMemoryAccess-bytes32---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess: pass:normal[xref:#Arrays-unsafeMemoryAccess-uint256---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess: pass:normal[xref:#Arrays-unsafeMemoryAccess-bytes---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess: pass:normal[xref:#Arrays-unsafeMemoryAccess-string---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeSetLength: pass:normal[xref:#Arrays-unsafeSetLength-address---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength: pass:normal[xref:#Arrays-unsafeSetLength-bytes32---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength: pass:normal[xref:#Arrays-unsafeSetLength-uint256---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength: pass:normal[xref:#Arrays-unsafeSetLength-bytes---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength: pass:normal[xref:#Arrays-unsafeSetLength-string---uint256-[`++unsafeSetLength++`]]
- :sort-uint256---function--uint256-uint256--pure-returns--bool-: pass:normal[xref:#Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--[`++sort++`]]
- :sort-uint256--: pass:normal[xref:#Arrays-sort-uint256---[`++sort++`]]
- :sort-address---function--address-address--pure-returns--bool-: pass:normal[xref:#Arrays-sort-address---function--address-address--pure-returns--bool--[`++sort++`]]
- :sort-address--: pass:normal[xref:#Arrays-sort-address---[`++sort++`]]
- :sort-bytes32---function--bytes32-bytes32--pure-returns--bool-: pass:normal[xref:#Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--[`++sort++`]]
- :sort-bytes32--: pass:normal[xref:#Arrays-sort-bytes32---[`++sort++`]]
- :findUpperBound-uint256---uint256: pass:normal[xref:#Arrays-findUpperBound-uint256---uint256-[`++findUpperBound++`]]
- :lowerBound-uint256---uint256: pass:normal[xref:#Arrays-lowerBound-uint256---uint256-[`++lowerBound++`]]
- :upperBound-uint256---uint256: pass:normal[xref:#Arrays-upperBound-uint256---uint256-[`++upperBound++`]]
- :lowerBoundMemory-uint256---uint256: pass:normal[xref:#Arrays-lowerBoundMemory-uint256---uint256-[`++lowerBoundMemory++`]]
- :upperBoundMemory-uint256---uint256: pass:normal[xref:#Arrays-upperBoundMemory-uint256---uint256-[`++upperBoundMemory++`]]
- :unsafeAccess-address---uint256: pass:normal[xref:#Arrays-unsafeAccess-address---uint256-[`++unsafeAccess++`]]
- :unsafeAccess-bytes32---uint256: pass:normal[xref:#Arrays-unsafeAccess-bytes32---uint256-[`++unsafeAccess++`]]
- :unsafeAccess-uint256---uint256: pass:normal[xref:#Arrays-unsafeAccess-uint256---uint256-[`++unsafeAccess++`]]
- :unsafeAccess-bytes---uint256: pass:normal[xref:#Arrays-unsafeAccess-bytes---uint256-[`++unsafeAccess++`]]
- :unsafeAccess-string---uint256: pass:normal[xref:#Arrays-unsafeAccess-string---uint256-[`++unsafeAccess++`]]
- :unsafeMemoryAccess-address---uint256: pass:normal[xref:#Arrays-unsafeMemoryAccess-address---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess-bytes32---uint256: pass:normal[xref:#Arrays-unsafeMemoryAccess-bytes32---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess-uint256---uint256: pass:normal[xref:#Arrays-unsafeMemoryAccess-uint256---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess-bytes---uint256: pass:normal[xref:#Arrays-unsafeMemoryAccess-bytes---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeMemoryAccess-string---uint256: pass:normal[xref:#Arrays-unsafeMemoryAccess-string---uint256-[`++unsafeMemoryAccess++`]]
- :unsafeSetLength-address---uint256: pass:normal[xref:#Arrays-unsafeSetLength-address---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength-bytes32---uint256: pass:normal[xref:#Arrays-unsafeSetLength-bytes32---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength-uint256---uint256: pass:normal[xref:#Arrays-unsafeSetLength-uint256---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength-bytes---uint256: pass:normal[xref:#Arrays-unsafeSetLength-bytes---uint256-[`++unsafeSetLength++`]]
- :unsafeSetLength-string---uint256: pass:normal[xref:#Arrays-unsafeSetLength-string---uint256-[`++unsafeSetLength++`]]
- [.contract]
- [[Arrays]]
- === `++Arrays++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Arrays.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Arrays.sol";
- ```
- Collection of functions related to array types.
- [.contract-index]
- .Functions
- --
- * {xref-Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--}[`++sort(array, comp)++`]
- * {xref-Arrays-sort-uint256---}[`++sort(array)++`]
- * {xref-Arrays-sort-address---function--address-address--pure-returns--bool--}[`++sort(array, comp)++`]
- * {xref-Arrays-sort-address---}[`++sort(array)++`]
- * {xref-Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--}[`++sort(array, comp)++`]
- * {xref-Arrays-sort-bytes32---}[`++sort(array)++`]
- * {xref-Arrays-findUpperBound-uint256---uint256-}[`++findUpperBound(array, element)++`]
- * {xref-Arrays-lowerBound-uint256---uint256-}[`++lowerBound(array, element)++`]
- * {xref-Arrays-upperBound-uint256---uint256-}[`++upperBound(array, element)++`]
- * {xref-Arrays-lowerBoundMemory-uint256---uint256-}[`++lowerBoundMemory(array, element)++`]
- * {xref-Arrays-upperBoundMemory-uint256---uint256-}[`++upperBoundMemory(array, element)++`]
- * {xref-Arrays-unsafeAccess-address---uint256-}[`++unsafeAccess(arr, pos)++`]
- * {xref-Arrays-unsafeAccess-bytes32---uint256-}[`++unsafeAccess(arr, pos)++`]
- * {xref-Arrays-unsafeAccess-uint256---uint256-}[`++unsafeAccess(arr, pos)++`]
- * {xref-Arrays-unsafeAccess-bytes---uint256-}[`++unsafeAccess(arr, pos)++`]
- * {xref-Arrays-unsafeAccess-string---uint256-}[`++unsafeAccess(arr, pos)++`]
- * {xref-Arrays-unsafeMemoryAccess-address---uint256-}[`++unsafeMemoryAccess(arr, pos)++`]
- * {xref-Arrays-unsafeMemoryAccess-bytes32---uint256-}[`++unsafeMemoryAccess(arr, pos)++`]
- * {xref-Arrays-unsafeMemoryAccess-uint256---uint256-}[`++unsafeMemoryAccess(arr, pos)++`]
- * {xref-Arrays-unsafeMemoryAccess-bytes---uint256-}[`++unsafeMemoryAccess(arr, pos)++`]
- * {xref-Arrays-unsafeMemoryAccess-string---uint256-}[`++unsafeMemoryAccess(arr, pos)++`]
- * {xref-Arrays-unsafeSetLength-address---uint256-}[`++unsafeSetLength(array, len)++`]
- * {xref-Arrays-unsafeSetLength-bytes32---uint256-}[`++unsafeSetLength(array, len)++`]
- * {xref-Arrays-unsafeSetLength-uint256---uint256-}[`++unsafeSetLength(array, len)++`]
- * {xref-Arrays-unsafeSetLength-bytes---uint256-}[`++unsafeSetLength(array, len)++`]
- * {xref-Arrays-unsafeSetLength-string---uint256-}[`++unsafeSetLength(array, len)++`]
- --
- [.contract-item]
- [[Arrays-sort-uint256---function--uint256-uint256--pure-returns--bool--]]
- ==== `[.contract-item-name]#++sort++#++(uint256[] array, function (uint256,uint256) pure returns (bool) comp) โ uint256[]++` [.item-kind]#internal#
- Sort an array of uint256 (in memory) following the provided comparator function.
- This function does the sorting "in place", meaning that it overrides the input. The object is returned for
- convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array.
- NOTE: this function's cost is `O(n ยท log(n))` in average and `O(nยฒ)` in the worst case, with n the length of the
- array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful
- when executing this as part of a transaction. If the array being sorted is too large, the sort operation may
- consume more gas than is available in a block, leading to potential DoS.
- IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way.
- [.contract-item]
- [[Arrays-sort-uint256---]]
- ==== `[.contract-item-name]#++sort++#++(uint256[] array) โ uint256[]++` [.item-kind]#internal#
- Variant of {sort} that sorts an array of uint256 in increasing order.
- [.contract-item]
- [[Arrays-sort-address---function--address-address--pure-returns--bool--]]
- ==== `[.contract-item-name]#++sort++#++(address[] array, function (address,address) pure returns (bool) comp) โ address[]++` [.item-kind]#internal#
- Sort an array of address (in memory) following the provided comparator function.
- This function does the sorting "in place", meaning that it overrides the input. The object is returned for
- convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array.
- NOTE: this function's cost is `O(n ยท log(n))` in average and `O(nยฒ)` in the worst case, with n the length of the
- array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful
- when executing this as part of a transaction. If the array being sorted is too large, the sort operation may
- consume more gas than is available in a block, leading to potential DoS.
- IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way.
- [.contract-item]
- [[Arrays-sort-address---]]
- ==== `[.contract-item-name]#++sort++#++(address[] array) โ address[]++` [.item-kind]#internal#
- Variant of {sort} that sorts an array of address in increasing order.
- [.contract-item]
- [[Arrays-sort-bytes32---function--bytes32-bytes32--pure-returns--bool--]]
- ==== `[.contract-item-name]#++sort++#++(bytes32[] array, function (bytes32,bytes32) pure returns (bool) comp) โ bytes32[]++` [.item-kind]#internal#
- Sort an array of bytes32 (in memory) following the provided comparator function.
- This function does the sorting "in place", meaning that it overrides the input. The object is returned for
- convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array.
- NOTE: this function's cost is `O(n ยท log(n))` in average and `O(nยฒ)` in the worst case, with n the length of the
- array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful
- when executing this as part of a transaction. If the array being sorted is too large, the sort operation may
- consume more gas than is available in a block, leading to potential DoS.
- IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way.
- [.contract-item]
- [[Arrays-sort-bytes32---]]
- ==== `[.contract-item-name]#++sort++#++(bytes32[] array) โ bytes32[]++` [.item-kind]#internal#
- Variant of {sort} that sorts an array of bytes32 in increasing order.
- [.contract-item]
- [[Arrays-findUpperBound-uint256---uint256-]]
- ==== `[.contract-item-name]#++findUpperBound++#++(uint256[] array, uint256 element) โ uint256++` [.item-kind]#internal#
- Searches a sorted `array` and returns the first index that contains
- a value greater or equal to `element`. If no such index exists (i.e. all
- values in the array are strictly less than `element`), the array length is
- returned. Time complexity O(log n).
- NOTE: The `array` is expected to be sorted in ascending order, and to
- contain no repeated elements.
- IMPORTANT: Deprecated. This implementation behaves as {lowerBound} but lacks
- support for repeated elements in the array. The {lowerBound} function should
- be used instead.
- [.contract-item]
- [[Arrays-lowerBound-uint256---uint256-]]
- ==== `[.contract-item-name]#++lowerBound++#++(uint256[] array, uint256 element) โ uint256++` [.item-kind]#internal#
- Searches an `array` sorted in ascending order and returns the first
- index that contains a value greater or equal than `element`. If no such index
- exists (i.e. all values in the array are strictly less than `element`), the array
- length is returned. Time complexity O(log n).
- See C++'s https://en.cppreference.com/w/cpp/algorithm/lower_bound[lower_bound].
- [.contract-item]
- [[Arrays-upperBound-uint256---uint256-]]
- ==== `[.contract-item-name]#++upperBound++#++(uint256[] array, uint256 element) โ uint256++` [.item-kind]#internal#
- Searches an `array` sorted in ascending order and returns the first
- index that contains a value strictly greater than `element`. If no such index
- exists (i.e. all values in the array are strictly less than `element`), the array
- length is returned. Time complexity O(log n).
- See C++'s https://en.cppreference.com/w/cpp/algorithm/upper_bound[upper_bound].
- [.contract-item]
- [[Arrays-lowerBoundMemory-uint256---uint256-]]
- ==== `[.contract-item-name]#++lowerBoundMemory++#++(uint256[] array, uint256 element) โ uint256++` [.item-kind]#internal#
- Same as {lowerBound}, but with an array in memory.
- [.contract-item]
- [[Arrays-upperBoundMemory-uint256---uint256-]]
- ==== `[.contract-item-name]#++upperBoundMemory++#++(uint256[] array, uint256 element) โ uint256++` [.item-kind]#internal#
- Same as {upperBound}, but with an array in memory.
- [.contract-item]
- [[Arrays-unsafeAccess-address---uint256-]]
- ==== `[.contract-item-name]#++unsafeAccess++#++(address[] arr, uint256 pos) โ struct StorageSlot.AddressSlot++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeAccess-bytes32---uint256-]]
- ==== `[.contract-item-name]#++unsafeAccess++#++(bytes32[] arr, uint256 pos) โ struct StorageSlot.Bytes32Slot++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeAccess-uint256---uint256-]]
- ==== `[.contract-item-name]#++unsafeAccess++#++(uint256[] arr, uint256 pos) โ struct StorageSlot.Uint256Slot++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeAccess-bytes---uint256-]]
- ==== `[.contract-item-name]#++unsafeAccess++#++(bytes[] arr, uint256 pos) โ struct StorageSlot.BytesSlot++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeAccess-string---uint256-]]
- ==== `[.contract-item-name]#++unsafeAccess++#++(string[] arr, uint256 pos) โ struct StorageSlot.StringSlot++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeMemoryAccess-address---uint256-]]
- ==== `[.contract-item-name]#++unsafeMemoryAccess++#++(address[] arr, uint256 pos) โ address res++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeMemoryAccess-bytes32---uint256-]]
- ==== `[.contract-item-name]#++unsafeMemoryAccess++#++(bytes32[] arr, uint256 pos) โ bytes32 res++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeMemoryAccess-uint256---uint256-]]
- ==== `[.contract-item-name]#++unsafeMemoryAccess++#++(uint256[] arr, uint256 pos) โ uint256 res++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeMemoryAccess-bytes---uint256-]]
- ==== `[.contract-item-name]#++unsafeMemoryAccess++#++(bytes[] arr, uint256 pos) โ bytes res++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeMemoryAccess-string---uint256-]]
- ==== `[.contract-item-name]#++unsafeMemoryAccess++#++(string[] arr, uint256 pos) โ string res++` [.item-kind]#internal#
- Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
- WARNING: Only use if you are certain `pos` is lower than the array length.
- [.contract-item]
- [[Arrays-unsafeSetLength-address---uint256-]]
- ==== `[.contract-item-name]#++unsafeSetLength++#++(address[] array, uint256 len)++` [.item-kind]#internal#
- Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
- WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
- [.contract-item]
- [[Arrays-unsafeSetLength-bytes32---uint256-]]
- ==== `[.contract-item-name]#++unsafeSetLength++#++(bytes32[] array, uint256 len)++` [.item-kind]#internal#
- Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
- WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
- [.contract-item]
- [[Arrays-unsafeSetLength-uint256---uint256-]]
- ==== `[.contract-item-name]#++unsafeSetLength++#++(uint256[] array, uint256 len)++` [.item-kind]#internal#
- Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
- WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
- [.contract-item]
- [[Arrays-unsafeSetLength-bytes---uint256-]]
- ==== `[.contract-item-name]#++unsafeSetLength++#++(bytes[] array, uint256 len)++` [.item-kind]#internal#
- Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
- WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
- [.contract-item]
- [[Arrays-unsafeSetLength-string---uint256-]]
- ==== `[.contract-item-name]#++unsafeSetLength++#++(string[] array, uint256 len)++` [.item-kind]#internal#
- Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
- WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
- :_TABLE: pass:normal[xref:#Base64-_TABLE-string[`++_TABLE++`]]
- :_TABLE_URL: pass:normal[xref:#Base64-_TABLE_URL-string[`++_TABLE_URL++`]]
- :encode: pass:normal[xref:#Base64-encode-bytes-[`++encode++`]]
- :encodeURL: pass:normal[xref:#Base64-encodeURL-bytes-[`++encodeURL++`]]
- :encode-bytes: pass:normal[xref:#Base64-encode-bytes-[`++encode++`]]
- :encodeURL-bytes: pass:normal[xref:#Base64-encodeURL-bytes-[`++encodeURL++`]]
- [.contract]
- [[Base64]]
- === `++Base64++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Base64.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Base64.sol";
- ```
- Provides a set of functions to operate with Base64 strings.
- [.contract-index]
- .Functions
- --
- * {xref-Base64-encode-bytes-}[`++encode(data)++`]
- * {xref-Base64-encodeURL-bytes-}[`++encodeURL(data)++`]
- --
- [.contract-index]
- .Internal Variables
- --
- * {xref-Base64-_TABLE-string}[`++string constant _TABLE++`]
- * {xref-Base64-_TABLE_URL-string}[`++string constant _TABLE_URL++`]
- --
- [.contract-item]
- [[Base64-encode-bytes-]]
- ==== `[.contract-item-name]#++encode++#++(bytes data) โ string++` [.item-kind]#internal#
- Converts a `bytes` to its Bytes64 `string` representation.
- [.contract-item]
- [[Base64-encodeURL-bytes-]]
- ==== `[.contract-item-name]#++encodeURL++#++(bytes data) โ string++` [.item-kind]#internal#
- Converts a `bytes` to its Bytes64Url `string` representation.
- Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].
- [.contract-item]
- [[Base64-_TABLE-string]]
- ==== `string [.contract-item-name]#++_TABLE++#` [.item-kind]#internal constant#
- Base64 Encoding/Decoding Table
- See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648
- [.contract-item]
- [[Base64-_TABLE_URL-string]]
- ==== `string [.contract-item-name]#++_TABLE_URL++#` [.item-kind]#internal constant#
- :indexOf: pass:normal[xref:#Bytes-indexOf-bytes-bytes1-[`++indexOf++`]]
- :indexOf: pass:normal[xref:#Bytes-indexOf-bytes-bytes1-uint256-[`++indexOf++`]]
- :lastIndexOf: pass:normal[xref:#Bytes-lastIndexOf-bytes-bytes1-[`++lastIndexOf++`]]
- :lastIndexOf: pass:normal[xref:#Bytes-lastIndexOf-bytes-bytes1-uint256-[`++lastIndexOf++`]]
- :slice: pass:normal[xref:#Bytes-slice-bytes-uint256-[`++slice++`]]
- :slice: pass:normal[xref:#Bytes-slice-bytes-uint256-uint256-[`++slice++`]]
- :indexOf-bytes-bytes1: pass:normal[xref:#Bytes-indexOf-bytes-bytes1-[`++indexOf++`]]
- :indexOf-bytes-bytes1-uint256: pass:normal[xref:#Bytes-indexOf-bytes-bytes1-uint256-[`++indexOf++`]]
- :lastIndexOf-bytes-bytes1: pass:normal[xref:#Bytes-lastIndexOf-bytes-bytes1-[`++lastIndexOf++`]]
- :lastIndexOf-bytes-bytes1-uint256: pass:normal[xref:#Bytes-lastIndexOf-bytes-bytes1-uint256-[`++lastIndexOf++`]]
- :slice-bytes-uint256: pass:normal[xref:#Bytes-slice-bytes-uint256-[`++slice++`]]
- :slice-bytes-uint256-uint256: pass:normal[xref:#Bytes-slice-bytes-uint256-uint256-[`++slice++`]]
- [.contract]
- [[Bytes]]
- === `++Bytes++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Bytes.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Bytes.sol";
- ```
- Bytes operations.
- [.contract-index]
- .Functions
- --
- * {xref-Bytes-indexOf-bytes-bytes1-}[`++indexOf(buffer, s)++`]
- * {xref-Bytes-indexOf-bytes-bytes1-uint256-}[`++indexOf(buffer, s, pos)++`]
- * {xref-Bytes-lastIndexOf-bytes-bytes1-}[`++lastIndexOf(buffer, s)++`]
- * {xref-Bytes-lastIndexOf-bytes-bytes1-uint256-}[`++lastIndexOf(buffer, s, pos)++`]
- * {xref-Bytes-slice-bytes-uint256-}[`++slice(buffer, start)++`]
- * {xref-Bytes-slice-bytes-uint256-uint256-}[`++slice(buffer, start, end)++`]
- --
- [.contract-item]
- [[Bytes-indexOf-bytes-bytes1-]]
- ==== `[.contract-item-name]#++indexOf++#++(bytes buffer, bytes1 s) โ uint256++` [.item-kind]#internal#
- Forward search for `s` in `buffer`
- * If `s` is present in the buffer, returns the index of the first instance
- * If `s` is not present in the buffer, returns type(uint256).max
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]
- [.contract-item]
- [[Bytes-indexOf-bytes-bytes1-uint256-]]
- ==== `[.contract-item-name]#++indexOf++#++(bytes buffer, bytes1 s, uint256 pos) โ uint256++` [.item-kind]#internal#
- Forward search for `s` in `buffer` starting at position `pos`
- * If `s` is present in the buffer (at or after `pos`), returns the index of the next instance
- * If `s` is not present in the buffer (at or after `pos`), returns type(uint256).max
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]
- [.contract-item]
- [[Bytes-lastIndexOf-bytes-bytes1-]]
- ==== `[.contract-item-name]#++lastIndexOf++#++(bytes buffer, bytes1 s) โ uint256++` [.item-kind]#internal#
- Backward search for `s` in `buffer`
- * If `s` is present in the buffer, returns the index of the last instance
- * If `s` is not present in the buffer, returns type(uint256).max
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]
- [.contract-item]
- [[Bytes-lastIndexOf-bytes-bytes1-uint256-]]
- ==== `[.contract-item-name]#++lastIndexOf++#++(bytes buffer, bytes1 s, uint256 pos) โ uint256++` [.item-kind]#internal#
- Backward search for `s` in `buffer` starting at position `pos`
- * If `s` is present in the buffer (at or before `pos`), returns the index of the previous instance
- * If `s` is not present in the buffer (at or before `pos`), returns type(uint256).max
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]
- [.contract-item]
- [[Bytes-slice-bytes-uint256-]]
- ==== `[.contract-item-name]#++slice++#++(bytes buffer, uint256 start) โ bytes++` [.item-kind]#internal#
- Copies the content of `buffer`, from `start` (included) to the end of `buffer` into a new bytes object in
- memory.
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]
- [.contract-item]
- [[Bytes-slice-bytes-uint256-uint256-]]
- ==== `[.contract-item-name]#++slice++#++(bytes buffer, uint256 start, uint256 end) โ bytes++` [.item-kind]#internal#
- Copies the content of `buffer`, from `start` (included) to `end` (excluded) into a new bytes object in
- memory.
- NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]
- :emptyBytes: pass:normal[xref:#Calldata-emptyBytes--[`++emptyBytes++`]]
- :emptyString: pass:normal[xref:#Calldata-emptyString--[`++emptyString++`]]
- :emptyBytes-: pass:normal[xref:#Calldata-emptyBytes--[`++emptyBytes++`]]
- :emptyString-: pass:normal[xref:#Calldata-emptyString--[`++emptyString++`]]
- [.contract]
- [[Calldata]]
- === `++Calldata++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Calldata.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Calldata.sol";
- ```
- Helper library for manipulating objects in calldata.
- [.contract-index]
- .Functions
- --
- * {xref-Calldata-emptyBytes--}[`++emptyBytes()++`]
- * {xref-Calldata-emptyString--}[`++emptyString()++`]
- --
- [.contract-item]
- [[Calldata-emptyBytes--]]
- ==== `[.contract-item-name]#++emptyBytes++#++() โ bytes result++` [.item-kind]#internal#
- [.contract-item]
- [[Calldata-emptyString--]]
- ==== `[.contract-item-name]#++emptyString++#++() โ string result++` [.item-kind]#internal#
- :StringsInsufficientHexLength: pass:normal[xref:#Strings-StringsInsufficientHexLength-uint256-uint256-[`++StringsInsufficientHexLength++`]]
- :StringsInvalidChar: pass:normal[xref:#Strings-StringsInvalidChar--[`++StringsInvalidChar++`]]
- :StringsInvalidAddressFormat: pass:normal[xref:#Strings-StringsInvalidAddressFormat--[`++StringsInvalidAddressFormat++`]]
- :toString: pass:normal[xref:#Strings-toString-uint256-[`++toString++`]]
- :toStringSigned: pass:normal[xref:#Strings-toStringSigned-int256-[`++toStringSigned++`]]
- :toHexString: pass:normal[xref:#Strings-toHexString-uint256-[`++toHexString++`]]
- :toHexString: pass:normal[xref:#Strings-toHexString-uint256-uint256-[`++toHexString++`]]
- :toHexString: pass:normal[xref:#Strings-toHexString-address-[`++toHexString++`]]
- :toChecksumHexString: pass:normal[xref:#Strings-toChecksumHexString-address-[`++toChecksumHexString++`]]
- :equal: pass:normal[xref:#Strings-equal-string-string-[`++equal++`]]
- :parseUint: pass:normal[xref:#Strings-parseUint-string-[`++parseUint++`]]
- :parseUint: pass:normal[xref:#Strings-parseUint-string-uint256-uint256-[`++parseUint++`]]
- :tryParseUint: pass:normal[xref:#Strings-tryParseUint-string-[`++tryParseUint++`]]
- :tryParseUint: pass:normal[xref:#Strings-tryParseUint-string-uint256-uint256-[`++tryParseUint++`]]
- :parseInt: pass:normal[xref:#Strings-parseInt-string-[`++parseInt++`]]
- :parseInt: pass:normal[xref:#Strings-parseInt-string-uint256-uint256-[`++parseInt++`]]
- :tryParseInt: pass:normal[xref:#Strings-tryParseInt-string-[`++tryParseInt++`]]
- :tryParseInt: pass:normal[xref:#Strings-tryParseInt-string-uint256-uint256-[`++tryParseInt++`]]
- :parseHexUint: pass:normal[xref:#Strings-parseHexUint-string-[`++parseHexUint++`]]
- :parseHexUint: pass:normal[xref:#Strings-parseHexUint-string-uint256-uint256-[`++parseHexUint++`]]
- :tryParseHexUint: pass:normal[xref:#Strings-tryParseHexUint-string-[`++tryParseHexUint++`]]
- :tryParseHexUint: pass:normal[xref:#Strings-tryParseHexUint-string-uint256-uint256-[`++tryParseHexUint++`]]
- :parseAddress: pass:normal[xref:#Strings-parseAddress-string-[`++parseAddress++`]]
- :parseAddress: pass:normal[xref:#Strings-parseAddress-string-uint256-uint256-[`++parseAddress++`]]
- :tryParseAddress: pass:normal[xref:#Strings-tryParseAddress-string-[`++tryParseAddress++`]]
- :tryParseAddress: pass:normal[xref:#Strings-tryParseAddress-string-uint256-uint256-[`++tryParseAddress++`]]
- :escapeJSON: pass:normal[xref:#Strings-escapeJSON-string-[`++escapeJSON++`]]
- :toString-uint256: pass:normal[xref:#Strings-toString-uint256-[`++toString++`]]
- :toStringSigned-int256: pass:normal[xref:#Strings-toStringSigned-int256-[`++toStringSigned++`]]
- :toHexString-uint256: pass:normal[xref:#Strings-toHexString-uint256-[`++toHexString++`]]
- :toHexString-uint256-uint256: pass:normal[xref:#Strings-toHexString-uint256-uint256-[`++toHexString++`]]
- :toHexString-address: pass:normal[xref:#Strings-toHexString-address-[`++toHexString++`]]
- :toChecksumHexString-address: pass:normal[xref:#Strings-toChecksumHexString-address-[`++toChecksumHexString++`]]
- :equal-string-string: pass:normal[xref:#Strings-equal-string-string-[`++equal++`]]
- :parseUint-string: pass:normal[xref:#Strings-parseUint-string-[`++parseUint++`]]
- :parseUint-string-uint256-uint256: pass:normal[xref:#Strings-parseUint-string-uint256-uint256-[`++parseUint++`]]
- :tryParseUint-string: pass:normal[xref:#Strings-tryParseUint-string-[`++tryParseUint++`]]
- :tryParseUint-string-uint256-uint256: pass:normal[xref:#Strings-tryParseUint-string-uint256-uint256-[`++tryParseUint++`]]
- :parseInt-string: pass:normal[xref:#Strings-parseInt-string-[`++parseInt++`]]
- :parseInt-string-uint256-uint256: pass:normal[xref:#Strings-parseInt-string-uint256-uint256-[`++parseInt++`]]
- :tryParseInt-string: pass:normal[xref:#Strings-tryParseInt-string-[`++tryParseInt++`]]
- :tryParseInt-string-uint256-uint256: pass:normal[xref:#Strings-tryParseInt-string-uint256-uint256-[`++tryParseInt++`]]
- :parseHexUint-string: pass:normal[xref:#Strings-parseHexUint-string-[`++parseHexUint++`]]
- :parseHexUint-string-uint256-uint256: pass:normal[xref:#Strings-parseHexUint-string-uint256-uint256-[`++parseHexUint++`]]
- :tryParseHexUint-string: pass:normal[xref:#Strings-tryParseHexUint-string-[`++tryParseHexUint++`]]
- :tryParseHexUint-string-uint256-uint256: pass:normal[xref:#Strings-tryParseHexUint-string-uint256-uint256-[`++tryParseHexUint++`]]
- :parseAddress-string: pass:normal[xref:#Strings-parseAddress-string-[`++parseAddress++`]]
- :parseAddress-string-uint256-uint256: pass:normal[xref:#Strings-parseAddress-string-uint256-uint256-[`++parseAddress++`]]
- :tryParseAddress-string: pass:normal[xref:#Strings-tryParseAddress-string-[`++tryParseAddress++`]]
- :tryParseAddress-string-uint256-uint256: pass:normal[xref:#Strings-tryParseAddress-string-uint256-uint256-[`++tryParseAddress++`]]
- :escapeJSON-string: pass:normal[xref:#Strings-escapeJSON-string-[`++escapeJSON++`]]
- [.contract]
- [[Strings]]
- === `++Strings++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Strings.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Strings.sol";
- ```
- String operations.
- [.contract-index]
- .Functions
- --
- * {xref-Strings-toString-uint256-}[`++toString(value)++`]
- * {xref-Strings-toStringSigned-int256-}[`++toStringSigned(value)++`]
- * {xref-Strings-toHexString-uint256-}[`++toHexString(value)++`]
- * {xref-Strings-toHexString-uint256-uint256-}[`++toHexString(value, length)++`]
- * {xref-Strings-toHexString-address-}[`++toHexString(addr)++`]
- * {xref-Strings-toChecksumHexString-address-}[`++toChecksumHexString(addr)++`]
- * {xref-Strings-equal-string-string-}[`++equal(a, b)++`]
- * {xref-Strings-parseUint-string-}[`++parseUint(input)++`]
- * {xref-Strings-parseUint-string-uint256-uint256-}[`++parseUint(input, begin, end)++`]
- * {xref-Strings-tryParseUint-string-}[`++tryParseUint(input)++`]
- * {xref-Strings-tryParseUint-string-uint256-uint256-}[`++tryParseUint(input, begin, end)++`]
- * {xref-Strings-parseInt-string-}[`++parseInt(input)++`]
- * {xref-Strings-parseInt-string-uint256-uint256-}[`++parseInt(input, begin, end)++`]
- * {xref-Strings-tryParseInt-string-}[`++tryParseInt(input)++`]
- * {xref-Strings-tryParseInt-string-uint256-uint256-}[`++tryParseInt(input, begin, end)++`]
- * {xref-Strings-parseHexUint-string-}[`++parseHexUint(input)++`]
- * {xref-Strings-parseHexUint-string-uint256-uint256-}[`++parseHexUint(input, begin, end)++`]
- * {xref-Strings-tryParseHexUint-string-}[`++tryParseHexUint(input)++`]
- * {xref-Strings-tryParseHexUint-string-uint256-uint256-}[`++tryParseHexUint(input, begin, end)++`]
- * {xref-Strings-parseAddress-string-}[`++parseAddress(input)++`]
- * {xref-Strings-parseAddress-string-uint256-uint256-}[`++parseAddress(input, begin, end)++`]
- * {xref-Strings-tryParseAddress-string-}[`++tryParseAddress(input)++`]
- * {xref-Strings-tryParseAddress-string-uint256-uint256-}[`++tryParseAddress(input, begin, end)++`]
- * {xref-Strings-escapeJSON-string-}[`++escapeJSON(input)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Strings-StringsInsufficientHexLength-uint256-uint256-}[`++StringsInsufficientHexLength(value, length)++`]
- * {xref-Strings-StringsInvalidChar--}[`++StringsInvalidChar()++`]
- * {xref-Strings-StringsInvalidAddressFormat--}[`++StringsInvalidAddressFormat()++`]
- --
- [.contract-item]
- [[Strings-toString-uint256-]]
- ==== `[.contract-item-name]#++toString++#++(uint256 value) โ string++` [.item-kind]#internal#
- Converts a `uint256` to its ASCII `string` decimal representation.
- [.contract-item]
- [[Strings-toStringSigned-int256-]]
- ==== `[.contract-item-name]#++toStringSigned++#++(int256 value) โ string++` [.item-kind]#internal#
- Converts a `int256` to its ASCII `string` decimal representation.
- [.contract-item]
- [[Strings-toHexString-uint256-]]
- ==== `[.contract-item-name]#++toHexString++#++(uint256 value) โ string++` [.item-kind]#internal#
- Converts a `uint256` to its ASCII `string` hexadecimal representation.
- [.contract-item]
- [[Strings-toHexString-uint256-uint256-]]
- ==== `[.contract-item-name]#++toHexString++#++(uint256 value, uint256 length) โ string++` [.item-kind]#internal#
- Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
- [.contract-item]
- [[Strings-toHexString-address-]]
- ==== `[.contract-item-name]#++toHexString++#++(address addr) โ string++` [.item-kind]#internal#
- Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
- representation.
- [.contract-item]
- [[Strings-toChecksumHexString-address-]]
- ==== `[.contract-item-name]#++toChecksumHexString++#++(address addr) โ string++` [.item-kind]#internal#
- Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal
- representation, according to EIP-55.
- [.contract-item]
- [[Strings-equal-string-string-]]
- ==== `[.contract-item-name]#++equal++#++(string a, string b) โ bool++` [.item-kind]#internal#
- Returns true if the two strings are equal.
- [.contract-item]
- [[Strings-parseUint-string-]]
- ==== `[.contract-item-name]#++parseUint++#++(string input) โ uint256++` [.item-kind]#internal#
- Parse a decimal string and returns the value as a `uint256`.
- Requirements:
- - The string must be formatted as `[0-9]*`
- - The result must fit into an `uint256` type
- [.contract-item]
- [[Strings-parseUint-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++parseUint++#++(string input, uint256 begin, uint256 end) โ uint256++` [.item-kind]#internal#
- Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and
- `end` (excluded).
- Requirements:
- - The substring must be formatted as `[0-9]*`
- - The result must fit into an `uint256` type
- [.contract-item]
- [[Strings-tryParseUint-string-]]
- ==== `[.contract-item-name]#++tryParseUint++#++(string input) โ bool success, uint256 value++` [.item-kind]#internal#
- Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.
- NOTE: This function will revert if the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-tryParseUint-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryParseUint++#++(string input, uint256 begin, uint256 end) โ bool success, uint256 value++` [.item-kind]#internal#
- Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid
- character.
- NOTE: This function will revert if the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-parseInt-string-]]
- ==== `[.contract-item-name]#++parseInt++#++(string input) โ int256++` [.item-kind]#internal#
- Parse a decimal string and returns the value as a `int256`.
- Requirements:
- - The string must be formatted as `[-+]?[0-9]*`
- - The result must fit in an `int256` type.
- [.contract-item]
- [[Strings-parseInt-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++parseInt++#++(string input, uint256 begin, uint256 end) โ int256++` [.item-kind]#internal#
- Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and
- `end` (excluded).
- Requirements:
- - The substring must be formatted as `[-+]?[0-9]*`
- - The result must fit in an `int256` type.
- [.contract-item]
- [[Strings-tryParseInt-string-]]
- ==== `[.contract-item-name]#++tryParseInt++#++(string input) โ bool success, int256 value++` [.item-kind]#internal#
- Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if
- the result does not fit in a `int256`.
- NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-tryParseInt-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryParseInt++#++(string input, uint256 begin, uint256 end) โ bool success, int256 value++` [.item-kind]#internal#
- Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid
- character or if the result does not fit in a `int256`.
- NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-parseHexUint-string-]]
- ==== `[.contract-item-name]#++parseHexUint++#++(string input) โ uint256++` [.item-kind]#internal#
- Parse a hexadecimal string (with or without "0x" prefix), and returns the value as a `uint256`.
- Requirements:
- - The string must be formatted as `(0x)?[0-9a-fA-F]*`
- - The result must fit in an `uint256` type.
- [.contract-item]
- [[Strings-parseHexUint-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++parseHexUint++#++(string input, uint256 begin, uint256 end) โ uint256++` [.item-kind]#internal#
- Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and
- `end` (excluded).
- Requirements:
- - The substring must be formatted as `(0x)?[0-9a-fA-F]*`
- - The result must fit in an `uint256` type.
- [.contract-item]
- [[Strings-tryParseHexUint-string-]]
- ==== `[.contract-item-name]#++tryParseHexUint++#++(string input) โ bool success, uint256 value++` [.item-kind]#internal#
- Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.
- NOTE: This function will revert if the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-tryParseHexUint-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryParseHexUint++#++(string input, uint256 begin, uint256 end) โ bool success, uint256 value++` [.item-kind]#internal#
- Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an
- invalid character.
- NOTE: This function will revert if the result does not fit in a `uint256`.
- [.contract-item]
- [[Strings-parseAddress-string-]]
- ==== `[.contract-item-name]#++parseAddress++#++(string input) โ address++` [.item-kind]#internal#
- Parse a hexadecimal string (with or without "0x" prefix), and returns the value as an `address`.
- Requirements:
- - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`
- [.contract-item]
- [[Strings-parseAddress-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++parseAddress++#++(string input, uint256 begin, uint256 end) โ address++` [.item-kind]#internal#
- Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and
- `end` (excluded).
- Requirements:
- - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`
- [.contract-item]
- [[Strings-tryParseAddress-string-]]
- ==== `[.contract-item-name]#++tryParseAddress++#++(string input) โ bool success, address value++` [.item-kind]#internal#
- Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly
- formatted address. See {parseAddress-string} requirements.
- [.contract-item]
- [[Strings-tryParseAddress-string-uint256-uint256-]]
- ==== `[.contract-item-name]#++tryParseAddress++#++(string input, uint256 begin, uint256 end) โ bool success, address value++` [.item-kind]#internal#
- Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly
- formatted address. See {parseAddress-string-uint256-uint256} requirements.
- [.contract-item]
- [[Strings-escapeJSON-string-]]
- ==== `[.contract-item-name]#++escapeJSON++#++(string input) โ string++` [.item-kind]#internal#
- Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.
- WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.
- NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of
- RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode
- characters that are not in this range, but other tooling may provide different results.
- [.contract-item]
- [[Strings-StringsInsufficientHexLength-uint256-uint256-]]
- ==== `[.contract-item-name]#++StringsInsufficientHexLength++#++(uint256 value, uint256 length)++` [.item-kind]#error#
- The `value` string doesn't fit in the specified `length`.
- [.contract-item]
- [[Strings-StringsInvalidChar--]]
- ==== `[.contract-item-name]#++StringsInvalidChar++#++()++` [.item-kind]#error#
- The string being parsed contains characters that are not in scope of the given base.
- [.contract-item]
- [[Strings-StringsInvalidAddressFormat--]]
- ==== `[.contract-item-name]#++StringsInvalidAddressFormat++#++()++` [.item-kind]#error#
- The string being parsed is not a properly formatted address.
- :StringTooLong: pass:normal[xref:#ShortStrings-StringTooLong-string-[`++StringTooLong++`]]
- :InvalidShortString: pass:normal[xref:#ShortStrings-InvalidShortString--[`++InvalidShortString++`]]
- :toShortString: pass:normal[xref:#ShortStrings-toShortString-string-[`++toShortString++`]]
- :toString: pass:normal[xref:#ShortStrings-toString-ShortString-[`++toString++`]]
- :byteLength: pass:normal[xref:#ShortStrings-byteLength-ShortString-[`++byteLength++`]]
- :toShortStringWithFallback: pass:normal[xref:#ShortStrings-toShortStringWithFallback-string-string-[`++toShortStringWithFallback++`]]
- :toStringWithFallback: pass:normal[xref:#ShortStrings-toStringWithFallback-ShortString-string-[`++toStringWithFallback++`]]
- :byteLengthWithFallback: pass:normal[xref:#ShortStrings-byteLengthWithFallback-ShortString-string-[`++byteLengthWithFallback++`]]
- :toShortString-string: pass:normal[xref:#ShortStrings-toShortString-string-[`++toShortString++`]]
- :toString-ShortString: pass:normal[xref:#ShortStrings-toString-ShortString-[`++toString++`]]
- :byteLength-ShortString: pass:normal[xref:#ShortStrings-byteLength-ShortString-[`++byteLength++`]]
- :toShortStringWithFallback-string-string: pass:normal[xref:#ShortStrings-toShortStringWithFallback-string-string-[`++toShortStringWithFallback++`]]
- :toStringWithFallback-ShortString-string: pass:normal[xref:#ShortStrings-toStringWithFallback-ShortString-string-[`++toStringWithFallback++`]]
- :byteLengthWithFallback-ShortString-string: pass:normal[xref:#ShortStrings-byteLengthWithFallback-ShortString-string-[`++byteLengthWithFallback++`]]
- [.contract]
- [[ShortStrings]]
- === `++ShortStrings++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/ShortStrings.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/ShortStrings.sol";
- ```
- This library provides functions to convert short memory strings
- into a `ShortString` type that can be used as an immutable variable.
- Strings of arbitrary length can be optimized using this library if
- they are short enough (up to 31 bytes) by packing them with their
- length (1 byte) in a single EVM word (32 bytes). Additionally, a
- fallback mechanism can be used for every other case.
- Usage example:
- ```solidity
- contract Named {
- using ShortStrings for *;
- ShortString private immutable _name;
- string private _nameFallback;
- constructor(string memory contractName) {
- _name = contractName.toShortStringWithFallback(_nameFallback);
- }
- function name() external view returns (string memory) {
- return _name.toStringWithFallback(_nameFallback);
- }
- }
- ```
- [.contract-index]
- .Functions
- --
- * {xref-ShortStrings-toShortString-string-}[`++toShortString(str)++`]
- * {xref-ShortStrings-toString-ShortString-}[`++toString(sstr)++`]
- * {xref-ShortStrings-byteLength-ShortString-}[`++byteLength(sstr)++`]
- * {xref-ShortStrings-toShortStringWithFallback-string-string-}[`++toShortStringWithFallback(value, store)++`]
- * {xref-ShortStrings-toStringWithFallback-ShortString-string-}[`++toStringWithFallback(value, store)++`]
- * {xref-ShortStrings-byteLengthWithFallback-ShortString-string-}[`++byteLengthWithFallback(value, store)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ShortStrings-StringTooLong-string-}[`++StringTooLong(str)++`]
- * {xref-ShortStrings-InvalidShortString--}[`++InvalidShortString()++`]
- --
- [.contract-item]
- [[ShortStrings-toShortString-string-]]
- ==== `[.contract-item-name]#++toShortString++#++(string str) โ ShortString++` [.item-kind]#internal#
- Encode a string of at most 31 chars into a `ShortString`.
- This will trigger a `StringTooLong` error is the input string is too long.
- [.contract-item]
- [[ShortStrings-toString-ShortString-]]
- ==== `[.contract-item-name]#++toString++#++(ShortString sstr) โ string++` [.item-kind]#internal#
- Decode a `ShortString` back to a "normal" string.
- [.contract-item]
- [[ShortStrings-byteLength-ShortString-]]
- ==== `[.contract-item-name]#++byteLength++#++(ShortString sstr) โ uint256++` [.item-kind]#internal#
- Return the length of a `ShortString`.
- [.contract-item]
- [[ShortStrings-toShortStringWithFallback-string-string-]]
- ==== `[.contract-item-name]#++toShortStringWithFallback++#++(string value, string store) โ ShortString++` [.item-kind]#internal#
- Encode a string into a `ShortString`, or write it to storage if it is too long.
- [.contract-item]
- [[ShortStrings-toStringWithFallback-ShortString-string-]]
- ==== `[.contract-item-name]#++toStringWithFallback++#++(ShortString value, string store) โ string++` [.item-kind]#internal#
- Decode a string that was encoded to `ShortString` or written to storage using {toShortStringWithFallback}.
- [.contract-item]
- [[ShortStrings-byteLengthWithFallback-ShortString-string-]]
- ==== `[.contract-item-name]#++byteLengthWithFallback++#++(ShortString value, string store) โ uint256++` [.item-kind]#internal#
- Return the length of a string that was encoded to `ShortString` or written to storage using
- {toShortStringWithFallback}.
- WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of
- actual characters as the UTF-8 encoding of a single character can span over multiple bytes.
- [.contract-item]
- [[ShortStrings-StringTooLong-string-]]
- ==== `[.contract-item-name]#++StringTooLong++#++(string str)++` [.item-kind]#error#
- [.contract-item]
- [[ShortStrings-InvalidShortString--]]
- ==== `[.contract-item-name]#++InvalidShortString++#++()++` [.item-kind]#error#
- :erc7201Slot: pass:normal[xref:#SlotDerivation-erc7201Slot-string-[`++erc7201Slot++`]]
- :offset: pass:normal[xref:#SlotDerivation-offset-bytes32-uint256-[`++offset++`]]
- :deriveArray: pass:normal[xref:#SlotDerivation-deriveArray-bytes32-[`++deriveArray++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-address-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bool-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bytes32-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-uint256-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-int256-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-string-[`++deriveMapping++`]]
- :deriveMapping: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bytes-[`++deriveMapping++`]]
- :erc7201Slot-string: pass:normal[xref:#SlotDerivation-erc7201Slot-string-[`++erc7201Slot++`]]
- :offset-bytes32-uint256: pass:normal[xref:#SlotDerivation-offset-bytes32-uint256-[`++offset++`]]
- :deriveArray-bytes32: pass:normal[xref:#SlotDerivation-deriveArray-bytes32-[`++deriveArray++`]]
- :deriveMapping-bytes32-address: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-address-[`++deriveMapping++`]]
- :deriveMapping-bytes32-bool: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bool-[`++deriveMapping++`]]
- :deriveMapping-bytes32-bytes32: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bytes32-[`++deriveMapping++`]]
- :deriveMapping-bytes32-uint256: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-uint256-[`++deriveMapping++`]]
- :deriveMapping-bytes32-int256: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-int256-[`++deriveMapping++`]]
- :deriveMapping-bytes32-string: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-string-[`++deriveMapping++`]]
- :deriveMapping-bytes32-bytes: pass:normal[xref:#SlotDerivation-deriveMapping-bytes32-bytes-[`++deriveMapping++`]]
- [.contract]
- [[SlotDerivation]]
- === `++SlotDerivation++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/SlotDerivation.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/SlotDerivation.sol";
- ```
- Library for computing storage (and transient storage) locations from namespaces and deriving slots
- corresponding to standard patterns. The derivation method for array and mapping matches the storage layout used by
- the solidity language / compiler.
- See https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays[Solidity docs for mappings and dynamic arrays.].
- Example usage:
- ```solidity
- contract Example {
- // Add the library methods
- using StorageSlot for bytes32;
- using SlotDerivation for bytes32;
- // Declare a namespace
- string private constant _NAMESPACE = "<namespace>"; // eg. OpenZeppelin.Slot
- function setValueInNamespace(uint256 key, address newValue) internal {
- _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value = newValue;
- }
- function getValueInNamespace(uint256 key) internal view returns (address) {
- return _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value;
- }
- }
- ```
- TIP: Consider using this library along with {StorageSlot}.
- NOTE: This library provides a way to manipulate storage locations in a non-standard way. Tooling for checking
- upgrade safety will ignore the slots accessed through this library.
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-SlotDerivation-erc7201Slot-string-}[`++erc7201Slot(namespace)++`]
- * {xref-SlotDerivation-offset-bytes32-uint256-}[`++offset(slot, pos)++`]
- * {xref-SlotDerivation-deriveArray-bytes32-}[`++deriveArray(slot)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-address-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-bool-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-bytes32-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-uint256-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-int256-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-string-}[`++deriveMapping(slot, key)++`]
- * {xref-SlotDerivation-deriveMapping-bytes32-bytes-}[`++deriveMapping(slot, key)++`]
- --
- [.contract-item]
- [[SlotDerivation-erc7201Slot-string-]]
- ==== `[.contract-item-name]#++erc7201Slot++#++(string namespace) โ bytes32 slot++` [.item-kind]#internal#
- Derive an ERC-7201 slot from a string (namespace).
- [.contract-item]
- [[SlotDerivation-offset-bytes32-uint256-]]
- ==== `[.contract-item-name]#++offset++#++(bytes32 slot, uint256 pos) โ bytes32 result++` [.item-kind]#internal#
- Add an offset to a slot to get the n-th element of a structure or an array.
- [.contract-item]
- [[SlotDerivation-deriveArray-bytes32-]]
- ==== `[.contract-item-name]#++deriveArray++#++(bytes32 slot) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of the first element in an array from the slot where the length is stored.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-address-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, address key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-bool-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, bool key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, bytes32 key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-uint256-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, uint256 key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-int256-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, int256 key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-string-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, string key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- [.contract-item]
- [[SlotDerivation-deriveMapping-bytes32-bytes-]]
- ==== `[.contract-item-name]#++deriveMapping++#++(bytes32 slot, bytes key) โ bytes32 result++` [.item-kind]#internal#
- Derive the location of a mapping element from the key.
- :AddressSlot: pass:normal[xref:#StorageSlot-AddressSlot[`++AddressSlot++`]]
- :BooleanSlot: pass:normal[xref:#StorageSlot-BooleanSlot[`++BooleanSlot++`]]
- :Bytes32Slot: pass:normal[xref:#StorageSlot-Bytes32Slot[`++Bytes32Slot++`]]
- :Uint256Slot: pass:normal[xref:#StorageSlot-Uint256Slot[`++Uint256Slot++`]]
- :Int256Slot: pass:normal[xref:#StorageSlot-Int256Slot[`++Int256Slot++`]]
- :StringSlot: pass:normal[xref:#StorageSlot-StringSlot[`++StringSlot++`]]
- :BytesSlot: pass:normal[xref:#StorageSlot-BytesSlot[`++BytesSlot++`]]
- :getAddressSlot: pass:normal[xref:#StorageSlot-getAddressSlot-bytes32-[`++getAddressSlot++`]]
- :getBooleanSlot: pass:normal[xref:#StorageSlot-getBooleanSlot-bytes32-[`++getBooleanSlot++`]]
- :getBytes32Slot: pass:normal[xref:#StorageSlot-getBytes32Slot-bytes32-[`++getBytes32Slot++`]]
- :getUint256Slot: pass:normal[xref:#StorageSlot-getUint256Slot-bytes32-[`++getUint256Slot++`]]
- :getInt256Slot: pass:normal[xref:#StorageSlot-getInt256Slot-bytes32-[`++getInt256Slot++`]]
- :getStringSlot: pass:normal[xref:#StorageSlot-getStringSlot-bytes32-[`++getStringSlot++`]]
- :getStringSlot: pass:normal[xref:#StorageSlot-getStringSlot-string-[`++getStringSlot++`]]
- :getBytesSlot: pass:normal[xref:#StorageSlot-getBytesSlot-bytes32-[`++getBytesSlot++`]]
- :getBytesSlot: pass:normal[xref:#StorageSlot-getBytesSlot-bytes-[`++getBytesSlot++`]]
- :getAddressSlot-bytes32: pass:normal[xref:#StorageSlot-getAddressSlot-bytes32-[`++getAddressSlot++`]]
- :getBooleanSlot-bytes32: pass:normal[xref:#StorageSlot-getBooleanSlot-bytes32-[`++getBooleanSlot++`]]
- :getBytes32Slot-bytes32: pass:normal[xref:#StorageSlot-getBytes32Slot-bytes32-[`++getBytes32Slot++`]]
- :getUint256Slot-bytes32: pass:normal[xref:#StorageSlot-getUint256Slot-bytes32-[`++getUint256Slot++`]]
- :getInt256Slot-bytes32: pass:normal[xref:#StorageSlot-getInt256Slot-bytes32-[`++getInt256Slot++`]]
- :getStringSlot-bytes32: pass:normal[xref:#StorageSlot-getStringSlot-bytes32-[`++getStringSlot++`]]
- :getStringSlot-string: pass:normal[xref:#StorageSlot-getStringSlot-string-[`++getStringSlot++`]]
- :getBytesSlot-bytes32: pass:normal[xref:#StorageSlot-getBytesSlot-bytes32-[`++getBytesSlot++`]]
- :getBytesSlot-bytes: pass:normal[xref:#StorageSlot-getBytesSlot-bytes-[`++getBytesSlot++`]]
- [.contract]
- [[StorageSlot]]
- === `++StorageSlot++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/StorageSlot.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/StorageSlot.sol";
- ```
- Library for reading and writing primitive types to specific storage slots.
- Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
- This library helps with reading and writing to such slots without the need for inline assembly.
- The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
- Example usage to set ERC-1967 implementation slot:
- ```solidity
- contract ERC1967 {
- // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
- bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
- function _getImplementation() internal view returns (address) {
- return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
- }
- function _setImplementation(address newImplementation) internal {
- require(newImplementation.code.length > 0);
- StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
- }
- }
- ```
- TIP: Consider using this library along with {SlotDerivation}.
- [.contract-index]
- .Functions
- --
- * {xref-StorageSlot-getAddressSlot-bytes32-}[`++getAddressSlot(slot)++`]
- * {xref-StorageSlot-getBooleanSlot-bytes32-}[`++getBooleanSlot(slot)++`]
- * {xref-StorageSlot-getBytes32Slot-bytes32-}[`++getBytes32Slot(slot)++`]
- * {xref-StorageSlot-getUint256Slot-bytes32-}[`++getUint256Slot(slot)++`]
- * {xref-StorageSlot-getInt256Slot-bytes32-}[`++getInt256Slot(slot)++`]
- * {xref-StorageSlot-getStringSlot-bytes32-}[`++getStringSlot(slot)++`]
- * {xref-StorageSlot-getStringSlot-string-}[`++getStringSlot(store)++`]
- * {xref-StorageSlot-getBytesSlot-bytes32-}[`++getBytesSlot(slot)++`]
- * {xref-StorageSlot-getBytesSlot-bytes-}[`++getBytesSlot(store)++`]
- --
- [.contract-item]
- [[StorageSlot-getAddressSlot-bytes32-]]
- ==== `[.contract-item-name]#++getAddressSlot++#++(bytes32 slot) โ struct StorageSlot.AddressSlot r++` [.item-kind]#internal#
- Returns an `AddressSlot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getBooleanSlot-bytes32-]]
- ==== `[.contract-item-name]#++getBooleanSlot++#++(bytes32 slot) โ struct StorageSlot.BooleanSlot r++` [.item-kind]#internal#
- Returns a `BooleanSlot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getBytes32Slot-bytes32-]]
- ==== `[.contract-item-name]#++getBytes32Slot++#++(bytes32 slot) โ struct StorageSlot.Bytes32Slot r++` [.item-kind]#internal#
- Returns a `Bytes32Slot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getUint256Slot-bytes32-]]
- ==== `[.contract-item-name]#++getUint256Slot++#++(bytes32 slot) โ struct StorageSlot.Uint256Slot r++` [.item-kind]#internal#
- Returns a `Uint256Slot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getInt256Slot-bytes32-]]
- ==== `[.contract-item-name]#++getInt256Slot++#++(bytes32 slot) โ struct StorageSlot.Int256Slot r++` [.item-kind]#internal#
- Returns a `Int256Slot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getStringSlot-bytes32-]]
- ==== `[.contract-item-name]#++getStringSlot++#++(bytes32 slot) โ struct StorageSlot.StringSlot r++` [.item-kind]#internal#
- Returns a `StringSlot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getStringSlot-string-]]
- ==== `[.contract-item-name]#++getStringSlot++#++(string store) โ struct StorageSlot.StringSlot r++` [.item-kind]#internal#
- Returns an `StringSlot` representation of the string storage pointer `store`.
- [.contract-item]
- [[StorageSlot-getBytesSlot-bytes32-]]
- ==== `[.contract-item-name]#++getBytesSlot++#++(bytes32 slot) โ struct StorageSlot.BytesSlot r++` [.item-kind]#internal#
- Returns a `BytesSlot` with member `value` located at `slot`.
- [.contract-item]
- [[StorageSlot-getBytesSlot-bytes-]]
- ==== `[.contract-item-name]#++getBytesSlot++#++(bytes store) โ struct StorageSlot.BytesSlot r++` [.item-kind]#internal#
- Returns an `BytesSlot` representation of the bytes storage pointer `store`.
- :AddressSlot: pass:normal[xref:#TransientSlot-AddressSlot[`++AddressSlot++`]]
- :asAddress: pass:normal[xref:#TransientSlot-asAddress-bytes32-[`++asAddress++`]]
- :BooleanSlot: pass:normal[xref:#TransientSlot-BooleanSlot[`++BooleanSlot++`]]
- :asBoolean: pass:normal[xref:#TransientSlot-asBoolean-bytes32-[`++asBoolean++`]]
- :Bytes32Slot: pass:normal[xref:#TransientSlot-Bytes32Slot[`++Bytes32Slot++`]]
- :asBytes32: pass:normal[xref:#TransientSlot-asBytes32-bytes32-[`++asBytes32++`]]
- :Uint256Slot: pass:normal[xref:#TransientSlot-Uint256Slot[`++Uint256Slot++`]]
- :asUint256: pass:normal[xref:#TransientSlot-asUint256-bytes32-[`++asUint256++`]]
- :Int256Slot: pass:normal[xref:#TransientSlot-Int256Slot[`++Int256Slot++`]]
- :asInt256: pass:normal[xref:#TransientSlot-asInt256-bytes32-[`++asInt256++`]]
- :tload: pass:normal[xref:#TransientSlot-tload-TransientSlot-AddressSlot-[`++tload++`]]
- :tstore: pass:normal[xref:#TransientSlot-tstore-TransientSlot-AddressSlot-address-[`++tstore++`]]
- :tload: pass:normal[xref:#TransientSlot-tload-TransientSlot-BooleanSlot-[`++tload++`]]
- :tstore: pass:normal[xref:#TransientSlot-tstore-TransientSlot-BooleanSlot-bool-[`++tstore++`]]
- :tload: pass:normal[xref:#TransientSlot-tload-TransientSlot-Bytes32Slot-[`++tload++`]]
- :tstore: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-[`++tstore++`]]
- :tload: pass:normal[xref:#TransientSlot-tload-TransientSlot-Uint256Slot-[`++tload++`]]
- :tstore: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-[`++tstore++`]]
- :tload: pass:normal[xref:#TransientSlot-tload-TransientSlot-Int256Slot-[`++tload++`]]
- :tstore: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Int256Slot-int256-[`++tstore++`]]
- :asAddress-bytes32: pass:normal[xref:#TransientSlot-asAddress-bytes32-[`++asAddress++`]]
- :asBoolean-bytes32: pass:normal[xref:#TransientSlot-asBoolean-bytes32-[`++asBoolean++`]]
- :asBytes32-bytes32: pass:normal[xref:#TransientSlot-asBytes32-bytes32-[`++asBytes32++`]]
- :asUint256-bytes32: pass:normal[xref:#TransientSlot-asUint256-bytes32-[`++asUint256++`]]
- :asInt256-bytes32: pass:normal[xref:#TransientSlot-asInt256-bytes32-[`++asInt256++`]]
- :tload-TransientSlot-AddressSlot: pass:normal[xref:#TransientSlot-tload-TransientSlot-AddressSlot-[`++tload++`]]
- :tstore-TransientSlot-AddressSlot-address: pass:normal[xref:#TransientSlot-tstore-TransientSlot-AddressSlot-address-[`++tstore++`]]
- :tload-TransientSlot-BooleanSlot: pass:normal[xref:#TransientSlot-tload-TransientSlot-BooleanSlot-[`++tload++`]]
- :tstore-TransientSlot-BooleanSlot-bool: pass:normal[xref:#TransientSlot-tstore-TransientSlot-BooleanSlot-bool-[`++tstore++`]]
- :tload-TransientSlot-Bytes32Slot: pass:normal[xref:#TransientSlot-tload-TransientSlot-Bytes32Slot-[`++tload++`]]
- :tstore-TransientSlot-Bytes32Slot-bytes32: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-[`++tstore++`]]
- :tload-TransientSlot-Uint256Slot: pass:normal[xref:#TransientSlot-tload-TransientSlot-Uint256Slot-[`++tload++`]]
- :tstore-TransientSlot-Uint256Slot-uint256: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-[`++tstore++`]]
- :tload-TransientSlot-Int256Slot: pass:normal[xref:#TransientSlot-tload-TransientSlot-Int256Slot-[`++tload++`]]
- :tstore-TransientSlot-Int256Slot-int256: pass:normal[xref:#TransientSlot-tstore-TransientSlot-Int256Slot-int256-[`++tstore++`]]
- [.contract]
- [[TransientSlot]]
- === `++TransientSlot++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/TransientSlot.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/TransientSlot.sol";
- ```
- Library for reading and writing value-types to specific transient storage slots.
- Transient slots are often used to store temporary values that are removed after the current transaction.
- This library helps with reading and writing to such slots without the need for inline assembly.
- * Example reading and writing values using transient storage:
- ```solidity
- contract Lock {
- using TransientSlot for *;
- // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
- bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;
- modifier locked() {
- require(!_LOCK_SLOT.asBoolean().tload());
- _LOCK_SLOT.asBoolean().tstore(true);
- _;
- _LOCK_SLOT.asBoolean().tstore(false);
- }
- }
- ```
- TIP: Consider using this library along with {SlotDerivation}.
- [.contract-index]
- .Functions
- --
- * {xref-TransientSlot-asAddress-bytes32-}[`++asAddress(slot)++`]
- * {xref-TransientSlot-asBoolean-bytes32-}[`++asBoolean(slot)++`]
- * {xref-TransientSlot-asBytes32-bytes32-}[`++asBytes32(slot)++`]
- * {xref-TransientSlot-asUint256-bytes32-}[`++asUint256(slot)++`]
- * {xref-TransientSlot-asInt256-bytes32-}[`++asInt256(slot)++`]
- * {xref-TransientSlot-tload-TransientSlot-AddressSlot-}[`++tload(slot)++`]
- * {xref-TransientSlot-tstore-TransientSlot-AddressSlot-address-}[`++tstore(slot, value)++`]
- * {xref-TransientSlot-tload-TransientSlot-BooleanSlot-}[`++tload(slot)++`]
- * {xref-TransientSlot-tstore-TransientSlot-BooleanSlot-bool-}[`++tstore(slot, value)++`]
- * {xref-TransientSlot-tload-TransientSlot-Bytes32Slot-}[`++tload(slot)++`]
- * {xref-TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-}[`++tstore(slot, value)++`]
- * {xref-TransientSlot-tload-TransientSlot-Uint256Slot-}[`++tload(slot)++`]
- * {xref-TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-}[`++tstore(slot, value)++`]
- * {xref-TransientSlot-tload-TransientSlot-Int256Slot-}[`++tload(slot)++`]
- * {xref-TransientSlot-tstore-TransientSlot-Int256Slot-int256-}[`++tstore(slot, value)++`]
- --
- [.contract-item]
- [[TransientSlot-asAddress-bytes32-]]
- ==== `[.contract-item-name]#++asAddress++#++(bytes32 slot) โ TransientSlot.AddressSlot++` [.item-kind]#internal#
- Cast an arbitrary slot to a AddressSlot.
- [.contract-item]
- [[TransientSlot-asBoolean-bytes32-]]
- ==== `[.contract-item-name]#++asBoolean++#++(bytes32 slot) โ TransientSlot.BooleanSlot++` [.item-kind]#internal#
- Cast an arbitrary slot to a BooleanSlot.
- [.contract-item]
- [[TransientSlot-asBytes32-bytes32-]]
- ==== `[.contract-item-name]#++asBytes32++#++(bytes32 slot) โ TransientSlot.Bytes32Slot++` [.item-kind]#internal#
- Cast an arbitrary slot to a Bytes32Slot.
- [.contract-item]
- [[TransientSlot-asUint256-bytes32-]]
- ==== `[.contract-item-name]#++asUint256++#++(bytes32 slot) โ TransientSlot.Uint256Slot++` [.item-kind]#internal#
- Cast an arbitrary slot to a Uint256Slot.
- [.contract-item]
- [[TransientSlot-asInt256-bytes32-]]
- ==== `[.contract-item-name]#++asInt256++#++(bytes32 slot) โ TransientSlot.Int256Slot++` [.item-kind]#internal#
- Cast an arbitrary slot to a Int256Slot.
- [.contract-item]
- [[TransientSlot-tload-TransientSlot-AddressSlot-]]
- ==== `[.contract-item-name]#++tload++#++(TransientSlot.AddressSlot slot) โ address value++` [.item-kind]#internal#
- Load the value held at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tstore-TransientSlot-AddressSlot-address-]]
- ==== `[.contract-item-name]#++tstore++#++(TransientSlot.AddressSlot slot, address value)++` [.item-kind]#internal#
- Store `value` at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tload-TransientSlot-BooleanSlot-]]
- ==== `[.contract-item-name]#++tload++#++(TransientSlot.BooleanSlot slot) โ bool value++` [.item-kind]#internal#
- Load the value held at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tstore-TransientSlot-BooleanSlot-bool-]]
- ==== `[.contract-item-name]#++tstore++#++(TransientSlot.BooleanSlot slot, bool value)++` [.item-kind]#internal#
- Store `value` at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tload-TransientSlot-Bytes32Slot-]]
- ==== `[.contract-item-name]#++tload++#++(TransientSlot.Bytes32Slot slot) โ bytes32 value++` [.item-kind]#internal#
- Load the value held at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tstore-TransientSlot-Bytes32Slot-bytes32-]]
- ==== `[.contract-item-name]#++tstore++#++(TransientSlot.Bytes32Slot slot, bytes32 value)++` [.item-kind]#internal#
- Store `value` at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tload-TransientSlot-Uint256Slot-]]
- ==== `[.contract-item-name]#++tload++#++(TransientSlot.Uint256Slot slot) โ uint256 value++` [.item-kind]#internal#
- Load the value held at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tstore-TransientSlot-Uint256Slot-uint256-]]
- ==== `[.contract-item-name]#++tstore++#++(TransientSlot.Uint256Slot slot, uint256 value)++` [.item-kind]#internal#
- Store `value` at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tload-TransientSlot-Int256Slot-]]
- ==== `[.contract-item-name]#++tload++#++(TransientSlot.Int256Slot slot) โ int256 value++` [.item-kind]#internal#
- Load the value held at location `slot` in transient storage.
- [.contract-item]
- [[TransientSlot-tstore-TransientSlot-Int256Slot-int256-]]
- ==== `[.contract-item-name]#++tstore++#++(TransientSlot.Int256Slot slot, int256 value)++` [.item-kind]#internal#
- Store `value` at location `slot` in transient storage.
- :multicall: pass:normal[xref:#Multicall-multicall-bytes---[`++multicall++`]]
- :multicall-bytes--: pass:normal[xref:#Multicall-multicall-bytes---[`++multicall++`]]
- [.contract]
- [[Multicall]]
- === `++Multicall++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Multicall.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Multicall.sol";
- ```
- Provides a function to batch together multiple calls in a single external call.
- Consider any assumption about calldata validation performed by the sender may be violated if it's not especially
- careful about sending transactions invoking {multicall}. For example, a relay address that filters function
- selectors won't filter calls nested within a {multicall} operation.
- NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {Context-_msgSender}).
- If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data`
- to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of
- {Context-_msgSender} are not propagated to subcalls.
- [.contract-index]
- .Functions
- --
- * {xref-Multicall-multicall-bytes---}[`++multicall(data)++`]
- --
- [.contract-item]
- [[Multicall-multicall-bytes---]]
- ==== `[.contract-item-name]#++multicall++#++(bytes[] data) โ bytes[] results++` [.item-kind]#external#
- Receives and executes a batch of function calls on this contract.
- :_msgSender: pass:normal[xref:#Context-_msgSender--[`++_msgSender++`]]
- :_msgData: pass:normal[xref:#Context-_msgData--[`++_msgData++`]]
- :_contextSuffixLength: pass:normal[xref:#Context-_contextSuffixLength--[`++_contextSuffixLength++`]]
- :_msgSender-: pass:normal[xref:#Context-_msgSender--[`++_msgSender++`]]
- :_msgData-: pass:normal[xref:#Context-_msgData--[`++_msgData++`]]
- :_contextSuffixLength-: pass:normal[xref:#Context-_contextSuffixLength--[`++_contextSuffixLength++`]]
- [.contract]
- [[Context]]
- === `++Context++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Context.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Context.sol";
- ```
- 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.
- [.contract-index]
- .Functions
- --
- * {xref-Context-_msgSender--}[`++_msgSender()++`]
- * {xref-Context-_msgData--}[`++_msgData()++`]
- * {xref-Context-_contextSuffixLength--}[`++_contextSuffixLength()++`]
- --
- [.contract-item]
- [[Context-_msgSender--]]
- ==== `[.contract-item-name]#++_msgSender++#++() โ address++` [.item-kind]#internal#
- [.contract-item]
- [[Context-_msgData--]]
- ==== `[.contract-item-name]#++_msgData++#++() โ bytes++` [.item-kind]#internal#
- [.contract-item]
- [[Context-_contextSuffixLength--]]
- ==== `[.contract-item-name]#++_contextSuffixLength++#++() โ uint256++` [.item-kind]#internal#
- :OutOfRangeAccess: pass:normal[xref:#Packing-OutOfRangeAccess--[`++OutOfRangeAccess++`]]
- :pack_1_1: pass:normal[xref:#Packing-pack_1_1-bytes1-bytes1-[`++pack_1_1++`]]
- :pack_2_2: pass:normal[xref:#Packing-pack_2_2-bytes2-bytes2-[`++pack_2_2++`]]
- :pack_2_4: pass:normal[xref:#Packing-pack_2_4-bytes2-bytes4-[`++pack_2_4++`]]
- :pack_2_6: pass:normal[xref:#Packing-pack_2_6-bytes2-bytes6-[`++pack_2_6++`]]
- :pack_2_8: pass:normal[xref:#Packing-pack_2_8-bytes2-bytes8-[`++pack_2_8++`]]
- :pack_2_10: pass:normal[xref:#Packing-pack_2_10-bytes2-bytes10-[`++pack_2_10++`]]
- :pack_2_20: pass:normal[xref:#Packing-pack_2_20-bytes2-bytes20-[`++pack_2_20++`]]
- :pack_2_22: pass:normal[xref:#Packing-pack_2_22-bytes2-bytes22-[`++pack_2_22++`]]
- :pack_4_2: pass:normal[xref:#Packing-pack_4_2-bytes4-bytes2-[`++pack_4_2++`]]
- :pack_4_4: pass:normal[xref:#Packing-pack_4_4-bytes4-bytes4-[`++pack_4_4++`]]
- :pack_4_6: pass:normal[xref:#Packing-pack_4_6-bytes4-bytes6-[`++pack_4_6++`]]
- :pack_4_8: pass:normal[xref:#Packing-pack_4_8-bytes4-bytes8-[`++pack_4_8++`]]
- :pack_4_12: pass:normal[xref:#Packing-pack_4_12-bytes4-bytes12-[`++pack_4_12++`]]
- :pack_4_16: pass:normal[xref:#Packing-pack_4_16-bytes4-bytes16-[`++pack_4_16++`]]
- :pack_4_20: pass:normal[xref:#Packing-pack_4_20-bytes4-bytes20-[`++pack_4_20++`]]
- :pack_4_24: pass:normal[xref:#Packing-pack_4_24-bytes4-bytes24-[`++pack_4_24++`]]
- :pack_4_28: pass:normal[xref:#Packing-pack_4_28-bytes4-bytes28-[`++pack_4_28++`]]
- :pack_6_2: pass:normal[xref:#Packing-pack_6_2-bytes6-bytes2-[`++pack_6_2++`]]
- :pack_6_4: pass:normal[xref:#Packing-pack_6_4-bytes6-bytes4-[`++pack_6_4++`]]
- :pack_6_6: pass:normal[xref:#Packing-pack_6_6-bytes6-bytes6-[`++pack_6_6++`]]
- :pack_6_10: pass:normal[xref:#Packing-pack_6_10-bytes6-bytes10-[`++pack_6_10++`]]
- :pack_6_16: pass:normal[xref:#Packing-pack_6_16-bytes6-bytes16-[`++pack_6_16++`]]
- :pack_6_22: pass:normal[xref:#Packing-pack_6_22-bytes6-bytes22-[`++pack_6_22++`]]
- :pack_8_2: pass:normal[xref:#Packing-pack_8_2-bytes8-bytes2-[`++pack_8_2++`]]
- :pack_8_4: pass:normal[xref:#Packing-pack_8_4-bytes8-bytes4-[`++pack_8_4++`]]
- :pack_8_8: pass:normal[xref:#Packing-pack_8_8-bytes8-bytes8-[`++pack_8_8++`]]
- :pack_8_12: pass:normal[xref:#Packing-pack_8_12-bytes8-bytes12-[`++pack_8_12++`]]
- :pack_8_16: pass:normal[xref:#Packing-pack_8_16-bytes8-bytes16-[`++pack_8_16++`]]
- :pack_8_20: pass:normal[xref:#Packing-pack_8_20-bytes8-bytes20-[`++pack_8_20++`]]
- :pack_8_24: pass:normal[xref:#Packing-pack_8_24-bytes8-bytes24-[`++pack_8_24++`]]
- :pack_10_2: pass:normal[xref:#Packing-pack_10_2-bytes10-bytes2-[`++pack_10_2++`]]
- :pack_10_6: pass:normal[xref:#Packing-pack_10_6-bytes10-bytes6-[`++pack_10_6++`]]
- :pack_10_10: pass:normal[xref:#Packing-pack_10_10-bytes10-bytes10-[`++pack_10_10++`]]
- :pack_10_12: pass:normal[xref:#Packing-pack_10_12-bytes10-bytes12-[`++pack_10_12++`]]
- :pack_10_22: pass:normal[xref:#Packing-pack_10_22-bytes10-bytes22-[`++pack_10_22++`]]
- :pack_12_4: pass:normal[xref:#Packing-pack_12_4-bytes12-bytes4-[`++pack_12_4++`]]
- :pack_12_8: pass:normal[xref:#Packing-pack_12_8-bytes12-bytes8-[`++pack_12_8++`]]
- :pack_12_10: pass:normal[xref:#Packing-pack_12_10-bytes12-bytes10-[`++pack_12_10++`]]
- :pack_12_12: pass:normal[xref:#Packing-pack_12_12-bytes12-bytes12-[`++pack_12_12++`]]
- :pack_12_16: pass:normal[xref:#Packing-pack_12_16-bytes12-bytes16-[`++pack_12_16++`]]
- :pack_12_20: pass:normal[xref:#Packing-pack_12_20-bytes12-bytes20-[`++pack_12_20++`]]
- :pack_16_4: pass:normal[xref:#Packing-pack_16_4-bytes16-bytes4-[`++pack_16_4++`]]
- :pack_16_6: pass:normal[xref:#Packing-pack_16_6-bytes16-bytes6-[`++pack_16_6++`]]
- :pack_16_8: pass:normal[xref:#Packing-pack_16_8-bytes16-bytes8-[`++pack_16_8++`]]
- :pack_16_12: pass:normal[xref:#Packing-pack_16_12-bytes16-bytes12-[`++pack_16_12++`]]
- :pack_16_16: pass:normal[xref:#Packing-pack_16_16-bytes16-bytes16-[`++pack_16_16++`]]
- :pack_20_2: pass:normal[xref:#Packing-pack_20_2-bytes20-bytes2-[`++pack_20_2++`]]
- :pack_20_4: pass:normal[xref:#Packing-pack_20_4-bytes20-bytes4-[`++pack_20_4++`]]
- :pack_20_8: pass:normal[xref:#Packing-pack_20_8-bytes20-bytes8-[`++pack_20_8++`]]
- :pack_20_12: pass:normal[xref:#Packing-pack_20_12-bytes20-bytes12-[`++pack_20_12++`]]
- :pack_22_2: pass:normal[xref:#Packing-pack_22_2-bytes22-bytes2-[`++pack_22_2++`]]
- :pack_22_6: pass:normal[xref:#Packing-pack_22_6-bytes22-bytes6-[`++pack_22_6++`]]
- :pack_22_10: pass:normal[xref:#Packing-pack_22_10-bytes22-bytes10-[`++pack_22_10++`]]
- :pack_24_4: pass:normal[xref:#Packing-pack_24_4-bytes24-bytes4-[`++pack_24_4++`]]
- :pack_24_8: pass:normal[xref:#Packing-pack_24_8-bytes24-bytes8-[`++pack_24_8++`]]
- :pack_28_4: pass:normal[xref:#Packing-pack_28_4-bytes28-bytes4-[`++pack_28_4++`]]
- :extract_2_1: pass:normal[xref:#Packing-extract_2_1-bytes2-uint8-[`++extract_2_1++`]]
- :replace_2_1: pass:normal[xref:#Packing-replace_2_1-bytes2-bytes1-uint8-[`++replace_2_1++`]]
- :extract_4_1: pass:normal[xref:#Packing-extract_4_1-bytes4-uint8-[`++extract_4_1++`]]
- :replace_4_1: pass:normal[xref:#Packing-replace_4_1-bytes4-bytes1-uint8-[`++replace_4_1++`]]
- :extract_4_2: pass:normal[xref:#Packing-extract_4_2-bytes4-uint8-[`++extract_4_2++`]]
- :replace_4_2: pass:normal[xref:#Packing-replace_4_2-bytes4-bytes2-uint8-[`++replace_4_2++`]]
- :extract_6_1: pass:normal[xref:#Packing-extract_6_1-bytes6-uint8-[`++extract_6_1++`]]
- :replace_6_1: pass:normal[xref:#Packing-replace_6_1-bytes6-bytes1-uint8-[`++replace_6_1++`]]
- :extract_6_2: pass:normal[xref:#Packing-extract_6_2-bytes6-uint8-[`++extract_6_2++`]]
- :replace_6_2: pass:normal[xref:#Packing-replace_6_2-bytes6-bytes2-uint8-[`++replace_6_2++`]]
- :extract_6_4: pass:normal[xref:#Packing-extract_6_4-bytes6-uint8-[`++extract_6_4++`]]
- :replace_6_4: pass:normal[xref:#Packing-replace_6_4-bytes6-bytes4-uint8-[`++replace_6_4++`]]
- :extract_8_1: pass:normal[xref:#Packing-extract_8_1-bytes8-uint8-[`++extract_8_1++`]]
- :replace_8_1: pass:normal[xref:#Packing-replace_8_1-bytes8-bytes1-uint8-[`++replace_8_1++`]]
- :extract_8_2: pass:normal[xref:#Packing-extract_8_2-bytes8-uint8-[`++extract_8_2++`]]
- :replace_8_2: pass:normal[xref:#Packing-replace_8_2-bytes8-bytes2-uint8-[`++replace_8_2++`]]
- :extract_8_4: pass:normal[xref:#Packing-extract_8_4-bytes8-uint8-[`++extract_8_4++`]]
- :replace_8_4: pass:normal[xref:#Packing-replace_8_4-bytes8-bytes4-uint8-[`++replace_8_4++`]]
- :extract_8_6: pass:normal[xref:#Packing-extract_8_6-bytes8-uint8-[`++extract_8_6++`]]
- :replace_8_6: pass:normal[xref:#Packing-replace_8_6-bytes8-bytes6-uint8-[`++replace_8_6++`]]
- :extract_10_1: pass:normal[xref:#Packing-extract_10_1-bytes10-uint8-[`++extract_10_1++`]]
- :replace_10_1: pass:normal[xref:#Packing-replace_10_1-bytes10-bytes1-uint8-[`++replace_10_1++`]]
- :extract_10_2: pass:normal[xref:#Packing-extract_10_2-bytes10-uint8-[`++extract_10_2++`]]
- :replace_10_2: pass:normal[xref:#Packing-replace_10_2-bytes10-bytes2-uint8-[`++replace_10_2++`]]
- :extract_10_4: pass:normal[xref:#Packing-extract_10_4-bytes10-uint8-[`++extract_10_4++`]]
- :replace_10_4: pass:normal[xref:#Packing-replace_10_4-bytes10-bytes4-uint8-[`++replace_10_4++`]]
- :extract_10_6: pass:normal[xref:#Packing-extract_10_6-bytes10-uint8-[`++extract_10_6++`]]
- :replace_10_6: pass:normal[xref:#Packing-replace_10_6-bytes10-bytes6-uint8-[`++replace_10_6++`]]
- :extract_10_8: pass:normal[xref:#Packing-extract_10_8-bytes10-uint8-[`++extract_10_8++`]]
- :replace_10_8: pass:normal[xref:#Packing-replace_10_8-bytes10-bytes8-uint8-[`++replace_10_8++`]]
- :extract_12_1: pass:normal[xref:#Packing-extract_12_1-bytes12-uint8-[`++extract_12_1++`]]
- :replace_12_1: pass:normal[xref:#Packing-replace_12_1-bytes12-bytes1-uint8-[`++replace_12_1++`]]
- :extract_12_2: pass:normal[xref:#Packing-extract_12_2-bytes12-uint8-[`++extract_12_2++`]]
- :replace_12_2: pass:normal[xref:#Packing-replace_12_2-bytes12-bytes2-uint8-[`++replace_12_2++`]]
- :extract_12_4: pass:normal[xref:#Packing-extract_12_4-bytes12-uint8-[`++extract_12_4++`]]
- :replace_12_4: pass:normal[xref:#Packing-replace_12_4-bytes12-bytes4-uint8-[`++replace_12_4++`]]
- :extract_12_6: pass:normal[xref:#Packing-extract_12_6-bytes12-uint8-[`++extract_12_6++`]]
- :replace_12_6: pass:normal[xref:#Packing-replace_12_6-bytes12-bytes6-uint8-[`++replace_12_6++`]]
- :extract_12_8: pass:normal[xref:#Packing-extract_12_8-bytes12-uint8-[`++extract_12_8++`]]
- :replace_12_8: pass:normal[xref:#Packing-replace_12_8-bytes12-bytes8-uint8-[`++replace_12_8++`]]
- :extract_12_10: pass:normal[xref:#Packing-extract_12_10-bytes12-uint8-[`++extract_12_10++`]]
- :replace_12_10: pass:normal[xref:#Packing-replace_12_10-bytes12-bytes10-uint8-[`++replace_12_10++`]]
- :extract_16_1: pass:normal[xref:#Packing-extract_16_1-bytes16-uint8-[`++extract_16_1++`]]
- :replace_16_1: pass:normal[xref:#Packing-replace_16_1-bytes16-bytes1-uint8-[`++replace_16_1++`]]
- :extract_16_2: pass:normal[xref:#Packing-extract_16_2-bytes16-uint8-[`++extract_16_2++`]]
- :replace_16_2: pass:normal[xref:#Packing-replace_16_2-bytes16-bytes2-uint8-[`++replace_16_2++`]]
- :extract_16_4: pass:normal[xref:#Packing-extract_16_4-bytes16-uint8-[`++extract_16_4++`]]
- :replace_16_4: pass:normal[xref:#Packing-replace_16_4-bytes16-bytes4-uint8-[`++replace_16_4++`]]
- :extract_16_6: pass:normal[xref:#Packing-extract_16_6-bytes16-uint8-[`++extract_16_6++`]]
- :replace_16_6: pass:normal[xref:#Packing-replace_16_6-bytes16-bytes6-uint8-[`++replace_16_6++`]]
- :extract_16_8: pass:normal[xref:#Packing-extract_16_8-bytes16-uint8-[`++extract_16_8++`]]
- :replace_16_8: pass:normal[xref:#Packing-replace_16_8-bytes16-bytes8-uint8-[`++replace_16_8++`]]
- :extract_16_10: pass:normal[xref:#Packing-extract_16_10-bytes16-uint8-[`++extract_16_10++`]]
- :replace_16_10: pass:normal[xref:#Packing-replace_16_10-bytes16-bytes10-uint8-[`++replace_16_10++`]]
- :extract_16_12: pass:normal[xref:#Packing-extract_16_12-bytes16-uint8-[`++extract_16_12++`]]
- :replace_16_12: pass:normal[xref:#Packing-replace_16_12-bytes16-bytes12-uint8-[`++replace_16_12++`]]
- :extract_20_1: pass:normal[xref:#Packing-extract_20_1-bytes20-uint8-[`++extract_20_1++`]]
- :replace_20_1: pass:normal[xref:#Packing-replace_20_1-bytes20-bytes1-uint8-[`++replace_20_1++`]]
- :extract_20_2: pass:normal[xref:#Packing-extract_20_2-bytes20-uint8-[`++extract_20_2++`]]
- :replace_20_2: pass:normal[xref:#Packing-replace_20_2-bytes20-bytes2-uint8-[`++replace_20_2++`]]
- :extract_20_4: pass:normal[xref:#Packing-extract_20_4-bytes20-uint8-[`++extract_20_4++`]]
- :replace_20_4: pass:normal[xref:#Packing-replace_20_4-bytes20-bytes4-uint8-[`++replace_20_4++`]]
- :extract_20_6: pass:normal[xref:#Packing-extract_20_6-bytes20-uint8-[`++extract_20_6++`]]
- :replace_20_6: pass:normal[xref:#Packing-replace_20_6-bytes20-bytes6-uint8-[`++replace_20_6++`]]
- :extract_20_8: pass:normal[xref:#Packing-extract_20_8-bytes20-uint8-[`++extract_20_8++`]]
- :replace_20_8: pass:normal[xref:#Packing-replace_20_8-bytes20-bytes8-uint8-[`++replace_20_8++`]]
- :extract_20_10: pass:normal[xref:#Packing-extract_20_10-bytes20-uint8-[`++extract_20_10++`]]
- :replace_20_10: pass:normal[xref:#Packing-replace_20_10-bytes20-bytes10-uint8-[`++replace_20_10++`]]
- :extract_20_12: pass:normal[xref:#Packing-extract_20_12-bytes20-uint8-[`++extract_20_12++`]]
- :replace_20_12: pass:normal[xref:#Packing-replace_20_12-bytes20-bytes12-uint8-[`++replace_20_12++`]]
- :extract_20_16: pass:normal[xref:#Packing-extract_20_16-bytes20-uint8-[`++extract_20_16++`]]
- :replace_20_16: pass:normal[xref:#Packing-replace_20_16-bytes20-bytes16-uint8-[`++replace_20_16++`]]
- :extract_22_1: pass:normal[xref:#Packing-extract_22_1-bytes22-uint8-[`++extract_22_1++`]]
- :replace_22_1: pass:normal[xref:#Packing-replace_22_1-bytes22-bytes1-uint8-[`++replace_22_1++`]]
- :extract_22_2: pass:normal[xref:#Packing-extract_22_2-bytes22-uint8-[`++extract_22_2++`]]
- :replace_22_2: pass:normal[xref:#Packing-replace_22_2-bytes22-bytes2-uint8-[`++replace_22_2++`]]
- :extract_22_4: pass:normal[xref:#Packing-extract_22_4-bytes22-uint8-[`++extract_22_4++`]]
- :replace_22_4: pass:normal[xref:#Packing-replace_22_4-bytes22-bytes4-uint8-[`++replace_22_4++`]]
- :extract_22_6: pass:normal[xref:#Packing-extract_22_6-bytes22-uint8-[`++extract_22_6++`]]
- :replace_22_6: pass:normal[xref:#Packing-replace_22_6-bytes22-bytes6-uint8-[`++replace_22_6++`]]
- :extract_22_8: pass:normal[xref:#Packing-extract_22_8-bytes22-uint8-[`++extract_22_8++`]]
- :replace_22_8: pass:normal[xref:#Packing-replace_22_8-bytes22-bytes8-uint8-[`++replace_22_8++`]]
- :extract_22_10: pass:normal[xref:#Packing-extract_22_10-bytes22-uint8-[`++extract_22_10++`]]
- :replace_22_10: pass:normal[xref:#Packing-replace_22_10-bytes22-bytes10-uint8-[`++replace_22_10++`]]
- :extract_22_12: pass:normal[xref:#Packing-extract_22_12-bytes22-uint8-[`++extract_22_12++`]]
- :replace_22_12: pass:normal[xref:#Packing-replace_22_12-bytes22-bytes12-uint8-[`++replace_22_12++`]]
- :extract_22_16: pass:normal[xref:#Packing-extract_22_16-bytes22-uint8-[`++extract_22_16++`]]
- :replace_22_16: pass:normal[xref:#Packing-replace_22_16-bytes22-bytes16-uint8-[`++replace_22_16++`]]
- :extract_22_20: pass:normal[xref:#Packing-extract_22_20-bytes22-uint8-[`++extract_22_20++`]]
- :replace_22_20: pass:normal[xref:#Packing-replace_22_20-bytes22-bytes20-uint8-[`++replace_22_20++`]]
- :extract_24_1: pass:normal[xref:#Packing-extract_24_1-bytes24-uint8-[`++extract_24_1++`]]
- :replace_24_1: pass:normal[xref:#Packing-replace_24_1-bytes24-bytes1-uint8-[`++replace_24_1++`]]
- :extract_24_2: pass:normal[xref:#Packing-extract_24_2-bytes24-uint8-[`++extract_24_2++`]]
- :replace_24_2: pass:normal[xref:#Packing-replace_24_2-bytes24-bytes2-uint8-[`++replace_24_2++`]]
- :extract_24_4: pass:normal[xref:#Packing-extract_24_4-bytes24-uint8-[`++extract_24_4++`]]
- :replace_24_4: pass:normal[xref:#Packing-replace_24_4-bytes24-bytes4-uint8-[`++replace_24_4++`]]
- :extract_24_6: pass:normal[xref:#Packing-extract_24_6-bytes24-uint8-[`++extract_24_6++`]]
- :replace_24_6: pass:normal[xref:#Packing-replace_24_6-bytes24-bytes6-uint8-[`++replace_24_6++`]]
- :extract_24_8: pass:normal[xref:#Packing-extract_24_8-bytes24-uint8-[`++extract_24_8++`]]
- :replace_24_8: pass:normal[xref:#Packing-replace_24_8-bytes24-bytes8-uint8-[`++replace_24_8++`]]
- :extract_24_10: pass:normal[xref:#Packing-extract_24_10-bytes24-uint8-[`++extract_24_10++`]]
- :replace_24_10: pass:normal[xref:#Packing-replace_24_10-bytes24-bytes10-uint8-[`++replace_24_10++`]]
- :extract_24_12: pass:normal[xref:#Packing-extract_24_12-bytes24-uint8-[`++extract_24_12++`]]
- :replace_24_12: pass:normal[xref:#Packing-replace_24_12-bytes24-bytes12-uint8-[`++replace_24_12++`]]
- :extract_24_16: pass:normal[xref:#Packing-extract_24_16-bytes24-uint8-[`++extract_24_16++`]]
- :replace_24_16: pass:normal[xref:#Packing-replace_24_16-bytes24-bytes16-uint8-[`++replace_24_16++`]]
- :extract_24_20: pass:normal[xref:#Packing-extract_24_20-bytes24-uint8-[`++extract_24_20++`]]
- :replace_24_20: pass:normal[xref:#Packing-replace_24_20-bytes24-bytes20-uint8-[`++replace_24_20++`]]
- :extract_24_22: pass:normal[xref:#Packing-extract_24_22-bytes24-uint8-[`++extract_24_22++`]]
- :replace_24_22: pass:normal[xref:#Packing-replace_24_22-bytes24-bytes22-uint8-[`++replace_24_22++`]]
- :extract_28_1: pass:normal[xref:#Packing-extract_28_1-bytes28-uint8-[`++extract_28_1++`]]
- :replace_28_1: pass:normal[xref:#Packing-replace_28_1-bytes28-bytes1-uint8-[`++replace_28_1++`]]
- :extract_28_2: pass:normal[xref:#Packing-extract_28_2-bytes28-uint8-[`++extract_28_2++`]]
- :replace_28_2: pass:normal[xref:#Packing-replace_28_2-bytes28-bytes2-uint8-[`++replace_28_2++`]]
- :extract_28_4: pass:normal[xref:#Packing-extract_28_4-bytes28-uint8-[`++extract_28_4++`]]
- :replace_28_4: pass:normal[xref:#Packing-replace_28_4-bytes28-bytes4-uint8-[`++replace_28_4++`]]
- :extract_28_6: pass:normal[xref:#Packing-extract_28_6-bytes28-uint8-[`++extract_28_6++`]]
- :replace_28_6: pass:normal[xref:#Packing-replace_28_6-bytes28-bytes6-uint8-[`++replace_28_6++`]]
- :extract_28_8: pass:normal[xref:#Packing-extract_28_8-bytes28-uint8-[`++extract_28_8++`]]
- :replace_28_8: pass:normal[xref:#Packing-replace_28_8-bytes28-bytes8-uint8-[`++replace_28_8++`]]
- :extract_28_10: pass:normal[xref:#Packing-extract_28_10-bytes28-uint8-[`++extract_28_10++`]]
- :replace_28_10: pass:normal[xref:#Packing-replace_28_10-bytes28-bytes10-uint8-[`++replace_28_10++`]]
- :extract_28_12: pass:normal[xref:#Packing-extract_28_12-bytes28-uint8-[`++extract_28_12++`]]
- :replace_28_12: pass:normal[xref:#Packing-replace_28_12-bytes28-bytes12-uint8-[`++replace_28_12++`]]
- :extract_28_16: pass:normal[xref:#Packing-extract_28_16-bytes28-uint8-[`++extract_28_16++`]]
- :replace_28_16: pass:normal[xref:#Packing-replace_28_16-bytes28-bytes16-uint8-[`++replace_28_16++`]]
- :extract_28_20: pass:normal[xref:#Packing-extract_28_20-bytes28-uint8-[`++extract_28_20++`]]
- :replace_28_20: pass:normal[xref:#Packing-replace_28_20-bytes28-bytes20-uint8-[`++replace_28_20++`]]
- :extract_28_22: pass:normal[xref:#Packing-extract_28_22-bytes28-uint8-[`++extract_28_22++`]]
- :replace_28_22: pass:normal[xref:#Packing-replace_28_22-bytes28-bytes22-uint8-[`++replace_28_22++`]]
- :extract_28_24: pass:normal[xref:#Packing-extract_28_24-bytes28-uint8-[`++extract_28_24++`]]
- :replace_28_24: pass:normal[xref:#Packing-replace_28_24-bytes28-bytes24-uint8-[`++replace_28_24++`]]
- :extract_32_1: pass:normal[xref:#Packing-extract_32_1-bytes32-uint8-[`++extract_32_1++`]]
- :replace_32_1: pass:normal[xref:#Packing-replace_32_1-bytes32-bytes1-uint8-[`++replace_32_1++`]]
- :extract_32_2: pass:normal[xref:#Packing-extract_32_2-bytes32-uint8-[`++extract_32_2++`]]
- :replace_32_2: pass:normal[xref:#Packing-replace_32_2-bytes32-bytes2-uint8-[`++replace_32_2++`]]
- :extract_32_4: pass:normal[xref:#Packing-extract_32_4-bytes32-uint8-[`++extract_32_4++`]]
- :replace_32_4: pass:normal[xref:#Packing-replace_32_4-bytes32-bytes4-uint8-[`++replace_32_4++`]]
- :extract_32_6: pass:normal[xref:#Packing-extract_32_6-bytes32-uint8-[`++extract_32_6++`]]
- :replace_32_6: pass:normal[xref:#Packing-replace_32_6-bytes32-bytes6-uint8-[`++replace_32_6++`]]
- :extract_32_8: pass:normal[xref:#Packing-extract_32_8-bytes32-uint8-[`++extract_32_8++`]]
- :replace_32_8: pass:normal[xref:#Packing-replace_32_8-bytes32-bytes8-uint8-[`++replace_32_8++`]]
- :extract_32_10: pass:normal[xref:#Packing-extract_32_10-bytes32-uint8-[`++extract_32_10++`]]
- :replace_32_10: pass:normal[xref:#Packing-replace_32_10-bytes32-bytes10-uint8-[`++replace_32_10++`]]
- :extract_32_12: pass:normal[xref:#Packing-extract_32_12-bytes32-uint8-[`++extract_32_12++`]]
- :replace_32_12: pass:normal[xref:#Packing-replace_32_12-bytes32-bytes12-uint8-[`++replace_32_12++`]]
- :extract_32_16: pass:normal[xref:#Packing-extract_32_16-bytes32-uint8-[`++extract_32_16++`]]
- :replace_32_16: pass:normal[xref:#Packing-replace_32_16-bytes32-bytes16-uint8-[`++replace_32_16++`]]
- :extract_32_20: pass:normal[xref:#Packing-extract_32_20-bytes32-uint8-[`++extract_32_20++`]]
- :replace_32_20: pass:normal[xref:#Packing-replace_32_20-bytes32-bytes20-uint8-[`++replace_32_20++`]]
- :extract_32_22: pass:normal[xref:#Packing-extract_32_22-bytes32-uint8-[`++extract_32_22++`]]
- :replace_32_22: pass:normal[xref:#Packing-replace_32_22-bytes32-bytes22-uint8-[`++replace_32_22++`]]
- :extract_32_24: pass:normal[xref:#Packing-extract_32_24-bytes32-uint8-[`++extract_32_24++`]]
- :replace_32_24: pass:normal[xref:#Packing-replace_32_24-bytes32-bytes24-uint8-[`++replace_32_24++`]]
- :extract_32_28: pass:normal[xref:#Packing-extract_32_28-bytes32-uint8-[`++extract_32_28++`]]
- :replace_32_28: pass:normal[xref:#Packing-replace_32_28-bytes32-bytes28-uint8-[`++replace_32_28++`]]
- :pack_1_1-bytes1-bytes1: pass:normal[xref:#Packing-pack_1_1-bytes1-bytes1-[`++pack_1_1++`]]
- :pack_2_2-bytes2-bytes2: pass:normal[xref:#Packing-pack_2_2-bytes2-bytes2-[`++pack_2_2++`]]
- :pack_2_4-bytes2-bytes4: pass:normal[xref:#Packing-pack_2_4-bytes2-bytes4-[`++pack_2_4++`]]
- :pack_2_6-bytes2-bytes6: pass:normal[xref:#Packing-pack_2_6-bytes2-bytes6-[`++pack_2_6++`]]
- :pack_2_8-bytes2-bytes8: pass:normal[xref:#Packing-pack_2_8-bytes2-bytes8-[`++pack_2_8++`]]
- :pack_2_10-bytes2-bytes10: pass:normal[xref:#Packing-pack_2_10-bytes2-bytes10-[`++pack_2_10++`]]
- :pack_2_20-bytes2-bytes20: pass:normal[xref:#Packing-pack_2_20-bytes2-bytes20-[`++pack_2_20++`]]
- :pack_2_22-bytes2-bytes22: pass:normal[xref:#Packing-pack_2_22-bytes2-bytes22-[`++pack_2_22++`]]
- :pack_4_2-bytes4-bytes2: pass:normal[xref:#Packing-pack_4_2-bytes4-bytes2-[`++pack_4_2++`]]
- :pack_4_4-bytes4-bytes4: pass:normal[xref:#Packing-pack_4_4-bytes4-bytes4-[`++pack_4_4++`]]
- :pack_4_6-bytes4-bytes6: pass:normal[xref:#Packing-pack_4_6-bytes4-bytes6-[`++pack_4_6++`]]
- :pack_4_8-bytes4-bytes8: pass:normal[xref:#Packing-pack_4_8-bytes4-bytes8-[`++pack_4_8++`]]
- :pack_4_12-bytes4-bytes12: pass:normal[xref:#Packing-pack_4_12-bytes4-bytes12-[`++pack_4_12++`]]
- :pack_4_16-bytes4-bytes16: pass:normal[xref:#Packing-pack_4_16-bytes4-bytes16-[`++pack_4_16++`]]
- :pack_4_20-bytes4-bytes20: pass:normal[xref:#Packing-pack_4_20-bytes4-bytes20-[`++pack_4_20++`]]
- :pack_4_24-bytes4-bytes24: pass:normal[xref:#Packing-pack_4_24-bytes4-bytes24-[`++pack_4_24++`]]
- :pack_4_28-bytes4-bytes28: pass:normal[xref:#Packing-pack_4_28-bytes4-bytes28-[`++pack_4_28++`]]
- :pack_6_2-bytes6-bytes2: pass:normal[xref:#Packing-pack_6_2-bytes6-bytes2-[`++pack_6_2++`]]
- :pack_6_4-bytes6-bytes4: pass:normal[xref:#Packing-pack_6_4-bytes6-bytes4-[`++pack_6_4++`]]
- :pack_6_6-bytes6-bytes6: pass:normal[xref:#Packing-pack_6_6-bytes6-bytes6-[`++pack_6_6++`]]
- :pack_6_10-bytes6-bytes10: pass:normal[xref:#Packing-pack_6_10-bytes6-bytes10-[`++pack_6_10++`]]
- :pack_6_16-bytes6-bytes16: pass:normal[xref:#Packing-pack_6_16-bytes6-bytes16-[`++pack_6_16++`]]
- :pack_6_22-bytes6-bytes22: pass:normal[xref:#Packing-pack_6_22-bytes6-bytes22-[`++pack_6_22++`]]
- :pack_8_2-bytes8-bytes2: pass:normal[xref:#Packing-pack_8_2-bytes8-bytes2-[`++pack_8_2++`]]
- :pack_8_4-bytes8-bytes4: pass:normal[xref:#Packing-pack_8_4-bytes8-bytes4-[`++pack_8_4++`]]
- :pack_8_8-bytes8-bytes8: pass:normal[xref:#Packing-pack_8_8-bytes8-bytes8-[`++pack_8_8++`]]
- :pack_8_12-bytes8-bytes12: pass:normal[xref:#Packing-pack_8_12-bytes8-bytes12-[`++pack_8_12++`]]
- :pack_8_16-bytes8-bytes16: pass:normal[xref:#Packing-pack_8_16-bytes8-bytes16-[`++pack_8_16++`]]
- :pack_8_20-bytes8-bytes20: pass:normal[xref:#Packing-pack_8_20-bytes8-bytes20-[`++pack_8_20++`]]
- :pack_8_24-bytes8-bytes24: pass:normal[xref:#Packing-pack_8_24-bytes8-bytes24-[`++pack_8_24++`]]
- :pack_10_2-bytes10-bytes2: pass:normal[xref:#Packing-pack_10_2-bytes10-bytes2-[`++pack_10_2++`]]
- :pack_10_6-bytes10-bytes6: pass:normal[xref:#Packing-pack_10_6-bytes10-bytes6-[`++pack_10_6++`]]
- :pack_10_10-bytes10-bytes10: pass:normal[xref:#Packing-pack_10_10-bytes10-bytes10-[`++pack_10_10++`]]
- :pack_10_12-bytes10-bytes12: pass:normal[xref:#Packing-pack_10_12-bytes10-bytes12-[`++pack_10_12++`]]
- :pack_10_22-bytes10-bytes22: pass:normal[xref:#Packing-pack_10_22-bytes10-bytes22-[`++pack_10_22++`]]
- :pack_12_4-bytes12-bytes4: pass:normal[xref:#Packing-pack_12_4-bytes12-bytes4-[`++pack_12_4++`]]
- :pack_12_8-bytes12-bytes8: pass:normal[xref:#Packing-pack_12_8-bytes12-bytes8-[`++pack_12_8++`]]
- :pack_12_10-bytes12-bytes10: pass:normal[xref:#Packing-pack_12_10-bytes12-bytes10-[`++pack_12_10++`]]
- :pack_12_12-bytes12-bytes12: pass:normal[xref:#Packing-pack_12_12-bytes12-bytes12-[`++pack_12_12++`]]
- :pack_12_16-bytes12-bytes16: pass:normal[xref:#Packing-pack_12_16-bytes12-bytes16-[`++pack_12_16++`]]
- :pack_12_20-bytes12-bytes20: pass:normal[xref:#Packing-pack_12_20-bytes12-bytes20-[`++pack_12_20++`]]
- :pack_16_4-bytes16-bytes4: pass:normal[xref:#Packing-pack_16_4-bytes16-bytes4-[`++pack_16_4++`]]
- :pack_16_6-bytes16-bytes6: pass:normal[xref:#Packing-pack_16_6-bytes16-bytes6-[`++pack_16_6++`]]
- :pack_16_8-bytes16-bytes8: pass:normal[xref:#Packing-pack_16_8-bytes16-bytes8-[`++pack_16_8++`]]
- :pack_16_12-bytes16-bytes12: pass:normal[xref:#Packing-pack_16_12-bytes16-bytes12-[`++pack_16_12++`]]
- :pack_16_16-bytes16-bytes16: pass:normal[xref:#Packing-pack_16_16-bytes16-bytes16-[`++pack_16_16++`]]
- :pack_20_2-bytes20-bytes2: pass:normal[xref:#Packing-pack_20_2-bytes20-bytes2-[`++pack_20_2++`]]
- :pack_20_4-bytes20-bytes4: pass:normal[xref:#Packing-pack_20_4-bytes20-bytes4-[`++pack_20_4++`]]
- :pack_20_8-bytes20-bytes8: pass:normal[xref:#Packing-pack_20_8-bytes20-bytes8-[`++pack_20_8++`]]
- :pack_20_12-bytes20-bytes12: pass:normal[xref:#Packing-pack_20_12-bytes20-bytes12-[`++pack_20_12++`]]
- :pack_22_2-bytes22-bytes2: pass:normal[xref:#Packing-pack_22_2-bytes22-bytes2-[`++pack_22_2++`]]
- :pack_22_6-bytes22-bytes6: pass:normal[xref:#Packing-pack_22_6-bytes22-bytes6-[`++pack_22_6++`]]
- :pack_22_10-bytes22-bytes10: pass:normal[xref:#Packing-pack_22_10-bytes22-bytes10-[`++pack_22_10++`]]
- :pack_24_4-bytes24-bytes4: pass:normal[xref:#Packing-pack_24_4-bytes24-bytes4-[`++pack_24_4++`]]
- :pack_24_8-bytes24-bytes8: pass:normal[xref:#Packing-pack_24_8-bytes24-bytes8-[`++pack_24_8++`]]
- :pack_28_4-bytes28-bytes4: pass:normal[xref:#Packing-pack_28_4-bytes28-bytes4-[`++pack_28_4++`]]
- :extract_2_1-bytes2-uint8: pass:normal[xref:#Packing-extract_2_1-bytes2-uint8-[`++extract_2_1++`]]
- :replace_2_1-bytes2-bytes1-uint8: pass:normal[xref:#Packing-replace_2_1-bytes2-bytes1-uint8-[`++replace_2_1++`]]
- :extract_4_1-bytes4-uint8: pass:normal[xref:#Packing-extract_4_1-bytes4-uint8-[`++extract_4_1++`]]
- :replace_4_1-bytes4-bytes1-uint8: pass:normal[xref:#Packing-replace_4_1-bytes4-bytes1-uint8-[`++replace_4_1++`]]
- :extract_4_2-bytes4-uint8: pass:normal[xref:#Packing-extract_4_2-bytes4-uint8-[`++extract_4_2++`]]
- :replace_4_2-bytes4-bytes2-uint8: pass:normal[xref:#Packing-replace_4_2-bytes4-bytes2-uint8-[`++replace_4_2++`]]
- :extract_6_1-bytes6-uint8: pass:normal[xref:#Packing-extract_6_1-bytes6-uint8-[`++extract_6_1++`]]
- :replace_6_1-bytes6-bytes1-uint8: pass:normal[xref:#Packing-replace_6_1-bytes6-bytes1-uint8-[`++replace_6_1++`]]
- :extract_6_2-bytes6-uint8: pass:normal[xref:#Packing-extract_6_2-bytes6-uint8-[`++extract_6_2++`]]
- :replace_6_2-bytes6-bytes2-uint8: pass:normal[xref:#Packing-replace_6_2-bytes6-bytes2-uint8-[`++replace_6_2++`]]
- :extract_6_4-bytes6-uint8: pass:normal[xref:#Packing-extract_6_4-bytes6-uint8-[`++extract_6_4++`]]
- :replace_6_4-bytes6-bytes4-uint8: pass:normal[xref:#Packing-replace_6_4-bytes6-bytes4-uint8-[`++replace_6_4++`]]
- :extract_8_1-bytes8-uint8: pass:normal[xref:#Packing-extract_8_1-bytes8-uint8-[`++extract_8_1++`]]
- :replace_8_1-bytes8-bytes1-uint8: pass:normal[xref:#Packing-replace_8_1-bytes8-bytes1-uint8-[`++replace_8_1++`]]
- :extract_8_2-bytes8-uint8: pass:normal[xref:#Packing-extract_8_2-bytes8-uint8-[`++extract_8_2++`]]
- :replace_8_2-bytes8-bytes2-uint8: pass:normal[xref:#Packing-replace_8_2-bytes8-bytes2-uint8-[`++replace_8_2++`]]
- :extract_8_4-bytes8-uint8: pass:normal[xref:#Packing-extract_8_4-bytes8-uint8-[`++extract_8_4++`]]
- :replace_8_4-bytes8-bytes4-uint8: pass:normal[xref:#Packing-replace_8_4-bytes8-bytes4-uint8-[`++replace_8_4++`]]
- :extract_8_6-bytes8-uint8: pass:normal[xref:#Packing-extract_8_6-bytes8-uint8-[`++extract_8_6++`]]
- :replace_8_6-bytes8-bytes6-uint8: pass:normal[xref:#Packing-replace_8_6-bytes8-bytes6-uint8-[`++replace_8_6++`]]
- :extract_10_1-bytes10-uint8: pass:normal[xref:#Packing-extract_10_1-bytes10-uint8-[`++extract_10_1++`]]
- :replace_10_1-bytes10-bytes1-uint8: pass:normal[xref:#Packing-replace_10_1-bytes10-bytes1-uint8-[`++replace_10_1++`]]
- :extract_10_2-bytes10-uint8: pass:normal[xref:#Packing-extract_10_2-bytes10-uint8-[`++extract_10_2++`]]
- :replace_10_2-bytes10-bytes2-uint8: pass:normal[xref:#Packing-replace_10_2-bytes10-bytes2-uint8-[`++replace_10_2++`]]
- :extract_10_4-bytes10-uint8: pass:normal[xref:#Packing-extract_10_4-bytes10-uint8-[`++extract_10_4++`]]
- :replace_10_4-bytes10-bytes4-uint8: pass:normal[xref:#Packing-replace_10_4-bytes10-bytes4-uint8-[`++replace_10_4++`]]
- :extract_10_6-bytes10-uint8: pass:normal[xref:#Packing-extract_10_6-bytes10-uint8-[`++extract_10_6++`]]
- :replace_10_6-bytes10-bytes6-uint8: pass:normal[xref:#Packing-replace_10_6-bytes10-bytes6-uint8-[`++replace_10_6++`]]
- :extract_10_8-bytes10-uint8: pass:normal[xref:#Packing-extract_10_8-bytes10-uint8-[`++extract_10_8++`]]
- :replace_10_8-bytes10-bytes8-uint8: pass:normal[xref:#Packing-replace_10_8-bytes10-bytes8-uint8-[`++replace_10_8++`]]
- :extract_12_1-bytes12-uint8: pass:normal[xref:#Packing-extract_12_1-bytes12-uint8-[`++extract_12_1++`]]
- :replace_12_1-bytes12-bytes1-uint8: pass:normal[xref:#Packing-replace_12_1-bytes12-bytes1-uint8-[`++replace_12_1++`]]
- :extract_12_2-bytes12-uint8: pass:normal[xref:#Packing-extract_12_2-bytes12-uint8-[`++extract_12_2++`]]
- :replace_12_2-bytes12-bytes2-uint8: pass:normal[xref:#Packing-replace_12_2-bytes12-bytes2-uint8-[`++replace_12_2++`]]
- :extract_12_4-bytes12-uint8: pass:normal[xref:#Packing-extract_12_4-bytes12-uint8-[`++extract_12_4++`]]
- :replace_12_4-bytes12-bytes4-uint8: pass:normal[xref:#Packing-replace_12_4-bytes12-bytes4-uint8-[`++replace_12_4++`]]
- :extract_12_6-bytes12-uint8: pass:normal[xref:#Packing-extract_12_6-bytes12-uint8-[`++extract_12_6++`]]
- :replace_12_6-bytes12-bytes6-uint8: pass:normal[xref:#Packing-replace_12_6-bytes12-bytes6-uint8-[`++replace_12_6++`]]
- :extract_12_8-bytes12-uint8: pass:normal[xref:#Packing-extract_12_8-bytes12-uint8-[`++extract_12_8++`]]
- :replace_12_8-bytes12-bytes8-uint8: pass:normal[xref:#Packing-replace_12_8-bytes12-bytes8-uint8-[`++replace_12_8++`]]
- :extract_12_10-bytes12-uint8: pass:normal[xref:#Packing-extract_12_10-bytes12-uint8-[`++extract_12_10++`]]
- :replace_12_10-bytes12-bytes10-uint8: pass:normal[xref:#Packing-replace_12_10-bytes12-bytes10-uint8-[`++replace_12_10++`]]
- :extract_16_1-bytes16-uint8: pass:normal[xref:#Packing-extract_16_1-bytes16-uint8-[`++extract_16_1++`]]
- :replace_16_1-bytes16-bytes1-uint8: pass:normal[xref:#Packing-replace_16_1-bytes16-bytes1-uint8-[`++replace_16_1++`]]
- :extract_16_2-bytes16-uint8: pass:normal[xref:#Packing-extract_16_2-bytes16-uint8-[`++extract_16_2++`]]
- :replace_16_2-bytes16-bytes2-uint8: pass:normal[xref:#Packing-replace_16_2-bytes16-bytes2-uint8-[`++replace_16_2++`]]
- :extract_16_4-bytes16-uint8: pass:normal[xref:#Packing-extract_16_4-bytes16-uint8-[`++extract_16_4++`]]
- :replace_16_4-bytes16-bytes4-uint8: pass:normal[xref:#Packing-replace_16_4-bytes16-bytes4-uint8-[`++replace_16_4++`]]
- :extract_16_6-bytes16-uint8: pass:normal[xref:#Packing-extract_16_6-bytes16-uint8-[`++extract_16_6++`]]
- :replace_16_6-bytes16-bytes6-uint8: pass:normal[xref:#Packing-replace_16_6-bytes16-bytes6-uint8-[`++replace_16_6++`]]
- :extract_16_8-bytes16-uint8: pass:normal[xref:#Packing-extract_16_8-bytes16-uint8-[`++extract_16_8++`]]
- :replace_16_8-bytes16-bytes8-uint8: pass:normal[xref:#Packing-replace_16_8-bytes16-bytes8-uint8-[`++replace_16_8++`]]
- :extract_16_10-bytes16-uint8: pass:normal[xref:#Packing-extract_16_10-bytes16-uint8-[`++extract_16_10++`]]
- :replace_16_10-bytes16-bytes10-uint8: pass:normal[xref:#Packing-replace_16_10-bytes16-bytes10-uint8-[`++replace_16_10++`]]
- :extract_16_12-bytes16-uint8: pass:normal[xref:#Packing-extract_16_12-bytes16-uint8-[`++extract_16_12++`]]
- :replace_16_12-bytes16-bytes12-uint8: pass:normal[xref:#Packing-replace_16_12-bytes16-bytes12-uint8-[`++replace_16_12++`]]
- :extract_20_1-bytes20-uint8: pass:normal[xref:#Packing-extract_20_1-bytes20-uint8-[`++extract_20_1++`]]
- :replace_20_1-bytes20-bytes1-uint8: pass:normal[xref:#Packing-replace_20_1-bytes20-bytes1-uint8-[`++replace_20_1++`]]
- :extract_20_2-bytes20-uint8: pass:normal[xref:#Packing-extract_20_2-bytes20-uint8-[`++extract_20_2++`]]
- :replace_20_2-bytes20-bytes2-uint8: pass:normal[xref:#Packing-replace_20_2-bytes20-bytes2-uint8-[`++replace_20_2++`]]
- :extract_20_4-bytes20-uint8: pass:normal[xref:#Packing-extract_20_4-bytes20-uint8-[`++extract_20_4++`]]
- :replace_20_4-bytes20-bytes4-uint8: pass:normal[xref:#Packing-replace_20_4-bytes20-bytes4-uint8-[`++replace_20_4++`]]
- :extract_20_6-bytes20-uint8: pass:normal[xref:#Packing-extract_20_6-bytes20-uint8-[`++extract_20_6++`]]
- :replace_20_6-bytes20-bytes6-uint8: pass:normal[xref:#Packing-replace_20_6-bytes20-bytes6-uint8-[`++replace_20_6++`]]
- :extract_20_8-bytes20-uint8: pass:normal[xref:#Packing-extract_20_8-bytes20-uint8-[`++extract_20_8++`]]
- :replace_20_8-bytes20-bytes8-uint8: pass:normal[xref:#Packing-replace_20_8-bytes20-bytes8-uint8-[`++replace_20_8++`]]
- :extract_20_10-bytes20-uint8: pass:normal[xref:#Packing-extract_20_10-bytes20-uint8-[`++extract_20_10++`]]
- :replace_20_10-bytes20-bytes10-uint8: pass:normal[xref:#Packing-replace_20_10-bytes20-bytes10-uint8-[`++replace_20_10++`]]
- :extract_20_12-bytes20-uint8: pass:normal[xref:#Packing-extract_20_12-bytes20-uint8-[`++extract_20_12++`]]
- :replace_20_12-bytes20-bytes12-uint8: pass:normal[xref:#Packing-replace_20_12-bytes20-bytes12-uint8-[`++replace_20_12++`]]
- :extract_20_16-bytes20-uint8: pass:normal[xref:#Packing-extract_20_16-bytes20-uint8-[`++extract_20_16++`]]
- :replace_20_16-bytes20-bytes16-uint8: pass:normal[xref:#Packing-replace_20_16-bytes20-bytes16-uint8-[`++replace_20_16++`]]
- :extract_22_1-bytes22-uint8: pass:normal[xref:#Packing-extract_22_1-bytes22-uint8-[`++extract_22_1++`]]
- :replace_22_1-bytes22-bytes1-uint8: pass:normal[xref:#Packing-replace_22_1-bytes22-bytes1-uint8-[`++replace_22_1++`]]
- :extract_22_2-bytes22-uint8: pass:normal[xref:#Packing-extract_22_2-bytes22-uint8-[`++extract_22_2++`]]
- :replace_22_2-bytes22-bytes2-uint8: pass:normal[xref:#Packing-replace_22_2-bytes22-bytes2-uint8-[`++replace_22_2++`]]
- :extract_22_4-bytes22-uint8: pass:normal[xref:#Packing-extract_22_4-bytes22-uint8-[`++extract_22_4++`]]
- :replace_22_4-bytes22-bytes4-uint8: pass:normal[xref:#Packing-replace_22_4-bytes22-bytes4-uint8-[`++replace_22_4++`]]
- :extract_22_6-bytes22-uint8: pass:normal[xref:#Packing-extract_22_6-bytes22-uint8-[`++extract_22_6++`]]
- :replace_22_6-bytes22-bytes6-uint8: pass:normal[xref:#Packing-replace_22_6-bytes22-bytes6-uint8-[`++replace_22_6++`]]
- :extract_22_8-bytes22-uint8: pass:normal[xref:#Packing-extract_22_8-bytes22-uint8-[`++extract_22_8++`]]
- :replace_22_8-bytes22-bytes8-uint8: pass:normal[xref:#Packing-replace_22_8-bytes22-bytes8-uint8-[`++replace_22_8++`]]
- :extract_22_10-bytes22-uint8: pass:normal[xref:#Packing-extract_22_10-bytes22-uint8-[`++extract_22_10++`]]
- :replace_22_10-bytes22-bytes10-uint8: pass:normal[xref:#Packing-replace_22_10-bytes22-bytes10-uint8-[`++replace_22_10++`]]
- :extract_22_12-bytes22-uint8: pass:normal[xref:#Packing-extract_22_12-bytes22-uint8-[`++extract_22_12++`]]
- :replace_22_12-bytes22-bytes12-uint8: pass:normal[xref:#Packing-replace_22_12-bytes22-bytes12-uint8-[`++replace_22_12++`]]
- :extract_22_16-bytes22-uint8: pass:normal[xref:#Packing-extract_22_16-bytes22-uint8-[`++extract_22_16++`]]
- :replace_22_16-bytes22-bytes16-uint8: pass:normal[xref:#Packing-replace_22_16-bytes22-bytes16-uint8-[`++replace_22_16++`]]
- :extract_22_20-bytes22-uint8: pass:normal[xref:#Packing-extract_22_20-bytes22-uint8-[`++extract_22_20++`]]
- :replace_22_20-bytes22-bytes20-uint8: pass:normal[xref:#Packing-replace_22_20-bytes22-bytes20-uint8-[`++replace_22_20++`]]
- :extract_24_1-bytes24-uint8: pass:normal[xref:#Packing-extract_24_1-bytes24-uint8-[`++extract_24_1++`]]
- :replace_24_1-bytes24-bytes1-uint8: pass:normal[xref:#Packing-replace_24_1-bytes24-bytes1-uint8-[`++replace_24_1++`]]
- :extract_24_2-bytes24-uint8: pass:normal[xref:#Packing-extract_24_2-bytes24-uint8-[`++extract_24_2++`]]
- :replace_24_2-bytes24-bytes2-uint8: pass:normal[xref:#Packing-replace_24_2-bytes24-bytes2-uint8-[`++replace_24_2++`]]
- :extract_24_4-bytes24-uint8: pass:normal[xref:#Packing-extract_24_4-bytes24-uint8-[`++extract_24_4++`]]
- :replace_24_4-bytes24-bytes4-uint8: pass:normal[xref:#Packing-replace_24_4-bytes24-bytes4-uint8-[`++replace_24_4++`]]
- :extract_24_6-bytes24-uint8: pass:normal[xref:#Packing-extract_24_6-bytes24-uint8-[`++extract_24_6++`]]
- :replace_24_6-bytes24-bytes6-uint8: pass:normal[xref:#Packing-replace_24_6-bytes24-bytes6-uint8-[`++replace_24_6++`]]
- :extract_24_8-bytes24-uint8: pass:normal[xref:#Packing-extract_24_8-bytes24-uint8-[`++extract_24_8++`]]
- :replace_24_8-bytes24-bytes8-uint8: pass:normal[xref:#Packing-replace_24_8-bytes24-bytes8-uint8-[`++replace_24_8++`]]
- :extract_24_10-bytes24-uint8: pass:normal[xref:#Packing-extract_24_10-bytes24-uint8-[`++extract_24_10++`]]
- :replace_24_10-bytes24-bytes10-uint8: pass:normal[xref:#Packing-replace_24_10-bytes24-bytes10-uint8-[`++replace_24_10++`]]
- :extract_24_12-bytes24-uint8: pass:normal[xref:#Packing-extract_24_12-bytes24-uint8-[`++extract_24_12++`]]
- :replace_24_12-bytes24-bytes12-uint8: pass:normal[xref:#Packing-replace_24_12-bytes24-bytes12-uint8-[`++replace_24_12++`]]
- :extract_24_16-bytes24-uint8: pass:normal[xref:#Packing-extract_24_16-bytes24-uint8-[`++extract_24_16++`]]
- :replace_24_16-bytes24-bytes16-uint8: pass:normal[xref:#Packing-replace_24_16-bytes24-bytes16-uint8-[`++replace_24_16++`]]
- :extract_24_20-bytes24-uint8: pass:normal[xref:#Packing-extract_24_20-bytes24-uint8-[`++extract_24_20++`]]
- :replace_24_20-bytes24-bytes20-uint8: pass:normal[xref:#Packing-replace_24_20-bytes24-bytes20-uint8-[`++replace_24_20++`]]
- :extract_24_22-bytes24-uint8: pass:normal[xref:#Packing-extract_24_22-bytes24-uint8-[`++extract_24_22++`]]
- :replace_24_22-bytes24-bytes22-uint8: pass:normal[xref:#Packing-replace_24_22-bytes24-bytes22-uint8-[`++replace_24_22++`]]
- :extract_28_1-bytes28-uint8: pass:normal[xref:#Packing-extract_28_1-bytes28-uint8-[`++extract_28_1++`]]
- :replace_28_1-bytes28-bytes1-uint8: pass:normal[xref:#Packing-replace_28_1-bytes28-bytes1-uint8-[`++replace_28_1++`]]
- :extract_28_2-bytes28-uint8: pass:normal[xref:#Packing-extract_28_2-bytes28-uint8-[`++extract_28_2++`]]
- :replace_28_2-bytes28-bytes2-uint8: pass:normal[xref:#Packing-replace_28_2-bytes28-bytes2-uint8-[`++replace_28_2++`]]
- :extract_28_4-bytes28-uint8: pass:normal[xref:#Packing-extract_28_4-bytes28-uint8-[`++extract_28_4++`]]
- :replace_28_4-bytes28-bytes4-uint8: pass:normal[xref:#Packing-replace_28_4-bytes28-bytes4-uint8-[`++replace_28_4++`]]
- :extract_28_6-bytes28-uint8: pass:normal[xref:#Packing-extract_28_6-bytes28-uint8-[`++extract_28_6++`]]
- :replace_28_6-bytes28-bytes6-uint8: pass:normal[xref:#Packing-replace_28_6-bytes28-bytes6-uint8-[`++replace_28_6++`]]
- :extract_28_8-bytes28-uint8: pass:normal[xref:#Packing-extract_28_8-bytes28-uint8-[`++extract_28_8++`]]
- :replace_28_8-bytes28-bytes8-uint8: pass:normal[xref:#Packing-replace_28_8-bytes28-bytes8-uint8-[`++replace_28_8++`]]
- :extract_28_10-bytes28-uint8: pass:normal[xref:#Packing-extract_28_10-bytes28-uint8-[`++extract_28_10++`]]
- :replace_28_10-bytes28-bytes10-uint8: pass:normal[xref:#Packing-replace_28_10-bytes28-bytes10-uint8-[`++replace_28_10++`]]
- :extract_28_12-bytes28-uint8: pass:normal[xref:#Packing-extract_28_12-bytes28-uint8-[`++extract_28_12++`]]
- :replace_28_12-bytes28-bytes12-uint8: pass:normal[xref:#Packing-replace_28_12-bytes28-bytes12-uint8-[`++replace_28_12++`]]
- :extract_28_16-bytes28-uint8: pass:normal[xref:#Packing-extract_28_16-bytes28-uint8-[`++extract_28_16++`]]
- :replace_28_16-bytes28-bytes16-uint8: pass:normal[xref:#Packing-replace_28_16-bytes28-bytes16-uint8-[`++replace_28_16++`]]
- :extract_28_20-bytes28-uint8: pass:normal[xref:#Packing-extract_28_20-bytes28-uint8-[`++extract_28_20++`]]
- :replace_28_20-bytes28-bytes20-uint8: pass:normal[xref:#Packing-replace_28_20-bytes28-bytes20-uint8-[`++replace_28_20++`]]
- :extract_28_22-bytes28-uint8: pass:normal[xref:#Packing-extract_28_22-bytes28-uint8-[`++extract_28_22++`]]
- :replace_28_22-bytes28-bytes22-uint8: pass:normal[xref:#Packing-replace_28_22-bytes28-bytes22-uint8-[`++replace_28_22++`]]
- :extract_28_24-bytes28-uint8: pass:normal[xref:#Packing-extract_28_24-bytes28-uint8-[`++extract_28_24++`]]
- :replace_28_24-bytes28-bytes24-uint8: pass:normal[xref:#Packing-replace_28_24-bytes28-bytes24-uint8-[`++replace_28_24++`]]
- :extract_32_1-bytes32-uint8: pass:normal[xref:#Packing-extract_32_1-bytes32-uint8-[`++extract_32_1++`]]
- :replace_32_1-bytes32-bytes1-uint8: pass:normal[xref:#Packing-replace_32_1-bytes32-bytes1-uint8-[`++replace_32_1++`]]
- :extract_32_2-bytes32-uint8: pass:normal[xref:#Packing-extract_32_2-bytes32-uint8-[`++extract_32_2++`]]
- :replace_32_2-bytes32-bytes2-uint8: pass:normal[xref:#Packing-replace_32_2-bytes32-bytes2-uint8-[`++replace_32_2++`]]
- :extract_32_4-bytes32-uint8: pass:normal[xref:#Packing-extract_32_4-bytes32-uint8-[`++extract_32_4++`]]
- :replace_32_4-bytes32-bytes4-uint8: pass:normal[xref:#Packing-replace_32_4-bytes32-bytes4-uint8-[`++replace_32_4++`]]
- :extract_32_6-bytes32-uint8: pass:normal[xref:#Packing-extract_32_6-bytes32-uint8-[`++extract_32_6++`]]
- :replace_32_6-bytes32-bytes6-uint8: pass:normal[xref:#Packing-replace_32_6-bytes32-bytes6-uint8-[`++replace_32_6++`]]
- :extract_32_8-bytes32-uint8: pass:normal[xref:#Packing-extract_32_8-bytes32-uint8-[`++extract_32_8++`]]
- :replace_32_8-bytes32-bytes8-uint8: pass:normal[xref:#Packing-replace_32_8-bytes32-bytes8-uint8-[`++replace_32_8++`]]
- :extract_32_10-bytes32-uint8: pass:normal[xref:#Packing-extract_32_10-bytes32-uint8-[`++extract_32_10++`]]
- :replace_32_10-bytes32-bytes10-uint8: pass:normal[xref:#Packing-replace_32_10-bytes32-bytes10-uint8-[`++replace_32_10++`]]
- :extract_32_12-bytes32-uint8: pass:normal[xref:#Packing-extract_32_12-bytes32-uint8-[`++extract_32_12++`]]
- :replace_32_12-bytes32-bytes12-uint8: pass:normal[xref:#Packing-replace_32_12-bytes32-bytes12-uint8-[`++replace_32_12++`]]
- :extract_32_16-bytes32-uint8: pass:normal[xref:#Packing-extract_32_16-bytes32-uint8-[`++extract_32_16++`]]
- :replace_32_16-bytes32-bytes16-uint8: pass:normal[xref:#Packing-replace_32_16-bytes32-bytes16-uint8-[`++replace_32_16++`]]
- :extract_32_20-bytes32-uint8: pass:normal[xref:#Packing-extract_32_20-bytes32-uint8-[`++extract_32_20++`]]
- :replace_32_20-bytes32-bytes20-uint8: pass:normal[xref:#Packing-replace_32_20-bytes32-bytes20-uint8-[`++replace_32_20++`]]
- :extract_32_22-bytes32-uint8: pass:normal[xref:#Packing-extract_32_22-bytes32-uint8-[`++extract_32_22++`]]
- :replace_32_22-bytes32-bytes22-uint8: pass:normal[xref:#Packing-replace_32_22-bytes32-bytes22-uint8-[`++replace_32_22++`]]
- :extract_32_24-bytes32-uint8: pass:normal[xref:#Packing-extract_32_24-bytes32-uint8-[`++extract_32_24++`]]
- :replace_32_24-bytes32-bytes24-uint8: pass:normal[xref:#Packing-replace_32_24-bytes32-bytes24-uint8-[`++replace_32_24++`]]
- :extract_32_28-bytes32-uint8: pass:normal[xref:#Packing-extract_32_28-bytes32-uint8-[`++extract_32_28++`]]
- :replace_32_28-bytes32-bytes28-uint8: pass:normal[xref:#Packing-replace_32_28-bytes32-bytes28-uint8-[`++replace_32_28++`]]
- [.contract]
- [[Packing]]
- === `++Packing++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Packing.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Packing.sol";
- ```
- Helper library packing and unpacking multiple values into bytesXX.
- Example usage:
- ```solidity
- library MyPacker {
- type MyType is bytes32;
- function _pack(address account, bytes4 selector, uint64 period) external pure returns (MyType) {
- bytes12 subpack = Packing.pack_4_8(selector, bytes8(period));
- bytes32 pack = Packing.pack_20_12(bytes20(account), subpack);
- return MyType.wrap(pack);
- }
- function _unpack(MyType self) external pure returns (address, bytes4, uint64) {
- bytes32 pack = MyType.unwrap(self);
- return (
- address(Packing.extract_32_20(pack, 0)),
- Packing.extract_32_4(pack, 20),
- uint64(Packing.extract_32_8(pack, 24))
- );
- }
- }
- ```
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-Packing-pack_1_1-bytes1-bytes1-}[`++pack_1_1(left, right)++`]
- * {xref-Packing-pack_2_2-bytes2-bytes2-}[`++pack_2_2(left, right)++`]
- * {xref-Packing-pack_2_4-bytes2-bytes4-}[`++pack_2_4(left, right)++`]
- * {xref-Packing-pack_2_6-bytes2-bytes6-}[`++pack_2_6(left, right)++`]
- * {xref-Packing-pack_2_8-bytes2-bytes8-}[`++pack_2_8(left, right)++`]
- * {xref-Packing-pack_2_10-bytes2-bytes10-}[`++pack_2_10(left, right)++`]
- * {xref-Packing-pack_2_20-bytes2-bytes20-}[`++pack_2_20(left, right)++`]
- * {xref-Packing-pack_2_22-bytes2-bytes22-}[`++pack_2_22(left, right)++`]
- * {xref-Packing-pack_4_2-bytes4-bytes2-}[`++pack_4_2(left, right)++`]
- * {xref-Packing-pack_4_4-bytes4-bytes4-}[`++pack_4_4(left, right)++`]
- * {xref-Packing-pack_4_6-bytes4-bytes6-}[`++pack_4_6(left, right)++`]
- * {xref-Packing-pack_4_8-bytes4-bytes8-}[`++pack_4_8(left, right)++`]
- * {xref-Packing-pack_4_12-bytes4-bytes12-}[`++pack_4_12(left, right)++`]
- * {xref-Packing-pack_4_16-bytes4-bytes16-}[`++pack_4_16(left, right)++`]
- * {xref-Packing-pack_4_20-bytes4-bytes20-}[`++pack_4_20(left, right)++`]
- * {xref-Packing-pack_4_24-bytes4-bytes24-}[`++pack_4_24(left, right)++`]
- * {xref-Packing-pack_4_28-bytes4-bytes28-}[`++pack_4_28(left, right)++`]
- * {xref-Packing-pack_6_2-bytes6-bytes2-}[`++pack_6_2(left, right)++`]
- * {xref-Packing-pack_6_4-bytes6-bytes4-}[`++pack_6_4(left, right)++`]
- * {xref-Packing-pack_6_6-bytes6-bytes6-}[`++pack_6_6(left, right)++`]
- * {xref-Packing-pack_6_10-bytes6-bytes10-}[`++pack_6_10(left, right)++`]
- * {xref-Packing-pack_6_16-bytes6-bytes16-}[`++pack_6_16(left, right)++`]
- * {xref-Packing-pack_6_22-bytes6-bytes22-}[`++pack_6_22(left, right)++`]
- * {xref-Packing-pack_8_2-bytes8-bytes2-}[`++pack_8_2(left, right)++`]
- * {xref-Packing-pack_8_4-bytes8-bytes4-}[`++pack_8_4(left, right)++`]
- * {xref-Packing-pack_8_8-bytes8-bytes8-}[`++pack_8_8(left, right)++`]
- * {xref-Packing-pack_8_12-bytes8-bytes12-}[`++pack_8_12(left, right)++`]
- * {xref-Packing-pack_8_16-bytes8-bytes16-}[`++pack_8_16(left, right)++`]
- * {xref-Packing-pack_8_20-bytes8-bytes20-}[`++pack_8_20(left, right)++`]
- * {xref-Packing-pack_8_24-bytes8-bytes24-}[`++pack_8_24(left, right)++`]
- * {xref-Packing-pack_10_2-bytes10-bytes2-}[`++pack_10_2(left, right)++`]
- * {xref-Packing-pack_10_6-bytes10-bytes6-}[`++pack_10_6(left, right)++`]
- * {xref-Packing-pack_10_10-bytes10-bytes10-}[`++pack_10_10(left, right)++`]
- * {xref-Packing-pack_10_12-bytes10-bytes12-}[`++pack_10_12(left, right)++`]
- * {xref-Packing-pack_10_22-bytes10-bytes22-}[`++pack_10_22(left, right)++`]
- * {xref-Packing-pack_12_4-bytes12-bytes4-}[`++pack_12_4(left, right)++`]
- * {xref-Packing-pack_12_8-bytes12-bytes8-}[`++pack_12_8(left, right)++`]
- * {xref-Packing-pack_12_10-bytes12-bytes10-}[`++pack_12_10(left, right)++`]
- * {xref-Packing-pack_12_12-bytes12-bytes12-}[`++pack_12_12(left, right)++`]
- * {xref-Packing-pack_12_16-bytes12-bytes16-}[`++pack_12_16(left, right)++`]
- * {xref-Packing-pack_12_20-bytes12-bytes20-}[`++pack_12_20(left, right)++`]
- * {xref-Packing-pack_16_4-bytes16-bytes4-}[`++pack_16_4(left, right)++`]
- * {xref-Packing-pack_16_6-bytes16-bytes6-}[`++pack_16_6(left, right)++`]
- * {xref-Packing-pack_16_8-bytes16-bytes8-}[`++pack_16_8(left, right)++`]
- * {xref-Packing-pack_16_12-bytes16-bytes12-}[`++pack_16_12(left, right)++`]
- * {xref-Packing-pack_16_16-bytes16-bytes16-}[`++pack_16_16(left, right)++`]
- * {xref-Packing-pack_20_2-bytes20-bytes2-}[`++pack_20_2(left, right)++`]
- * {xref-Packing-pack_20_4-bytes20-bytes4-}[`++pack_20_4(left, right)++`]
- * {xref-Packing-pack_20_8-bytes20-bytes8-}[`++pack_20_8(left, right)++`]
- * {xref-Packing-pack_20_12-bytes20-bytes12-}[`++pack_20_12(left, right)++`]
- * {xref-Packing-pack_22_2-bytes22-bytes2-}[`++pack_22_2(left, right)++`]
- * {xref-Packing-pack_22_6-bytes22-bytes6-}[`++pack_22_6(left, right)++`]
- * {xref-Packing-pack_22_10-bytes22-bytes10-}[`++pack_22_10(left, right)++`]
- * {xref-Packing-pack_24_4-bytes24-bytes4-}[`++pack_24_4(left, right)++`]
- * {xref-Packing-pack_24_8-bytes24-bytes8-}[`++pack_24_8(left, right)++`]
- * {xref-Packing-pack_28_4-bytes28-bytes4-}[`++pack_28_4(left, right)++`]
- * {xref-Packing-extract_2_1-bytes2-uint8-}[`++extract_2_1(self, offset)++`]
- * {xref-Packing-replace_2_1-bytes2-bytes1-uint8-}[`++replace_2_1(self, value, offset)++`]
- * {xref-Packing-extract_4_1-bytes4-uint8-}[`++extract_4_1(self, offset)++`]
- * {xref-Packing-replace_4_1-bytes4-bytes1-uint8-}[`++replace_4_1(self, value, offset)++`]
- * {xref-Packing-extract_4_2-bytes4-uint8-}[`++extract_4_2(self, offset)++`]
- * {xref-Packing-replace_4_2-bytes4-bytes2-uint8-}[`++replace_4_2(self, value, offset)++`]
- * {xref-Packing-extract_6_1-bytes6-uint8-}[`++extract_6_1(self, offset)++`]
- * {xref-Packing-replace_6_1-bytes6-bytes1-uint8-}[`++replace_6_1(self, value, offset)++`]
- * {xref-Packing-extract_6_2-bytes6-uint8-}[`++extract_6_2(self, offset)++`]
- * {xref-Packing-replace_6_2-bytes6-bytes2-uint8-}[`++replace_6_2(self, value, offset)++`]
- * {xref-Packing-extract_6_4-bytes6-uint8-}[`++extract_6_4(self, offset)++`]
- * {xref-Packing-replace_6_4-bytes6-bytes4-uint8-}[`++replace_6_4(self, value, offset)++`]
- * {xref-Packing-extract_8_1-bytes8-uint8-}[`++extract_8_1(self, offset)++`]
- * {xref-Packing-replace_8_1-bytes8-bytes1-uint8-}[`++replace_8_1(self, value, offset)++`]
- * {xref-Packing-extract_8_2-bytes8-uint8-}[`++extract_8_2(self, offset)++`]
- * {xref-Packing-replace_8_2-bytes8-bytes2-uint8-}[`++replace_8_2(self, value, offset)++`]
- * {xref-Packing-extract_8_4-bytes8-uint8-}[`++extract_8_4(self, offset)++`]
- * {xref-Packing-replace_8_4-bytes8-bytes4-uint8-}[`++replace_8_4(self, value, offset)++`]
- * {xref-Packing-extract_8_6-bytes8-uint8-}[`++extract_8_6(self, offset)++`]
- * {xref-Packing-replace_8_6-bytes8-bytes6-uint8-}[`++replace_8_6(self, value, offset)++`]
- * {xref-Packing-extract_10_1-bytes10-uint8-}[`++extract_10_1(self, offset)++`]
- * {xref-Packing-replace_10_1-bytes10-bytes1-uint8-}[`++replace_10_1(self, value, offset)++`]
- * {xref-Packing-extract_10_2-bytes10-uint8-}[`++extract_10_2(self, offset)++`]
- * {xref-Packing-replace_10_2-bytes10-bytes2-uint8-}[`++replace_10_2(self, value, offset)++`]
- * {xref-Packing-extract_10_4-bytes10-uint8-}[`++extract_10_4(self, offset)++`]
- * {xref-Packing-replace_10_4-bytes10-bytes4-uint8-}[`++replace_10_4(self, value, offset)++`]
- * {xref-Packing-extract_10_6-bytes10-uint8-}[`++extract_10_6(self, offset)++`]
- * {xref-Packing-replace_10_6-bytes10-bytes6-uint8-}[`++replace_10_6(self, value, offset)++`]
- * {xref-Packing-extract_10_8-bytes10-uint8-}[`++extract_10_8(self, offset)++`]
- * {xref-Packing-replace_10_8-bytes10-bytes8-uint8-}[`++replace_10_8(self, value, offset)++`]
- * {xref-Packing-extract_12_1-bytes12-uint8-}[`++extract_12_1(self, offset)++`]
- * {xref-Packing-replace_12_1-bytes12-bytes1-uint8-}[`++replace_12_1(self, value, offset)++`]
- * {xref-Packing-extract_12_2-bytes12-uint8-}[`++extract_12_2(self, offset)++`]
- * {xref-Packing-replace_12_2-bytes12-bytes2-uint8-}[`++replace_12_2(self, value, offset)++`]
- * {xref-Packing-extract_12_4-bytes12-uint8-}[`++extract_12_4(self, offset)++`]
- * {xref-Packing-replace_12_4-bytes12-bytes4-uint8-}[`++replace_12_4(self, value, offset)++`]
- * {xref-Packing-extract_12_6-bytes12-uint8-}[`++extract_12_6(self, offset)++`]
- * {xref-Packing-replace_12_6-bytes12-bytes6-uint8-}[`++replace_12_6(self, value, offset)++`]
- * {xref-Packing-extract_12_8-bytes12-uint8-}[`++extract_12_8(self, offset)++`]
- * {xref-Packing-replace_12_8-bytes12-bytes8-uint8-}[`++replace_12_8(self, value, offset)++`]
- * {xref-Packing-extract_12_10-bytes12-uint8-}[`++extract_12_10(self, offset)++`]
- * {xref-Packing-replace_12_10-bytes12-bytes10-uint8-}[`++replace_12_10(self, value, offset)++`]
- * {xref-Packing-extract_16_1-bytes16-uint8-}[`++extract_16_1(self, offset)++`]
- * {xref-Packing-replace_16_1-bytes16-bytes1-uint8-}[`++replace_16_1(self, value, offset)++`]
- * {xref-Packing-extract_16_2-bytes16-uint8-}[`++extract_16_2(self, offset)++`]
- * {xref-Packing-replace_16_2-bytes16-bytes2-uint8-}[`++replace_16_2(self, value, offset)++`]
- * {xref-Packing-extract_16_4-bytes16-uint8-}[`++extract_16_4(self, offset)++`]
- * {xref-Packing-replace_16_4-bytes16-bytes4-uint8-}[`++replace_16_4(self, value, offset)++`]
- * {xref-Packing-extract_16_6-bytes16-uint8-}[`++extract_16_6(self, offset)++`]
- * {xref-Packing-replace_16_6-bytes16-bytes6-uint8-}[`++replace_16_6(self, value, offset)++`]
- * {xref-Packing-extract_16_8-bytes16-uint8-}[`++extract_16_8(self, offset)++`]
- * {xref-Packing-replace_16_8-bytes16-bytes8-uint8-}[`++replace_16_8(self, value, offset)++`]
- * {xref-Packing-extract_16_10-bytes16-uint8-}[`++extract_16_10(self, offset)++`]
- * {xref-Packing-replace_16_10-bytes16-bytes10-uint8-}[`++replace_16_10(self, value, offset)++`]
- * {xref-Packing-extract_16_12-bytes16-uint8-}[`++extract_16_12(self, offset)++`]
- * {xref-Packing-replace_16_12-bytes16-bytes12-uint8-}[`++replace_16_12(self, value, offset)++`]
- * {xref-Packing-extract_20_1-bytes20-uint8-}[`++extract_20_1(self, offset)++`]
- * {xref-Packing-replace_20_1-bytes20-bytes1-uint8-}[`++replace_20_1(self, value, offset)++`]
- * {xref-Packing-extract_20_2-bytes20-uint8-}[`++extract_20_2(self, offset)++`]
- * {xref-Packing-replace_20_2-bytes20-bytes2-uint8-}[`++replace_20_2(self, value, offset)++`]
- * {xref-Packing-extract_20_4-bytes20-uint8-}[`++extract_20_4(self, offset)++`]
- * {xref-Packing-replace_20_4-bytes20-bytes4-uint8-}[`++replace_20_4(self, value, offset)++`]
- * {xref-Packing-extract_20_6-bytes20-uint8-}[`++extract_20_6(self, offset)++`]
- * {xref-Packing-replace_20_6-bytes20-bytes6-uint8-}[`++replace_20_6(self, value, offset)++`]
- * {xref-Packing-extract_20_8-bytes20-uint8-}[`++extract_20_8(self, offset)++`]
- * {xref-Packing-replace_20_8-bytes20-bytes8-uint8-}[`++replace_20_8(self, value, offset)++`]
- * {xref-Packing-extract_20_10-bytes20-uint8-}[`++extract_20_10(self, offset)++`]
- * {xref-Packing-replace_20_10-bytes20-bytes10-uint8-}[`++replace_20_10(self, value, offset)++`]
- * {xref-Packing-extract_20_12-bytes20-uint8-}[`++extract_20_12(self, offset)++`]
- * {xref-Packing-replace_20_12-bytes20-bytes12-uint8-}[`++replace_20_12(self, value, offset)++`]
- * {xref-Packing-extract_20_16-bytes20-uint8-}[`++extract_20_16(self, offset)++`]
- * {xref-Packing-replace_20_16-bytes20-bytes16-uint8-}[`++replace_20_16(self, value, offset)++`]
- * {xref-Packing-extract_22_1-bytes22-uint8-}[`++extract_22_1(self, offset)++`]
- * {xref-Packing-replace_22_1-bytes22-bytes1-uint8-}[`++replace_22_1(self, value, offset)++`]
- * {xref-Packing-extract_22_2-bytes22-uint8-}[`++extract_22_2(self, offset)++`]
- * {xref-Packing-replace_22_2-bytes22-bytes2-uint8-}[`++replace_22_2(self, value, offset)++`]
- * {xref-Packing-extract_22_4-bytes22-uint8-}[`++extract_22_4(self, offset)++`]
- * {xref-Packing-replace_22_4-bytes22-bytes4-uint8-}[`++replace_22_4(self, value, offset)++`]
- * {xref-Packing-extract_22_6-bytes22-uint8-}[`++extract_22_6(self, offset)++`]
- * {xref-Packing-replace_22_6-bytes22-bytes6-uint8-}[`++replace_22_6(self, value, offset)++`]
- * {xref-Packing-extract_22_8-bytes22-uint8-}[`++extract_22_8(self, offset)++`]
- * {xref-Packing-replace_22_8-bytes22-bytes8-uint8-}[`++replace_22_8(self, value, offset)++`]
- * {xref-Packing-extract_22_10-bytes22-uint8-}[`++extract_22_10(self, offset)++`]
- * {xref-Packing-replace_22_10-bytes22-bytes10-uint8-}[`++replace_22_10(self, value, offset)++`]
- * {xref-Packing-extract_22_12-bytes22-uint8-}[`++extract_22_12(self, offset)++`]
- * {xref-Packing-replace_22_12-bytes22-bytes12-uint8-}[`++replace_22_12(self, value, offset)++`]
- * {xref-Packing-extract_22_16-bytes22-uint8-}[`++extract_22_16(self, offset)++`]
- * {xref-Packing-replace_22_16-bytes22-bytes16-uint8-}[`++replace_22_16(self, value, offset)++`]
- * {xref-Packing-extract_22_20-bytes22-uint8-}[`++extract_22_20(self, offset)++`]
- * {xref-Packing-replace_22_20-bytes22-bytes20-uint8-}[`++replace_22_20(self, value, offset)++`]
- * {xref-Packing-extract_24_1-bytes24-uint8-}[`++extract_24_1(self, offset)++`]
- * {xref-Packing-replace_24_1-bytes24-bytes1-uint8-}[`++replace_24_1(self, value, offset)++`]
- * {xref-Packing-extract_24_2-bytes24-uint8-}[`++extract_24_2(self, offset)++`]
- * {xref-Packing-replace_24_2-bytes24-bytes2-uint8-}[`++replace_24_2(self, value, offset)++`]
- * {xref-Packing-extract_24_4-bytes24-uint8-}[`++extract_24_4(self, offset)++`]
- * {xref-Packing-replace_24_4-bytes24-bytes4-uint8-}[`++replace_24_4(self, value, offset)++`]
- * {xref-Packing-extract_24_6-bytes24-uint8-}[`++extract_24_6(self, offset)++`]
- * {xref-Packing-replace_24_6-bytes24-bytes6-uint8-}[`++replace_24_6(self, value, offset)++`]
- * {xref-Packing-extract_24_8-bytes24-uint8-}[`++extract_24_8(self, offset)++`]
- * {xref-Packing-replace_24_8-bytes24-bytes8-uint8-}[`++replace_24_8(self, value, offset)++`]
- * {xref-Packing-extract_24_10-bytes24-uint8-}[`++extract_24_10(self, offset)++`]
- * {xref-Packing-replace_24_10-bytes24-bytes10-uint8-}[`++replace_24_10(self, value, offset)++`]
- * {xref-Packing-extract_24_12-bytes24-uint8-}[`++extract_24_12(self, offset)++`]
- * {xref-Packing-replace_24_12-bytes24-bytes12-uint8-}[`++replace_24_12(self, value, offset)++`]
- * {xref-Packing-extract_24_16-bytes24-uint8-}[`++extract_24_16(self, offset)++`]
- * {xref-Packing-replace_24_16-bytes24-bytes16-uint8-}[`++replace_24_16(self, value, offset)++`]
- * {xref-Packing-extract_24_20-bytes24-uint8-}[`++extract_24_20(self, offset)++`]
- * {xref-Packing-replace_24_20-bytes24-bytes20-uint8-}[`++replace_24_20(self, value, offset)++`]
- * {xref-Packing-extract_24_22-bytes24-uint8-}[`++extract_24_22(self, offset)++`]
- * {xref-Packing-replace_24_22-bytes24-bytes22-uint8-}[`++replace_24_22(self, value, offset)++`]
- * {xref-Packing-extract_28_1-bytes28-uint8-}[`++extract_28_1(self, offset)++`]
- * {xref-Packing-replace_28_1-bytes28-bytes1-uint8-}[`++replace_28_1(self, value, offset)++`]
- * {xref-Packing-extract_28_2-bytes28-uint8-}[`++extract_28_2(self, offset)++`]
- * {xref-Packing-replace_28_2-bytes28-bytes2-uint8-}[`++replace_28_2(self, value, offset)++`]
- * {xref-Packing-extract_28_4-bytes28-uint8-}[`++extract_28_4(self, offset)++`]
- * {xref-Packing-replace_28_4-bytes28-bytes4-uint8-}[`++replace_28_4(self, value, offset)++`]
- * {xref-Packing-extract_28_6-bytes28-uint8-}[`++extract_28_6(self, offset)++`]
- * {xref-Packing-replace_28_6-bytes28-bytes6-uint8-}[`++replace_28_6(self, value, offset)++`]
- * {xref-Packing-extract_28_8-bytes28-uint8-}[`++extract_28_8(self, offset)++`]
- * {xref-Packing-replace_28_8-bytes28-bytes8-uint8-}[`++replace_28_8(self, value, offset)++`]
- * {xref-Packing-extract_28_10-bytes28-uint8-}[`++extract_28_10(self, offset)++`]
- * {xref-Packing-replace_28_10-bytes28-bytes10-uint8-}[`++replace_28_10(self, value, offset)++`]
- * {xref-Packing-extract_28_12-bytes28-uint8-}[`++extract_28_12(self, offset)++`]
- * {xref-Packing-replace_28_12-bytes28-bytes12-uint8-}[`++replace_28_12(self, value, offset)++`]
- * {xref-Packing-extract_28_16-bytes28-uint8-}[`++extract_28_16(self, offset)++`]
- * {xref-Packing-replace_28_16-bytes28-bytes16-uint8-}[`++replace_28_16(self, value, offset)++`]
- * {xref-Packing-extract_28_20-bytes28-uint8-}[`++extract_28_20(self, offset)++`]
- * {xref-Packing-replace_28_20-bytes28-bytes20-uint8-}[`++replace_28_20(self, value, offset)++`]
- * {xref-Packing-extract_28_22-bytes28-uint8-}[`++extract_28_22(self, offset)++`]
- * {xref-Packing-replace_28_22-bytes28-bytes22-uint8-}[`++replace_28_22(self, value, offset)++`]
- * {xref-Packing-extract_28_24-bytes28-uint8-}[`++extract_28_24(self, offset)++`]
- * {xref-Packing-replace_28_24-bytes28-bytes24-uint8-}[`++replace_28_24(self, value, offset)++`]
- * {xref-Packing-extract_32_1-bytes32-uint8-}[`++extract_32_1(self, offset)++`]
- * {xref-Packing-replace_32_1-bytes32-bytes1-uint8-}[`++replace_32_1(self, value, offset)++`]
- * {xref-Packing-extract_32_2-bytes32-uint8-}[`++extract_32_2(self, offset)++`]
- * {xref-Packing-replace_32_2-bytes32-bytes2-uint8-}[`++replace_32_2(self, value, offset)++`]
- * {xref-Packing-extract_32_4-bytes32-uint8-}[`++extract_32_4(self, offset)++`]
- * {xref-Packing-replace_32_4-bytes32-bytes4-uint8-}[`++replace_32_4(self, value, offset)++`]
- * {xref-Packing-extract_32_6-bytes32-uint8-}[`++extract_32_6(self, offset)++`]
- * {xref-Packing-replace_32_6-bytes32-bytes6-uint8-}[`++replace_32_6(self, value, offset)++`]
- * {xref-Packing-extract_32_8-bytes32-uint8-}[`++extract_32_8(self, offset)++`]
- * {xref-Packing-replace_32_8-bytes32-bytes8-uint8-}[`++replace_32_8(self, value, offset)++`]
- * {xref-Packing-extract_32_10-bytes32-uint8-}[`++extract_32_10(self, offset)++`]
- * {xref-Packing-replace_32_10-bytes32-bytes10-uint8-}[`++replace_32_10(self, value, offset)++`]
- * {xref-Packing-extract_32_12-bytes32-uint8-}[`++extract_32_12(self, offset)++`]
- * {xref-Packing-replace_32_12-bytes32-bytes12-uint8-}[`++replace_32_12(self, value, offset)++`]
- * {xref-Packing-extract_32_16-bytes32-uint8-}[`++extract_32_16(self, offset)++`]
- * {xref-Packing-replace_32_16-bytes32-bytes16-uint8-}[`++replace_32_16(self, value, offset)++`]
- * {xref-Packing-extract_32_20-bytes32-uint8-}[`++extract_32_20(self, offset)++`]
- * {xref-Packing-replace_32_20-bytes32-bytes20-uint8-}[`++replace_32_20(self, value, offset)++`]
- * {xref-Packing-extract_32_22-bytes32-uint8-}[`++extract_32_22(self, offset)++`]
- * {xref-Packing-replace_32_22-bytes32-bytes22-uint8-}[`++replace_32_22(self, value, offset)++`]
- * {xref-Packing-extract_32_24-bytes32-uint8-}[`++extract_32_24(self, offset)++`]
- * {xref-Packing-replace_32_24-bytes32-bytes24-uint8-}[`++replace_32_24(self, value, offset)++`]
- * {xref-Packing-extract_32_28-bytes32-uint8-}[`++extract_32_28(self, offset)++`]
- * {xref-Packing-replace_32_28-bytes32-bytes28-uint8-}[`++replace_32_28(self, value, offset)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-Packing-OutOfRangeAccess--}[`++OutOfRangeAccess()++`]
- --
- [.contract-item]
- [[Packing-pack_1_1-bytes1-bytes1-]]
- ==== `[.contract-item-name]#++pack_1_1++#++(bytes1 left, bytes1 right) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_2-bytes2-bytes2-]]
- ==== `[.contract-item-name]#++pack_2_2++#++(bytes2 left, bytes2 right) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_4-bytes2-bytes4-]]
- ==== `[.contract-item-name]#++pack_2_4++#++(bytes2 left, bytes4 right) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_6-bytes2-bytes6-]]
- ==== `[.contract-item-name]#++pack_2_6++#++(bytes2 left, bytes6 right) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_8-bytes2-bytes8-]]
- ==== `[.contract-item-name]#++pack_2_8++#++(bytes2 left, bytes8 right) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_10-bytes2-bytes10-]]
- ==== `[.contract-item-name]#++pack_2_10++#++(bytes2 left, bytes10 right) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_20-bytes2-bytes20-]]
- ==== `[.contract-item-name]#++pack_2_20++#++(bytes2 left, bytes20 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_2_22-bytes2-bytes22-]]
- ==== `[.contract-item-name]#++pack_2_22++#++(bytes2 left, bytes22 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_2-bytes4-bytes2-]]
- ==== `[.contract-item-name]#++pack_4_2++#++(bytes4 left, bytes2 right) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_4-bytes4-bytes4-]]
- ==== `[.contract-item-name]#++pack_4_4++#++(bytes4 left, bytes4 right) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_6-bytes4-bytes6-]]
- ==== `[.contract-item-name]#++pack_4_6++#++(bytes4 left, bytes6 right) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_8-bytes4-bytes8-]]
- ==== `[.contract-item-name]#++pack_4_8++#++(bytes4 left, bytes8 right) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_12-bytes4-bytes12-]]
- ==== `[.contract-item-name]#++pack_4_12++#++(bytes4 left, bytes12 right) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_16-bytes4-bytes16-]]
- ==== `[.contract-item-name]#++pack_4_16++#++(bytes4 left, bytes16 right) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_20-bytes4-bytes20-]]
- ==== `[.contract-item-name]#++pack_4_20++#++(bytes4 left, bytes20 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_24-bytes4-bytes24-]]
- ==== `[.contract-item-name]#++pack_4_24++#++(bytes4 left, bytes24 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_4_28-bytes4-bytes28-]]
- ==== `[.contract-item-name]#++pack_4_28++#++(bytes4 left, bytes28 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_2-bytes6-bytes2-]]
- ==== `[.contract-item-name]#++pack_6_2++#++(bytes6 left, bytes2 right) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_4-bytes6-bytes4-]]
- ==== `[.contract-item-name]#++pack_6_4++#++(bytes6 left, bytes4 right) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_6-bytes6-bytes6-]]
- ==== `[.contract-item-name]#++pack_6_6++#++(bytes6 left, bytes6 right) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_10-bytes6-bytes10-]]
- ==== `[.contract-item-name]#++pack_6_10++#++(bytes6 left, bytes10 right) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_16-bytes6-bytes16-]]
- ==== `[.contract-item-name]#++pack_6_16++#++(bytes6 left, bytes16 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_6_22-bytes6-bytes22-]]
- ==== `[.contract-item-name]#++pack_6_22++#++(bytes6 left, bytes22 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_2-bytes8-bytes2-]]
- ==== `[.contract-item-name]#++pack_8_2++#++(bytes8 left, bytes2 right) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_4-bytes8-bytes4-]]
- ==== `[.contract-item-name]#++pack_8_4++#++(bytes8 left, bytes4 right) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_8-bytes8-bytes8-]]
- ==== `[.contract-item-name]#++pack_8_8++#++(bytes8 left, bytes8 right) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_12-bytes8-bytes12-]]
- ==== `[.contract-item-name]#++pack_8_12++#++(bytes8 left, bytes12 right) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_16-bytes8-bytes16-]]
- ==== `[.contract-item-name]#++pack_8_16++#++(bytes8 left, bytes16 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_20-bytes8-bytes20-]]
- ==== `[.contract-item-name]#++pack_8_20++#++(bytes8 left, bytes20 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_8_24-bytes8-bytes24-]]
- ==== `[.contract-item-name]#++pack_8_24++#++(bytes8 left, bytes24 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_10_2-bytes10-bytes2-]]
- ==== `[.contract-item-name]#++pack_10_2++#++(bytes10 left, bytes2 right) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_10_6-bytes10-bytes6-]]
- ==== `[.contract-item-name]#++pack_10_6++#++(bytes10 left, bytes6 right) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_10_10-bytes10-bytes10-]]
- ==== `[.contract-item-name]#++pack_10_10++#++(bytes10 left, bytes10 right) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_10_12-bytes10-bytes12-]]
- ==== `[.contract-item-name]#++pack_10_12++#++(bytes10 left, bytes12 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_10_22-bytes10-bytes22-]]
- ==== `[.contract-item-name]#++pack_10_22++#++(bytes10 left, bytes22 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_4-bytes12-bytes4-]]
- ==== `[.contract-item-name]#++pack_12_4++#++(bytes12 left, bytes4 right) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_8-bytes12-bytes8-]]
- ==== `[.contract-item-name]#++pack_12_8++#++(bytes12 left, bytes8 right) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_10-bytes12-bytes10-]]
- ==== `[.contract-item-name]#++pack_12_10++#++(bytes12 left, bytes10 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_12-bytes12-bytes12-]]
- ==== `[.contract-item-name]#++pack_12_12++#++(bytes12 left, bytes12 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_16-bytes12-bytes16-]]
- ==== `[.contract-item-name]#++pack_12_16++#++(bytes12 left, bytes16 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_12_20-bytes12-bytes20-]]
- ==== `[.contract-item-name]#++pack_12_20++#++(bytes12 left, bytes20 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_16_4-bytes16-bytes4-]]
- ==== `[.contract-item-name]#++pack_16_4++#++(bytes16 left, bytes4 right) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_16_6-bytes16-bytes6-]]
- ==== `[.contract-item-name]#++pack_16_6++#++(bytes16 left, bytes6 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_16_8-bytes16-bytes8-]]
- ==== `[.contract-item-name]#++pack_16_8++#++(bytes16 left, bytes8 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_16_12-bytes16-bytes12-]]
- ==== `[.contract-item-name]#++pack_16_12++#++(bytes16 left, bytes12 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_16_16-bytes16-bytes16-]]
- ==== `[.contract-item-name]#++pack_16_16++#++(bytes16 left, bytes16 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_20_2-bytes20-bytes2-]]
- ==== `[.contract-item-name]#++pack_20_2++#++(bytes20 left, bytes2 right) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_20_4-bytes20-bytes4-]]
- ==== `[.contract-item-name]#++pack_20_4++#++(bytes20 left, bytes4 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_20_8-bytes20-bytes8-]]
- ==== `[.contract-item-name]#++pack_20_8++#++(bytes20 left, bytes8 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_20_12-bytes20-bytes12-]]
- ==== `[.contract-item-name]#++pack_20_12++#++(bytes20 left, bytes12 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_22_2-bytes22-bytes2-]]
- ==== `[.contract-item-name]#++pack_22_2++#++(bytes22 left, bytes2 right) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_22_6-bytes22-bytes6-]]
- ==== `[.contract-item-name]#++pack_22_6++#++(bytes22 left, bytes6 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_22_10-bytes22-bytes10-]]
- ==== `[.contract-item-name]#++pack_22_10++#++(bytes22 left, bytes10 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_24_4-bytes24-bytes4-]]
- ==== `[.contract-item-name]#++pack_24_4++#++(bytes24 left, bytes4 right) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_24_8-bytes24-bytes8-]]
- ==== `[.contract-item-name]#++pack_24_8++#++(bytes24 left, bytes8 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-pack_28_4-bytes28-bytes4-]]
- ==== `[.contract-item-name]#++pack_28_4++#++(bytes28 left, bytes4 right) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_2_1-bytes2-uint8-]]
- ==== `[.contract-item-name]#++extract_2_1++#++(bytes2 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_2_1-bytes2-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_2_1++#++(bytes2 self, bytes1 value, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_4_1-bytes4-uint8-]]
- ==== `[.contract-item-name]#++extract_4_1++#++(bytes4 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_4_1-bytes4-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_4_1++#++(bytes4 self, bytes1 value, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_4_2-bytes4-uint8-]]
- ==== `[.contract-item-name]#++extract_4_2++#++(bytes4 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_4_2-bytes4-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_4_2++#++(bytes4 self, bytes2 value, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_6_1-bytes6-uint8-]]
- ==== `[.contract-item-name]#++extract_6_1++#++(bytes6 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_6_1-bytes6-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_6_1++#++(bytes6 self, bytes1 value, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_6_2-bytes6-uint8-]]
- ==== `[.contract-item-name]#++extract_6_2++#++(bytes6 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_6_2-bytes6-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_6_2++#++(bytes6 self, bytes2 value, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_6_4-bytes6-uint8-]]
- ==== `[.contract-item-name]#++extract_6_4++#++(bytes6 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_6_4-bytes6-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_6_4++#++(bytes6 self, bytes4 value, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_8_1-bytes8-uint8-]]
- ==== `[.contract-item-name]#++extract_8_1++#++(bytes8 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_8_1-bytes8-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_8_1++#++(bytes8 self, bytes1 value, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_8_2-bytes8-uint8-]]
- ==== `[.contract-item-name]#++extract_8_2++#++(bytes8 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_8_2-bytes8-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_8_2++#++(bytes8 self, bytes2 value, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_8_4-bytes8-uint8-]]
- ==== `[.contract-item-name]#++extract_8_4++#++(bytes8 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_8_4-bytes8-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_8_4++#++(bytes8 self, bytes4 value, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_8_6-bytes8-uint8-]]
- ==== `[.contract-item-name]#++extract_8_6++#++(bytes8 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_8_6-bytes8-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_8_6++#++(bytes8 self, bytes6 value, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_10_1-bytes10-uint8-]]
- ==== `[.contract-item-name]#++extract_10_1++#++(bytes10 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_10_1-bytes10-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_10_1++#++(bytes10 self, bytes1 value, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_10_2-bytes10-uint8-]]
- ==== `[.contract-item-name]#++extract_10_2++#++(bytes10 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_10_2-bytes10-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_10_2++#++(bytes10 self, bytes2 value, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_10_4-bytes10-uint8-]]
- ==== `[.contract-item-name]#++extract_10_4++#++(bytes10 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_10_4-bytes10-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_10_4++#++(bytes10 self, bytes4 value, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_10_6-bytes10-uint8-]]
- ==== `[.contract-item-name]#++extract_10_6++#++(bytes10 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_10_6-bytes10-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_10_6++#++(bytes10 self, bytes6 value, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_10_8-bytes10-uint8-]]
- ==== `[.contract-item-name]#++extract_10_8++#++(bytes10 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_10_8-bytes10-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_10_8++#++(bytes10 self, bytes8 value, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_1-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_1++#++(bytes12 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_1-bytes12-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_12_1++#++(bytes12 self, bytes1 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_2-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_2++#++(bytes12 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_2-bytes12-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_12_2++#++(bytes12 self, bytes2 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_4-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_4++#++(bytes12 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_4-bytes12-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_12_4++#++(bytes12 self, bytes4 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_6-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_6++#++(bytes12 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_6-bytes12-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_12_6++#++(bytes12 self, bytes6 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_8-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_8++#++(bytes12 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_8-bytes12-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_12_8++#++(bytes12 self, bytes8 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_12_10-bytes12-uint8-]]
- ==== `[.contract-item-name]#++extract_12_10++#++(bytes12 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_12_10-bytes12-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_12_10++#++(bytes12 self, bytes10 value, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_1-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_1++#++(bytes16 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_1-bytes16-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_16_1++#++(bytes16 self, bytes1 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_2-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_2++#++(bytes16 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_2-bytes16-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_16_2++#++(bytes16 self, bytes2 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_4-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_4++#++(bytes16 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_4-bytes16-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_16_4++#++(bytes16 self, bytes4 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_6-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_6++#++(bytes16 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_6-bytes16-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_16_6++#++(bytes16 self, bytes6 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_8-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_8++#++(bytes16 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_8-bytes16-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_16_8++#++(bytes16 self, bytes8 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_10-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_10++#++(bytes16 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_10-bytes16-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_16_10++#++(bytes16 self, bytes10 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_16_12-bytes16-uint8-]]
- ==== `[.contract-item-name]#++extract_16_12++#++(bytes16 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_16_12-bytes16-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_16_12++#++(bytes16 self, bytes12 value, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_1-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_1++#++(bytes20 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_1-bytes20-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_20_1++#++(bytes20 self, bytes1 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_2-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_2++#++(bytes20 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_2-bytes20-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_20_2++#++(bytes20 self, bytes2 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_4-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_4++#++(bytes20 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_4-bytes20-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_20_4++#++(bytes20 self, bytes4 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_6-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_6++#++(bytes20 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_6-bytes20-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_20_6++#++(bytes20 self, bytes6 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_8-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_8++#++(bytes20 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_8-bytes20-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_20_8++#++(bytes20 self, bytes8 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_10-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_10++#++(bytes20 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_10-bytes20-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_20_10++#++(bytes20 self, bytes10 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_12-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_12++#++(bytes20 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_12-bytes20-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_20_12++#++(bytes20 self, bytes12 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_20_16-bytes20-uint8-]]
- ==== `[.contract-item-name]#++extract_20_16++#++(bytes20 self, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_20_16-bytes20-bytes16-uint8-]]
- ==== `[.contract-item-name]#++replace_20_16++#++(bytes20 self, bytes16 value, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_1-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_1++#++(bytes22 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_1-bytes22-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_22_1++#++(bytes22 self, bytes1 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_2-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_2++#++(bytes22 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_2-bytes22-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_22_2++#++(bytes22 self, bytes2 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_4-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_4++#++(bytes22 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_4-bytes22-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_22_4++#++(bytes22 self, bytes4 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_6-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_6++#++(bytes22 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_6-bytes22-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_22_6++#++(bytes22 self, bytes6 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_8-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_8++#++(bytes22 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_8-bytes22-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_22_8++#++(bytes22 self, bytes8 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_10-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_10++#++(bytes22 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_10-bytes22-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_22_10++#++(bytes22 self, bytes10 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_12-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_12++#++(bytes22 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_12-bytes22-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_22_12++#++(bytes22 self, bytes12 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_16-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_16++#++(bytes22 self, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_16-bytes22-bytes16-uint8-]]
- ==== `[.contract-item-name]#++replace_22_16++#++(bytes22 self, bytes16 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_22_20-bytes22-uint8-]]
- ==== `[.contract-item-name]#++extract_22_20++#++(bytes22 self, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_22_20-bytes22-bytes20-uint8-]]
- ==== `[.contract-item-name]#++replace_22_20++#++(bytes22 self, bytes20 value, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_1-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_1++#++(bytes24 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_1-bytes24-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_24_1++#++(bytes24 self, bytes1 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_2-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_2++#++(bytes24 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_2-bytes24-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_24_2++#++(bytes24 self, bytes2 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_4-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_4++#++(bytes24 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_4-bytes24-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_24_4++#++(bytes24 self, bytes4 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_6-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_6++#++(bytes24 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_6-bytes24-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_24_6++#++(bytes24 self, bytes6 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_8-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_8++#++(bytes24 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_8-bytes24-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_24_8++#++(bytes24 self, bytes8 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_10-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_10++#++(bytes24 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_10-bytes24-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_24_10++#++(bytes24 self, bytes10 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_12-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_12++#++(bytes24 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_12-bytes24-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_24_12++#++(bytes24 self, bytes12 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_16-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_16++#++(bytes24 self, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_16-bytes24-bytes16-uint8-]]
- ==== `[.contract-item-name]#++replace_24_16++#++(bytes24 self, bytes16 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_20-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_20++#++(bytes24 self, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_20-bytes24-bytes20-uint8-]]
- ==== `[.contract-item-name]#++replace_24_20++#++(bytes24 self, bytes20 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_24_22-bytes24-uint8-]]
- ==== `[.contract-item-name]#++extract_24_22++#++(bytes24 self, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_24_22-bytes24-bytes22-uint8-]]
- ==== `[.contract-item-name]#++replace_24_22++#++(bytes24 self, bytes22 value, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_1-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_1++#++(bytes28 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_1-bytes28-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_28_1++#++(bytes28 self, bytes1 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_2-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_2++#++(bytes28 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_2-bytes28-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_28_2++#++(bytes28 self, bytes2 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_4-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_4++#++(bytes28 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_4-bytes28-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_28_4++#++(bytes28 self, bytes4 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_6-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_6++#++(bytes28 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_6-bytes28-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_28_6++#++(bytes28 self, bytes6 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_8-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_8++#++(bytes28 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_8-bytes28-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_28_8++#++(bytes28 self, bytes8 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_10-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_10++#++(bytes28 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_10-bytes28-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_28_10++#++(bytes28 self, bytes10 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_12-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_12++#++(bytes28 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_12-bytes28-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_28_12++#++(bytes28 self, bytes12 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_16-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_16++#++(bytes28 self, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_16-bytes28-bytes16-uint8-]]
- ==== `[.contract-item-name]#++replace_28_16++#++(bytes28 self, bytes16 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_20-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_20++#++(bytes28 self, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_20-bytes28-bytes20-uint8-]]
- ==== `[.contract-item-name]#++replace_28_20++#++(bytes28 self, bytes20 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_22-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_22++#++(bytes28 self, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_22-bytes28-bytes22-uint8-]]
- ==== `[.contract-item-name]#++replace_28_22++#++(bytes28 self, bytes22 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_28_24-bytes28-uint8-]]
- ==== `[.contract-item-name]#++extract_28_24++#++(bytes28 self, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_28_24-bytes28-bytes24-uint8-]]
- ==== `[.contract-item-name]#++replace_28_24++#++(bytes28 self, bytes24 value, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_1-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_1++#++(bytes32 self, uint8 offset) โ bytes1 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_1-bytes32-bytes1-uint8-]]
- ==== `[.contract-item-name]#++replace_32_1++#++(bytes32 self, bytes1 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_2-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_2++#++(bytes32 self, uint8 offset) โ bytes2 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_2-bytes32-bytes2-uint8-]]
- ==== `[.contract-item-name]#++replace_32_2++#++(bytes32 self, bytes2 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_4-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_4++#++(bytes32 self, uint8 offset) โ bytes4 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_4-bytes32-bytes4-uint8-]]
- ==== `[.contract-item-name]#++replace_32_4++#++(bytes32 self, bytes4 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_6-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_6++#++(bytes32 self, uint8 offset) โ bytes6 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_6-bytes32-bytes6-uint8-]]
- ==== `[.contract-item-name]#++replace_32_6++#++(bytes32 self, bytes6 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_8-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_8++#++(bytes32 self, uint8 offset) โ bytes8 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_8-bytes32-bytes8-uint8-]]
- ==== `[.contract-item-name]#++replace_32_8++#++(bytes32 self, bytes8 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_10-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_10++#++(bytes32 self, uint8 offset) โ bytes10 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_10-bytes32-bytes10-uint8-]]
- ==== `[.contract-item-name]#++replace_32_10++#++(bytes32 self, bytes10 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_12-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_12++#++(bytes32 self, uint8 offset) โ bytes12 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_12-bytes32-bytes12-uint8-]]
- ==== `[.contract-item-name]#++replace_32_12++#++(bytes32 self, bytes12 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_16-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_16++#++(bytes32 self, uint8 offset) โ bytes16 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_16-bytes32-bytes16-uint8-]]
- ==== `[.contract-item-name]#++replace_32_16++#++(bytes32 self, bytes16 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_20-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_20++#++(bytes32 self, uint8 offset) โ bytes20 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_20-bytes32-bytes20-uint8-]]
- ==== `[.contract-item-name]#++replace_32_20++#++(bytes32 self, bytes20 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_22-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_22++#++(bytes32 self, uint8 offset) โ bytes22 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_22-bytes32-bytes22-uint8-]]
- ==== `[.contract-item-name]#++replace_32_22++#++(bytes32 self, bytes22 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_24-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_24++#++(bytes32 self, uint8 offset) โ bytes24 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_24-bytes32-bytes24-uint8-]]
- ==== `[.contract-item-name]#++replace_32_24++#++(bytes32 self, bytes24 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-extract_32_28-bytes32-uint8-]]
- ==== `[.contract-item-name]#++extract_32_28++#++(bytes32 self, uint8 offset) โ bytes28 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-replace_32_28-bytes32-bytes28-uint8-]]
- ==== `[.contract-item-name]#++replace_32_28++#++(bytes32 self, bytes28 value, uint8 offset) โ bytes32 result++` [.item-kind]#internal#
- [.contract-item]
- [[Packing-OutOfRangeAccess--]]
- ==== `[.contract-item-name]#++OutOfRangeAccess++#++()++` [.item-kind]#error#
- :GENERIC: pass:normal[xref:#Panic-GENERIC-uint256[`++GENERIC++`]]
- :ASSERT: pass:normal[xref:#Panic-ASSERT-uint256[`++ASSERT++`]]
- :UNDER_OVERFLOW: pass:normal[xref:#Panic-UNDER_OVERFLOW-uint256[`++UNDER_OVERFLOW++`]]
- :DIVISION_BY_ZERO: pass:normal[xref:#Panic-DIVISION_BY_ZERO-uint256[`++DIVISION_BY_ZERO++`]]
- :ENUM_CONVERSION_ERROR: pass:normal[xref:#Panic-ENUM_CONVERSION_ERROR-uint256[`++ENUM_CONVERSION_ERROR++`]]
- :STORAGE_ENCODING_ERROR: pass:normal[xref:#Panic-STORAGE_ENCODING_ERROR-uint256[`++STORAGE_ENCODING_ERROR++`]]
- :EMPTY_ARRAY_POP: pass:normal[xref:#Panic-EMPTY_ARRAY_POP-uint256[`++EMPTY_ARRAY_POP++`]]
- :ARRAY_OUT_OF_BOUNDS: pass:normal[xref:#Panic-ARRAY_OUT_OF_BOUNDS-uint256[`++ARRAY_OUT_OF_BOUNDS++`]]
- :RESOURCE_ERROR: pass:normal[xref:#Panic-RESOURCE_ERROR-uint256[`++RESOURCE_ERROR++`]]
- :INVALID_INTERNAL_FUNCTION: pass:normal[xref:#Panic-INVALID_INTERNAL_FUNCTION-uint256[`++INVALID_INTERNAL_FUNCTION++`]]
- :panic: pass:normal[xref:#Panic-panic-uint256-[`++panic++`]]
- :panic-uint256: pass:normal[xref:#Panic-panic-uint256-[`++panic++`]]
- [.contract]
- [[Panic]]
- === `++Panic++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Panic.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Panic.sol";
- ```
- Helper library for emitting standardized panic codes.
- ```solidity
- contract Example {
- using Panic for uint256;
- // Use any of the declared internal constants
- function foo() { Panic.GENERIC.panic(); }
- // Alternatively
- function foo() { Panic.panic(Panic.GENERIC); }
- }
- ```
- Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-Panic-panic-uint256-}[`++panic(code)++`]
- --
- [.contract-index]
- .Internal Variables
- --
- * {xref-Panic-GENERIC-uint256}[`++uint256 constant GENERIC++`]
- * {xref-Panic-ASSERT-uint256}[`++uint256 constant ASSERT++`]
- * {xref-Panic-UNDER_OVERFLOW-uint256}[`++uint256 constant UNDER_OVERFLOW++`]
- * {xref-Panic-DIVISION_BY_ZERO-uint256}[`++uint256 constant DIVISION_BY_ZERO++`]
- * {xref-Panic-ENUM_CONVERSION_ERROR-uint256}[`++uint256 constant ENUM_CONVERSION_ERROR++`]
- * {xref-Panic-STORAGE_ENCODING_ERROR-uint256}[`++uint256 constant STORAGE_ENCODING_ERROR++`]
- * {xref-Panic-EMPTY_ARRAY_POP-uint256}[`++uint256 constant EMPTY_ARRAY_POP++`]
- * {xref-Panic-ARRAY_OUT_OF_BOUNDS-uint256}[`++uint256 constant ARRAY_OUT_OF_BOUNDS++`]
- * {xref-Panic-RESOURCE_ERROR-uint256}[`++uint256 constant RESOURCE_ERROR++`]
- * {xref-Panic-INVALID_INTERNAL_FUNCTION-uint256}[`++uint256 constant INVALID_INTERNAL_FUNCTION++`]
- --
- [.contract-item]
- [[Panic-panic-uint256-]]
- ==== `[.contract-item-name]#++panic++#++(uint256 code)++` [.item-kind]#internal#
- Reverts with a panic code. Recommended to use with
- the internal constants with predefined codes.
- [.contract-item]
- [[Panic-GENERIC-uint256]]
- ==== `uint256 [.contract-item-name]#++GENERIC++#` [.item-kind]#internal constant#
- generic / unspecified error
- [.contract-item]
- [[Panic-ASSERT-uint256]]
- ==== `uint256 [.contract-item-name]#++ASSERT++#` [.item-kind]#internal constant#
- used by the assert() builtin
- [.contract-item]
- [[Panic-UNDER_OVERFLOW-uint256]]
- ==== `uint256 [.contract-item-name]#++UNDER_OVERFLOW++#` [.item-kind]#internal constant#
- arithmetic underflow or overflow
- [.contract-item]
- [[Panic-DIVISION_BY_ZERO-uint256]]
- ==== `uint256 [.contract-item-name]#++DIVISION_BY_ZERO++#` [.item-kind]#internal constant#
- division or modulo by zero
- [.contract-item]
- [[Panic-ENUM_CONVERSION_ERROR-uint256]]
- ==== `uint256 [.contract-item-name]#++ENUM_CONVERSION_ERROR++#` [.item-kind]#internal constant#
- enum conversion error
- [.contract-item]
- [[Panic-STORAGE_ENCODING_ERROR-uint256]]
- ==== `uint256 [.contract-item-name]#++STORAGE_ENCODING_ERROR++#` [.item-kind]#internal constant#
- invalid encoding in storage
- [.contract-item]
- [[Panic-EMPTY_ARRAY_POP-uint256]]
- ==== `uint256 [.contract-item-name]#++EMPTY_ARRAY_POP++#` [.item-kind]#internal constant#
- empty array pop
- [.contract-item]
- [[Panic-ARRAY_OUT_OF_BOUNDS-uint256]]
- ==== `uint256 [.contract-item-name]#++ARRAY_OUT_OF_BOUNDS++#` [.item-kind]#internal constant#
- array out of bounds access
- [.contract-item]
- [[Panic-RESOURCE_ERROR-uint256]]
- ==== `uint256 [.contract-item-name]#++RESOURCE_ERROR++#` [.item-kind]#internal constant#
- resource error (too large allocation or too large array)
- [.contract-item]
- [[Panic-INVALID_INTERNAL_FUNCTION-uint256]]
- ==== `uint256 [.contract-item-name]#++INVALID_INTERNAL_FUNCTION++#` [.item-kind]#internal constant#
- calling invalid internal function
- :lt: pass:normal[xref:#Comparators-lt-uint256-uint256-[`++lt++`]]
- :gt: pass:normal[xref:#Comparators-gt-uint256-uint256-[`++gt++`]]
- :lt-uint256-uint256: pass:normal[xref:#Comparators-lt-uint256-uint256-[`++lt++`]]
- :gt-uint256-uint256: pass:normal[xref:#Comparators-gt-uint256-uint256-[`++gt++`]]
- [.contract]
- [[Comparators]]
- === `++Comparators++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Comparators.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Comparators.sol";
- ```
- Provides a set of functions to compare values.
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-Comparators-lt-uint256-uint256-}[`++lt(a, b)++`]
- * {xref-Comparators-gt-uint256-uint256-}[`++gt(a, b)++`]
- --
- [.contract-item]
- [[Comparators-lt-uint256-uint256-]]
- ==== `[.contract-item-name]#++lt++#++(uint256 a, uint256 b) โ bool++` [.item-kind]#internal#
- [.contract-item]
- [[Comparators-gt-uint256-uint256-]]
- ==== `[.contract-item-name]#++gt++#++(uint256 a, uint256 b) โ bool++` [.item-kind]#internal#
- :local: pass:normal[xref:#CAIP2-local--[`++local++`]]
- :format: pass:normal[xref:#CAIP2-format-string-string-[`++format++`]]
- :parse: pass:normal[xref:#CAIP2-parse-string-[`++parse++`]]
- :local-: pass:normal[xref:#CAIP2-local--[`++local++`]]
- :format-string-string: pass:normal[xref:#CAIP2-format-string-string-[`++format++`]]
- :parse-string: pass:normal[xref:#CAIP2-parse-string-[`++parse++`]]
- [.contract]
- [[CAIP2]]
- === `++CAIP2++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/CAIP2.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/CAIP2.sol";
- ```
- Helper library to format and parse CAIP-2 identifiers
- https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md[CAIP-2] defines chain identifiers as:
- chain_id: namespace + ":" + reference
- namespace: [-a-z0-9]{3,8}
- reference: [-_a-zA-Z0-9]{1,32}
- WARNING: In some cases, multiple CAIP-2 identifiers may all be valid representation of a single chain.
- For EVM chains, it is recommended to use `eip155:xxx` as the canonical representation (where `xxx` is
- the EIP-155 chain id). Consider the possible ambiguity when processing CAIP-2 identifiers or when using them
- in the context of hashes.
- [.contract-index]
- .Functions
- --
- * {xref-CAIP2-local--}[`++local()++`]
- * {xref-CAIP2-format-string-string-}[`++format(namespace, ref)++`]
- * {xref-CAIP2-parse-string-}[`++parse(caip2)++`]
- --
- [.contract-item]
- [[CAIP2-local--]]
- ==== `[.contract-item-name]#++local++#++() โ string++` [.item-kind]#internal#
- Return the CAIP-2 identifier for the current (local) chain.
- [.contract-item]
- [[CAIP2-format-string-string-]]
- ==== `[.contract-item-name]#++format++#++(string namespace, string ref) โ string++` [.item-kind]#internal#
- Return the CAIP-2 identifier for a given namespace and reference.
- NOTE: This function does not verify that the inputs are properly formatted.
- [.contract-item]
- [[CAIP2-parse-string-]]
- ==== `[.contract-item-name]#++parse++#++(string caip2) โ string namespace, string ref++` [.item-kind]#internal#
- Parse a CAIP-2 identifier into its components.
- NOTE: This function does not verify that the CAIP-2 input is properly formatted.
- :local: pass:normal[xref:#CAIP10-local-address-[`++local++`]]
- :format: pass:normal[xref:#CAIP10-format-string-string-[`++format++`]]
- :parse: pass:normal[xref:#CAIP10-parse-string-[`++parse++`]]
- :local-address: pass:normal[xref:#CAIP10-local-address-[`++local++`]]
- :format-string-string: pass:normal[xref:#CAIP10-format-string-string-[`++format++`]]
- :parse-string: pass:normal[xref:#CAIP10-parse-string-[`++parse++`]]
- [.contract]
- [[CAIP10]]
- === `++CAIP10++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/CAIP10.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/CAIP10.sol";
- ```
- Helper library to format and parse CAIP-10 identifiers
- https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md[CAIP-10] defines account identifiers as:
- account_id: chain_id + ":" + account_address
- chain_id: [-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32} (See {CAIP2})
- account_address: [-.%a-zA-Z0-9]{1,128}
- WARNING: According to [CAIP-10's canonicalization section](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md#canonicalization),
- the implementation remains at the developer's discretion. Please note that case variations may introduce ambiguity.
- For example, when building hashes to identify accounts or data associated to them, multiple representations of the
- same account would derive to different hashes. For EVM chains, we recommend using checksummed addresses for the
- "account_address" part. They can be generated onchain using {Strings-toChecksumHexString}.
- [.contract-index]
- .Functions
- --
- * {xref-CAIP10-local-address-}[`++local(account)++`]
- * {xref-CAIP10-format-string-string-}[`++format(caip2, account)++`]
- * {xref-CAIP10-parse-string-}[`++parse(caip10)++`]
- --
- [.contract-item]
- [[CAIP10-local-address-]]
- ==== `[.contract-item-name]#++local++#++(address account) โ string++` [.item-kind]#internal#
- Return the CAIP-10 identifier for an account on the current (local) chain.
- [.contract-item]
- [[CAIP10-format-string-string-]]
- ==== `[.contract-item-name]#++format++#++(string caip2, string account) โ string++` [.item-kind]#internal#
- Return the CAIP-10 identifier for a given caip2 chain and account.
- NOTE: This function does not verify that the inputs are properly formatted.
- [.contract-item]
- [[CAIP10-parse-string-]]
- ==== `[.contract-item-name]#++parse++#++(string caip10) โ string caip2, string account++` [.item-kind]#internal#
- Parse a CAIP-10 identifier into its components.
- NOTE: This function does not verify that the CAIP-10 input is properly formatted. The `caip2` return can be
- parsed using the {CAIP2} library.
- :HISTORY_STORAGE_ADDRESS: pass:normal[xref:#Blockhash-HISTORY_STORAGE_ADDRESS-address[`++HISTORY_STORAGE_ADDRESS++`]]
- :blockHash: pass:normal[xref:#Blockhash-blockHash-uint256-[`++blockHash++`]]
- :blockHash-uint256: pass:normal[xref:#Blockhash-blockHash-uint256-[`++blockHash++`]]
- [.contract]
- [[Blockhash]]
- === `++Blockhash++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/Blockhash.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/Blockhash.sol";
- ```
- Library for accessing historical block hashes beyond the standard 256 block limit.
- Uses EIP-2935's history storage contract which maintains a ring buffer of the last
- 8191 block hashes in state.
- For blocks within the last 256 blocks, it uses the native `BLOCKHASH` opcode.
- For blocks between 257 and 8191 blocks ago, it queries the EIP-2935 history storage.
- For blocks older than 8191 or future blocks, it returns zero, matching the `BLOCKHASH` behavior.
- NOTE: After EIP-2935 activation, it takes 8191 blocks to completely fill the history.
- Before that, only block hashes since the fork block will be available.
- [.contract-index]
- .Functions
- --
- * {xref-Blockhash-blockHash-uint256-}[`++blockHash(blockNumber)++`]
- --
- [.contract-index]
- .Internal Variables
- --
- * {xref-Blockhash-HISTORY_STORAGE_ADDRESS-address}[`++address constant HISTORY_STORAGE_ADDRESS++`]
- --
- [.contract-item]
- [[Blockhash-blockHash-uint256-]]
- ==== `[.contract-item-name]#++blockHash++#++(uint256 blockNumber) โ bytes32++` [.item-kind]#internal#
- Retrieves the block hash for any historical block within the supported range.
- NOTE: The function gracefully handles future blocks and blocks beyond the history window
- by returning zero, consistent with the EVM's native `BLOCKHASH` behavior.
- [.contract-item]
- [[Blockhash-HISTORY_STORAGE_ADDRESS-address]]
- ==== `address [.contract-item-name]#++HISTORY_STORAGE_ADDRESS++#` [.item-kind]#internal constant#
- Address of the EIP-2935 history storage contract.
- :timestamp: pass:normal[xref:#Time-timestamp--[`++timestamp++`]]
- :blockNumber: pass:normal[xref:#Time-blockNumber--[`++blockNumber++`]]
- :Delay: pass:normal[xref:#Time-Delay[`++Delay++`]]
- :toDelay: pass:normal[xref:#Time-toDelay-uint32-[`++toDelay++`]]
- :getFull: pass:normal[xref:#Time-getFull-Time-Delay-[`++getFull++`]]
- :get: pass:normal[xref:#Time-get-Time-Delay-[`++get++`]]
- :withUpdate: pass:normal[xref:#Time-withUpdate-Time-Delay-uint32-uint32-[`++withUpdate++`]]
- :unpack: pass:normal[xref:#Time-unpack-Time-Delay-[`++unpack++`]]
- :pack: pass:normal[xref:#Time-pack-uint32-uint32-uint48-[`++pack++`]]
- :timestamp-: pass:normal[xref:#Time-timestamp--[`++timestamp++`]]
- :blockNumber-: pass:normal[xref:#Time-blockNumber--[`++blockNumber++`]]
- :toDelay-uint32: pass:normal[xref:#Time-toDelay-uint32-[`++toDelay++`]]
- :getFull-Time-Delay: pass:normal[xref:#Time-getFull-Time-Delay-[`++getFull++`]]
- :get-Time-Delay: pass:normal[xref:#Time-get-Time-Delay-[`++get++`]]
- :withUpdate-Time-Delay-uint32-uint32: pass:normal[xref:#Time-withUpdate-Time-Delay-uint32-uint32-[`++withUpdate++`]]
- :unpack-Time-Delay: pass:normal[xref:#Time-unpack-Time-Delay-[`++unpack++`]]
- :pack-uint32-uint32-uint48: pass:normal[xref:#Time-pack-uint32-uint32-uint48-[`++pack++`]]
- [.contract]
- [[Time]]
- === `++Time++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.4.0/contracts/utils/types/Time.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/utils/types/Time.sol";
- ```
- This library provides helpers for manipulating time-related objects.
- It uses the following types:
- - `uint48` for timepoints
- - `uint32` for durations
- While the library doesn't provide specific types for timepoints and duration, it does provide:
- - a `Delay` type to represent duration that can be programmed to change value automatically at a given point
- - additional helper functions
- [.contract-index]
- .Functions
- --
- * {xref-Time-timestamp--}[`++timestamp()++`]
- * {xref-Time-blockNumber--}[`++blockNumber()++`]
- * {xref-Time-toDelay-uint32-}[`++toDelay(duration)++`]
- * {xref-Time-getFull-Time-Delay-}[`++getFull(self)++`]
- * {xref-Time-get-Time-Delay-}[`++get(self)++`]
- * {xref-Time-withUpdate-Time-Delay-uint32-uint32-}[`++withUpdate(self, newValue, minSetback)++`]
- * {xref-Time-unpack-Time-Delay-}[`++unpack(self)++`]
- * {xref-Time-pack-uint32-uint32-uint48-}[`++pack(valueBefore, valueAfter, effect)++`]
- --
- [.contract-item]
- [[Time-timestamp--]]
- ==== `[.contract-item-name]#++timestamp++#++() โ uint48++` [.item-kind]#internal#
- Get the block timestamp as a Timepoint.
- [.contract-item]
- [[Time-blockNumber--]]
- ==== `[.contract-item-name]#++blockNumber++#++() โ uint48++` [.item-kind]#internal#
- Get the block number as a Timepoint.
- [.contract-item]
- [[Time-toDelay-uint32-]]
- ==== `[.contract-item-name]#++toDelay++#++(uint32 duration) โ Time.Delay++` [.item-kind]#internal#
- Wrap a duration into a Delay to add the one-step "update in the future" feature
- [.contract-item]
- [[Time-getFull-Time-Delay-]]
- ==== `[.contract-item-name]#++getFull++#++(Time.Delay self) โ uint32 valueBefore, uint32 valueAfter, uint48 effect++` [.item-kind]#internal#
- Get the current value plus the pending value and effect timepoint if there is a scheduled change. If the
- effect timepoint is 0, then the pending value should not be considered.
- [.contract-item]
- [[Time-get-Time-Delay-]]
- ==== `[.contract-item-name]#++get++#++(Time.Delay self) โ uint32++` [.item-kind]#internal#
- Get the current value.
- [.contract-item]
- [[Time-withUpdate-Time-Delay-uint32-uint32-]]
- ==== `[.contract-item-name]#++withUpdate++#++(Time.Delay self, uint32 newValue, uint32 minSetback) โ Time.Delay updatedDelay, uint48 effect++` [.item-kind]#internal#
- Update a Delay object so that it takes a new duration after a timepoint that is automatically computed to
- enforce the old delay at the moment of the update. Returns the updated Delay object and the timestamp when the
- new delay becomes effective.
- [.contract-item]
- [[Time-unpack-Time-Delay-]]
- ==== `[.contract-item-name]#++unpack++#++(Time.Delay self) โ uint32 valueBefore, uint32 valueAfter, uint48 effect++` [.item-kind]#internal#
- Split a delay into its components: valueBefore, valueAfter and effect (transition timepoint).
- [.contract-item]
- [[Time-pack-uint32-uint32-uint48-]]
- ==== `[.contract-item-name]#++pack++#++(uint32 valueBefore, uint32 valueAfter, uint48 effect) โ Time.Delay++` [.item-kind]#internal#
- pack the components into a Delay object.
|