12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305 |
- :github-icon: pass:[<svg class="icon"><use href="#github-icon"/></svg>]
- :IERC20: pass:normal[xref:token/ERC20.adoc#IERC20[`IERC20`]]
- :IERC20Metadata: pass:normal[xref:token/ERC20.adoc#IERC20Metadata[`IERC20Metadata`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC20Permit: pass:normal[xref:token/ERC20.adoc#ERC20Permit[`ERC20Permit`]]
- :ERC20Burnable: pass:normal[xref:token/ERC20.adoc#ERC20Burnable[`ERC20Burnable`]]
- :ERC20Capped: pass:normal[xref:token/ERC20.adoc#ERC20Capped[`ERC20Capped`]]
- :ERC20Pausable: pass:normal[xref:token/ERC20.adoc#ERC20Pausable[`ERC20Pausable`]]
- :ERC20FlashMint: pass:normal[xref:token/ERC20.adoc#ERC20FlashMint[`ERC20FlashMint`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :ERC20Wrapper: pass:normal[xref:token/ERC20.adoc#ERC20Wrapper[`ERC20Wrapper`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :ERC20TemporaryApproval: pass:normal[xref:token/ERC20.adoc#ERC20TemporaryApproval[`ERC20TemporaryApproval`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC4626: pass:normal[xref:token/ERC20.adoc#ERC4626[`ERC4626`]]
- :SafeERC20: pass:normal[xref:token/ERC20.adoc#SafeERC20[`SafeERC20`]]
- :VestingWallet: pass:normal[xref:finance.adoc#VestingWallet[`VestingWallet`]]
- :xref-IERC20-totalSupply--: xref:token/ERC20.adoc#IERC20-totalSupply--
- :xref-IERC20-balanceOf-address-: xref:token/ERC20.adoc#IERC20-balanceOf-address-
- :xref-IERC20-transfer-address-uint256-: xref:token/ERC20.adoc#IERC20-transfer-address-uint256-
- :xref-IERC20-allowance-address-address-: xref:token/ERC20.adoc#IERC20-allowance-address-address-
- :xref-IERC20-approve-address-uint256-: xref:token/ERC20.adoc#IERC20-approve-address-uint256-
- :xref-IERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#IERC20-transferFrom-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-IERC20Metadata-name--: xref:token/ERC20.adoc#IERC20Metadata-name--
- :xref-IERC20Metadata-symbol--: xref:token/ERC20.adoc#IERC20Metadata-symbol--
- :xref-IERC20Metadata-decimals--: xref:token/ERC20.adoc#IERC20Metadata-decimals--
- :xref-IERC20-totalSupply--: xref:token/ERC20.adoc#IERC20-totalSupply--
- :xref-IERC20-balanceOf-address-: xref:token/ERC20.adoc#IERC20-balanceOf-address-
- :xref-IERC20-transfer-address-uint256-: xref:token/ERC20.adoc#IERC20-transfer-address-uint256-
- :xref-IERC20-allowance-address-address-: xref:token/ERC20.adoc#IERC20-allowance-address-address-
- :xref-IERC20-approve-address-uint256-: xref:token/ERC20.adoc#IERC20-approve-address-uint256-
- :xref-IERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#IERC20-transferFrom-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :IERC20: pass:normal[xref:token/ERC20.adoc#IERC20[`IERC20`]]
- :xref-ERC20-constructor-string-string-: xref:token/ERC20.adoc#ERC20-constructor-string-string-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :IERC20-balanceOf: pass:normal[xref:token/ERC20.adoc#IERC20-balanceOf-address-[`IERC20.balanceOf`]]
- :IERC20-transfer: pass:normal[xref:token/ERC20.adoc#IERC20-transfer-address-uint256-[`IERC20.transfer`]]
- :IERC20-totalSupply: pass:normal[xref:token/ERC20.adoc#IERC20-totalSupply--[`IERC20.totalSupply`]]
- :IERC20-balanceOf: pass:normal[xref:token/ERC20.adoc#IERC20-balanceOf-address-[`IERC20.balanceOf`]]
- :IERC20-transfer: pass:normal[xref:token/ERC20.adoc#IERC20-transfer-address-uint256-[`IERC20.transfer`]]
- :IERC20-allowance: pass:normal[xref:token/ERC20.adoc#IERC20-allowance-address-address-[`IERC20.allowance`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :IERC20-transferFrom: pass:normal[xref:token/ERC20.adoc#IERC20-transferFrom-address-address-uint256-[`IERC20.transferFrom`]]
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :IERC20-allowance: pass:normal[xref:token/ERC20.adoc#IERC20-allowance-address-address-[`IERC20.allowance`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :SafeERC20-safeTransferFrom: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-[`SafeERC20.safeTransferFrom`]]
- :xref-IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-: xref:token/ERC20.adoc#IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-
- :xref-IERC20Permit-nonces-address-: xref:token/ERC20.adoc#IERC20Permit-nonces-address-
- :xref-IERC20Permit-DOMAIN_SEPARATOR--: xref:token/ERC20.adoc#IERC20Permit-DOMAIN_SEPARATOR--
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :EIP712: pass:normal[xref:utils.adoc#EIP712[`EIP712`]]
- :IERC20-allowance: pass:normal[xref:token/ERC20.adoc#IERC20-allowance-address-address-[`IERC20.allowance`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :xref-ERC20Permit-constructor-string-: xref:token/ERC20.adoc#ERC20Permit-constructor-string-
- :xref-ERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-: xref:token/ERC20.adoc#ERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-
- :xref-ERC20Permit-nonces-address-: xref:token/ERC20.adoc#ERC20Permit-nonces-address-
- :xref-ERC20Permit-DOMAIN_SEPARATOR--: xref:token/ERC20.adoc#ERC20Permit-DOMAIN_SEPARATOR--
- :xref-Nonces-_useNonce-address-: xref:utils.adoc#Nonces-_useNonce-address-
- :xref-Nonces-_useCheckedNonce-address-uint256-: xref:utils.adoc#Nonces-_useCheckedNonce-address-uint256-
- :xref-EIP712-_domainSeparatorV4--: xref:utils.adoc#EIP712-_domainSeparatorV4--
- :xref-EIP712-_hashTypedDataV4-bytes32-: xref:utils.adoc#EIP712-_hashTypedDataV4-bytes32-
- :xref-EIP712-eip712Domain--: xref:utils.adoc#EIP712-eip712Domain--
- :xref-EIP712-_EIP712Name--: xref:utils.adoc#EIP712-_EIP712Name--
- :xref-EIP712-_EIP712Version--: xref:utils.adoc#EIP712-_EIP712Version--
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC5267-EIP712DomainChanged--: xref:interfaces.adoc#IERC5267-EIP712DomainChanged--
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC20Permit-ERC2612ExpiredSignature-uint256-: xref:token/ERC20.adoc#ERC20Permit-ERC2612ExpiredSignature-uint256-
- :xref-ERC20Permit-ERC2612InvalidSigner-address-address-: xref:token/ERC20.adoc#ERC20Permit-ERC2612InvalidSigner-address-address-
- :xref-Nonces-InvalidAccountNonce-address-uint256-: xref:utils.adoc#Nonces-InvalidAccountNonce-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :EIP712: pass:normal[xref:utils.adoc#EIP712[`EIP712`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :EIP712: pass:normal[xref:utils.adoc#EIP712[`EIP712`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :xref-ERC20Burnable-burn-uint256-: xref:token/ERC20.adoc#ERC20Burnable-burn-uint256-
- :xref-ERC20Burnable-burnFrom-address-uint256-: xref:token/ERC20.adoc#ERC20Burnable-burnFrom-address-uint256-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :ERC20-_burn: pass:normal[xref:token/ERC20.adoc#ERC20-_burn-address-uint256-[`ERC20._burn`]]
- :ERC20-_burn: pass:normal[xref:token/ERC20.adoc#ERC20-_burn-address-uint256-[`ERC20._burn`]]
- :ERC20-allowance: pass:normal[xref:token/ERC20.adoc#ERC20-allowance-address-address-[`ERC20.allowance`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :xref-ERC20Capped-constructor-uint256-: xref:token/ERC20.adoc#ERC20Capped-constructor-uint256-
- :xref-ERC20Capped-cap--: xref:token/ERC20.adoc#ERC20Capped-cap--
- :xref-ERC20Capped-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20Capped-_update-address-address-uint256-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC20Capped-ERC20ExceededCap-uint256-uint256-: xref:token/ERC20.adoc#ERC20Capped-ERC20ExceededCap-uint256-uint256-
- :xref-ERC20Capped-ERC20InvalidCap-uint256-: xref:token/ERC20.adoc#ERC20Capped-ERC20InvalidCap-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :ERC20-_update: pass:normal[xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-[`ERC20._update`]]
- :Pausable-_pause: pass:normal[xref:utils.adoc#Pausable-_pause--[`Pausable._pause`]]
- :Pausable-_unpause: pass:normal[xref:utils.adoc#Pausable-_unpause--[`Pausable._unpause`]]
- :AccessControl: pass:normal[xref:access.adoc#AccessControl[`AccessControl`]]
- :Ownable: pass:normal[xref:access.adoc#Ownable[`Ownable`]]
- :xref-ERC20Pausable-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20Pausable-_update-address-address-uint256-
- :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-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-Pausable-Paused-address-: xref:utils.adoc#Pausable-Paused-address-
- :xref-Pausable-Unpaused-address-: xref:utils.adoc#Pausable-Unpaused-address-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-Pausable-EnforcedPause--: xref:utils.adoc#Pausable-EnforcedPause--
- :xref-Pausable-ExpectedPause--: xref:utils.adoc#Pausable-ExpectedPause--
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :ERC20-_update: pass:normal[xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-[`ERC20._update`]]
- :Votes-delegate: pass:normal[xref:governance.adoc#Votes-delegate-address-[`Votes.delegate`]]
- :Votes-delegateBySig: pass:normal[xref:governance.adoc#Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-[`Votes.delegateBySig`]]
- :Votes-getVotes: pass:normal[xref:governance.adoc#Votes-getVotes-address-[`Votes.getVotes`]]
- :Votes-getPastVotes: pass:normal[xref:governance.adoc#Votes-getPastVotes-address-uint256-[`Votes.getPastVotes`]]
- :xref-ERC20Votes-_maxSupply--: xref:token/ERC20.adoc#ERC20Votes-_maxSupply--
- :xref-ERC20Votes-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_update-address-address-uint256-
- :xref-ERC20Votes-_getVotingUnits-address-: xref:token/ERC20.adoc#ERC20Votes-_getVotingUnits-address-
- :xref-ERC20Votes-numCheckpoints-address-: xref:token/ERC20.adoc#ERC20Votes-numCheckpoints-address-
- :xref-ERC20Votes-checkpoints-address-uint32-: xref:token/ERC20.adoc#ERC20Votes-checkpoints-address-uint32-
- :xref-Votes-clock--: xref:governance.adoc#Votes-clock--
- :xref-Votes-CLOCK_MODE--: xref:governance.adoc#Votes-CLOCK_MODE--
- :xref-Votes-_validateTimepoint-uint256-: xref:governance.adoc#Votes-_validateTimepoint-uint256-
- :xref-Votes-getVotes-address-: xref:governance.adoc#Votes-getVotes-address-
- :xref-Votes-getPastVotes-address-uint256-: xref:governance.adoc#Votes-getPastVotes-address-uint256-
- :xref-Votes-getPastTotalSupply-uint256-: xref:governance.adoc#Votes-getPastTotalSupply-uint256-
- :xref-Votes-_getTotalSupply--: xref:governance.adoc#Votes-_getTotalSupply--
- :xref-Votes-delegates-address-: xref:governance.adoc#Votes-delegates-address-
- :xref-Votes-delegate-address-: xref:governance.adoc#Votes-delegate-address-
- :xref-Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-: xref:governance.adoc#Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-
- :xref-Votes-_delegate-address-address-: xref:governance.adoc#Votes-_delegate-address-address-
- :xref-Votes-_transferVotingUnits-address-address-uint256-: xref:governance.adoc#Votes-_transferVotingUnits-address-address-uint256-
- :xref-Votes-_moveDelegateVotes-address-address-uint256-: xref:governance.adoc#Votes-_moveDelegateVotes-address-address-uint256-
- :xref-Votes-_numCheckpoints-address-: xref:governance.adoc#Votes-_numCheckpoints-address-
- :xref-Votes-_checkpoints-address-uint32-: xref:governance.adoc#Votes-_checkpoints-address-uint32-
- :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-EIP712-_domainSeparatorV4--: xref:utils.adoc#EIP712-_domainSeparatorV4--
- :xref-EIP712-_hashTypedDataV4-bytes32-: xref:utils.adoc#EIP712-_hashTypedDataV4-bytes32-
- :xref-EIP712-eip712Domain--: xref:utils.adoc#EIP712-eip712Domain--
- :xref-EIP712-_EIP712Name--: xref:utils.adoc#EIP712-_EIP712Name--
- :xref-EIP712-_EIP712Version--: xref:utils.adoc#EIP712-_EIP712Version--
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IVotes-DelegateChanged-address-address-address-: xref:governance.adoc#IVotes-DelegateChanged-address-address-address-
- :xref-IVotes-DelegateVotesChanged-address-uint256-uint256-: xref:governance.adoc#IVotes-DelegateVotesChanged-address-uint256-uint256-
- :xref-IERC5267-EIP712DomainChanged--: xref:interfaces.adoc#IERC5267-EIP712DomainChanged--
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC20Votes-ERC20ExceededSafeSupply-uint256-uint256-: xref:token/ERC20.adoc#ERC20Votes-ERC20ExceededSafeSupply-uint256-uint256-
- :xref-Votes-ERC6372InconsistentClock--: xref:governance.adoc#Votes-ERC6372InconsistentClock--
- :xref-Votes-ERC5805FutureLookup-uint256-uint48-: xref:governance.adoc#Votes-ERC5805FutureLookup-uint256-uint48-
- :xref-IVotes-VotesExpiredSignature-uint256-: xref:governance.adoc#IVotes-VotesExpiredSignature-uint256-
- :xref-Nonces-InvalidAccountNonce-address-uint256-: xref:utils.adoc#Nonces-InvalidAccountNonce-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :Votes: pass:normal[xref:governance.adoc#Votes[`Votes`]]
- :Votes-_transferVotingUnits: pass:normal[xref:governance.adoc#Votes-_transferVotingUnits-address-address-uint256-[`Votes._transferVotingUnits`]]
- :IVotes-DelegateVotesChanged: pass:normal[xref:governance.adoc#IVotes-DelegateVotesChanged-address-uint256-uint256-[`IVotes.DelegateVotesChanged`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :xref-ERC20Wrapper-constructor-contract-IERC20-: xref:token/ERC20.adoc#ERC20Wrapper-constructor-contract-IERC20-
- :xref-ERC20Wrapper-decimals--: xref:token/ERC20.adoc#ERC20Wrapper-decimals--
- :xref-ERC20Wrapper-underlying--: xref:token/ERC20.adoc#ERC20Wrapper-underlying--
- :xref-ERC20Wrapper-depositFor-address-uint256-: xref:token/ERC20.adoc#ERC20Wrapper-depositFor-address-uint256-
- :xref-ERC20Wrapper-withdrawTo-address-uint256-: xref:token/ERC20.adoc#ERC20Wrapper-withdrawTo-address-uint256-
- :xref-ERC20Wrapper-_recover-address-: xref:token/ERC20.adoc#ERC20Wrapper-_recover-address-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC20Wrapper-ERC20InvalidUnderlying-address-: xref:token/ERC20.adoc#ERC20Wrapper-ERC20InvalidUnderlying-address-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :ERC20-decimals: pass:normal[xref:token/ERC20.adoc#ERC20-decimals--[`ERC20.decimals`]]
- :ERC20Capped: pass:normal[xref:token/ERC20.adoc#ERC20Capped[`ERC20Capped`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :xref-ERC20FlashMint-maxFlashLoan-address-: xref:token/ERC20.adoc#ERC20FlashMint-maxFlashLoan-address-
- :xref-ERC20FlashMint-flashFee-address-uint256-: xref:token/ERC20.adoc#ERC20FlashMint-flashFee-address-uint256-
- :xref-ERC20FlashMint-_flashFee-address-uint256-: xref:token/ERC20.adoc#ERC20FlashMint-_flashFee-address-uint256-
- :xref-ERC20FlashMint-_flashFeeReceiver--: xref:token/ERC20.adoc#ERC20FlashMint-_flashFeeReceiver--
- :xref-ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-: xref:token/ERC20.adoc#ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC20FlashMint-ERC3156UnsupportedToken-address-: xref:token/ERC20.adoc#ERC20FlashMint-ERC3156UnsupportedToken-address-
- :xref-ERC20FlashMint-ERC3156ExceededMaxLoan-uint256-: xref:token/ERC20.adoc#ERC20FlashMint-ERC3156ExceededMaxLoan-uint256-
- :xref-ERC20FlashMint-ERC3156InvalidReceiver-address-: xref:token/ERC20.adoc#ERC20FlashMint-ERC3156InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :IERC3156FlashBorrower: pass:normal[xref:interfaces.adoc#IERC3156FlashBorrower[`IERC3156FlashBorrower`]]
- :IERC3156FlashBorrower-onFlashLoan: pass:normal[xref:interfaces.adoc#IERC3156FlashBorrower-onFlashLoan-address-address-uint256-uint256-bytes-[`IERC3156FlashBorrower.onFlashLoan`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :xref-ERC20TemporaryApproval-allowance-address-address-: xref:token/ERC20.adoc#ERC20TemporaryApproval-allowance-address-address-
- :xref-ERC20TemporaryApproval-_temporaryAllowance-address-address-: xref:token/ERC20.adoc#ERC20TemporaryApproval-_temporaryAllowance-address-address-
- :xref-ERC20TemporaryApproval-temporaryApprove-address-uint256-: xref:token/ERC20.adoc#ERC20TemporaryApproval-temporaryApprove-address-uint256-
- :xref-ERC20TemporaryApproval-_temporaryApprove-address-address-uint256-: xref:token/ERC20.adoc#ERC20TemporaryApproval-_temporaryApprove-address-address-uint256-
- :xref-ERC20TemporaryApproval-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20TemporaryApproval-_spendAllowance-address-address-uint256-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC1363-transferAndCall: pass:normal[xref:token/ERC20.adoc#ERC1363-transferAndCall-address-uint256-bytes-[`ERC1363.transferAndCall`]]
- :ERC1363-transferFromAndCall: pass:normal[xref:token/ERC20.adoc#ERC1363-transferFromAndCall-address-address-uint256-bytes-[`ERC1363.transferFromAndCall`]]
- :ERC1363-approveAndCall: pass:normal[xref:token/ERC20.adoc#ERC1363-approveAndCall-address-uint256-bytes-[`ERC1363.approveAndCall`]]
- :xref-ERC1363-supportsInterface-bytes4-: xref:token/ERC20.adoc#ERC1363-supportsInterface-bytes4-
- :xref-ERC1363-transferAndCall-address-uint256-: xref:token/ERC20.adoc#ERC1363-transferAndCall-address-uint256-
- :xref-ERC1363-transferAndCall-address-uint256-bytes-: xref:token/ERC20.adoc#ERC1363-transferAndCall-address-uint256-bytes-
- :xref-ERC1363-transferFromAndCall-address-address-uint256-: xref:token/ERC20.adoc#ERC1363-transferFromAndCall-address-address-uint256-
- :xref-ERC1363-transferFromAndCall-address-address-uint256-bytes-: xref:token/ERC20.adoc#ERC1363-transferFromAndCall-address-address-uint256-bytes-
- :xref-ERC1363-approveAndCall-address-uint256-: xref:token/ERC20.adoc#ERC1363-approveAndCall-address-uint256-
- :xref-ERC1363-approveAndCall-address-uint256-bytes-: xref:token/ERC20.adoc#ERC1363-approveAndCall-address-uint256-bytes-
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-decimals--: xref:token/ERC20.adoc#ERC20-decimals--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC1363-ERC1363TransferFailed-address-uint256-: xref:token/ERC20.adoc#ERC1363-ERC1363TransferFailed-address-uint256-
- :xref-ERC1363-ERC1363TransferFromFailed-address-address-uint256-: xref:token/ERC20.adoc#ERC1363-ERC1363TransferFromFailed-address-address-uint256-
- :xref-ERC1363-ERC1363ApproveFailed-address-uint256-: xref:token/ERC20.adoc#ERC1363-ERC1363ApproveFailed-address-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Receiver: pass:normal[xref:interfaces.adoc#IERC1363Receiver[`IERC1363Receiver`]]
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Receiver: pass:normal[xref:interfaces.adoc#IERC1363Receiver[`IERC1363Receiver`]]
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Spender-onApprovalReceived: pass:normal[xref:interfaces.adoc#IERC1363Spender-onApprovalReceived-address-uint256-bytes-[`IERC1363Spender.onApprovalReceived`]]
- :IERC1363Spender: pass:normal[xref:interfaces.adoc#IERC1363Spender[`IERC1363Spender`]]
- :IERC1363Spender-onApprovalReceived: pass:normal[xref:interfaces.adoc#IERC1363Spender-onApprovalReceived-address-uint256-bytes-[`IERC1363Spender.onApprovalReceived`]]
- :xref-ERC4626-constructor-contract-IERC20-: xref:token/ERC20.adoc#ERC4626-constructor-contract-IERC20-
- :xref-ERC4626-decimals--: xref:token/ERC20.adoc#ERC4626-decimals--
- :xref-ERC4626-asset--: xref:token/ERC20.adoc#ERC4626-asset--
- :xref-ERC4626-totalAssets--: xref:token/ERC20.adoc#ERC4626-totalAssets--
- :xref-ERC4626-convertToShares-uint256-: xref:token/ERC20.adoc#ERC4626-convertToShares-uint256-
- :xref-ERC4626-convertToAssets-uint256-: xref:token/ERC20.adoc#ERC4626-convertToAssets-uint256-
- :xref-ERC4626-maxDeposit-address-: xref:token/ERC20.adoc#ERC4626-maxDeposit-address-
- :xref-ERC4626-maxMint-address-: xref:token/ERC20.adoc#ERC4626-maxMint-address-
- :xref-ERC4626-maxWithdraw-address-: xref:token/ERC20.adoc#ERC4626-maxWithdraw-address-
- :xref-ERC4626-maxRedeem-address-: xref:token/ERC20.adoc#ERC4626-maxRedeem-address-
- :xref-ERC4626-previewDeposit-uint256-: xref:token/ERC20.adoc#ERC4626-previewDeposit-uint256-
- :xref-ERC4626-previewMint-uint256-: xref:token/ERC20.adoc#ERC4626-previewMint-uint256-
- :xref-ERC4626-previewWithdraw-uint256-: xref:token/ERC20.adoc#ERC4626-previewWithdraw-uint256-
- :xref-ERC4626-previewRedeem-uint256-: xref:token/ERC20.adoc#ERC4626-previewRedeem-uint256-
- :xref-ERC4626-deposit-uint256-address-: xref:token/ERC20.adoc#ERC4626-deposit-uint256-address-
- :xref-ERC4626-mint-uint256-address-: xref:token/ERC20.adoc#ERC4626-mint-uint256-address-
- :xref-ERC4626-withdraw-uint256-address-address-: xref:token/ERC20.adoc#ERC4626-withdraw-uint256-address-address-
- :xref-ERC4626-redeem-uint256-address-address-: xref:token/ERC20.adoc#ERC4626-redeem-uint256-address-address-
- :xref-ERC4626-_convertToShares-uint256-enum-Math-Rounding-: xref:token/ERC20.adoc#ERC4626-_convertToShares-uint256-enum-Math-Rounding-
- :xref-ERC4626-_convertToAssets-uint256-enum-Math-Rounding-: xref:token/ERC20.adoc#ERC4626-_convertToAssets-uint256-enum-Math-Rounding-
- :xref-ERC4626-_deposit-address-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-_deposit-address-address-uint256-uint256-
- :xref-ERC4626-_withdraw-address-address-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-_withdraw-address-address-address-uint256-uint256-
- :xref-ERC4626-_decimalsOffset--: xref:token/ERC20.adoc#ERC4626-_decimalsOffset--
- :xref-ERC20-name--: xref:token/ERC20.adoc#ERC20-name--
- :xref-ERC20-symbol--: xref:token/ERC20.adoc#ERC20-symbol--
- :xref-ERC20-totalSupply--: xref:token/ERC20.adoc#ERC20-totalSupply--
- :xref-ERC20-balanceOf-address-: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :xref-ERC20-transfer-address-uint256-: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :xref-ERC20-allowance-address-address-: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :xref-ERC20-approve-address-uint256-: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :xref-ERC20-transferFrom-address-address-uint256-: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_update-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_update-address-address-uint256-
- :xref-ERC20-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :xref-ERC20-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-bool-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-bool-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-IERC4626-Deposit-address-address-uint256-uint256-: xref:interfaces.adoc#IERC4626-Deposit-address-address-uint256-uint256-
- :xref-IERC4626-Withdraw-address-address-address-uint256-uint256-: xref:interfaces.adoc#IERC4626-Withdraw-address-address-address-uint256-uint256-
- :xref-IERC20-Transfer-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :xref-IERC20-Approval-address-address-uint256-: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :xref-ERC4626-ERC4626ExceededMaxDeposit-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-ERC4626ExceededMaxDeposit-address-uint256-uint256-
- :xref-ERC4626-ERC4626ExceededMaxMint-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-ERC4626ExceededMaxMint-address-uint256-uint256-
- :xref-ERC4626-ERC4626ExceededMaxWithdraw-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-ERC4626ExceededMaxWithdraw-address-uint256-uint256-
- :xref-ERC4626-ERC4626ExceededMaxRedeem-address-uint256-uint256-: xref:token/ERC20.adoc#ERC4626-ERC4626ExceededMaxRedeem-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidSender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSender-address-
- :xref-IERC20Errors-ERC20InvalidReceiver-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidReceiver-address-
- :xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-: xref:interfaces.adoc#IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-
- :xref-IERC20Errors-ERC20InvalidApprover-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidApprover-address-
- :xref-IERC20Errors-ERC20InvalidSpender-address-: xref:interfaces.adoc#IERC20Errors-ERC20InvalidSpender-address-
- :IERC20Metadata-decimals: pass:normal[xref:token/ERC20.adoc#IERC20Metadata-decimals--[`IERC20Metadata.decimals`]]
- :IERC4626-asset: pass:normal[xref:interfaces.adoc#IERC4626-asset--[`IERC4626.asset`]]
- :IERC4626-totalAssets: pass:normal[xref:interfaces.adoc#IERC4626-totalAssets--[`IERC4626.totalAssets`]]
- :IERC4626-convertToShares: pass:normal[xref:interfaces.adoc#IERC4626-convertToShares-uint256-[`IERC4626.convertToShares`]]
- :IERC4626-convertToAssets: pass:normal[xref:interfaces.adoc#IERC4626-convertToAssets-uint256-[`IERC4626.convertToAssets`]]
- :IERC4626-maxDeposit: pass:normal[xref:interfaces.adoc#IERC4626-maxDeposit-address-[`IERC4626.maxDeposit`]]
- :IERC4626-maxMint: pass:normal[xref:interfaces.adoc#IERC4626-maxMint-address-[`IERC4626.maxMint`]]
- :IERC4626-maxWithdraw: pass:normal[xref:interfaces.adoc#IERC4626-maxWithdraw-address-[`IERC4626.maxWithdraw`]]
- :IERC4626-maxRedeem: pass:normal[xref:interfaces.adoc#IERC4626-maxRedeem-address-[`IERC4626.maxRedeem`]]
- :IERC4626-previewDeposit: pass:normal[xref:interfaces.adoc#IERC4626-previewDeposit-uint256-[`IERC4626.previewDeposit`]]
- :IERC4626-previewMint: pass:normal[xref:interfaces.adoc#IERC4626-previewMint-uint256-[`IERC4626.previewMint`]]
- :IERC4626-previewWithdraw: pass:normal[xref:interfaces.adoc#IERC4626-previewWithdraw-uint256-[`IERC4626.previewWithdraw`]]
- :IERC4626-previewRedeem: pass:normal[xref:interfaces.adoc#IERC4626-previewRedeem-uint256-[`IERC4626.previewRedeem`]]
- :IERC4626-deposit: pass:normal[xref:interfaces.adoc#IERC4626-deposit-uint256-address-[`IERC4626.deposit`]]
- :IERC4626-mint: pass:normal[xref:interfaces.adoc#IERC4626-mint-uint256-address-[`IERC4626.mint`]]
- :IERC4626-withdraw: pass:normal[xref:interfaces.adoc#IERC4626-withdraw-uint256-address-address-[`IERC4626.withdraw`]]
- :IERC4626-redeem: pass:normal[xref:interfaces.adoc#IERC4626-redeem-uint256-address-address-[`IERC4626.redeem`]]
- :xref-SafeERC20-safeTransfer-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#SafeERC20-safeTransfer-contract-IERC20-address-uint256-
- :xref-SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-: xref:token/ERC20.adoc#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-
- :xref-SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-
- :xref-SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-
- :xref-SafeERC20-forceApprove-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#SafeERC20-forceApprove-contract-IERC20-address-uint256-
- :xref-SafeERC20-transferAndCallRelaxed-contract-IERC1363-address-uint256-bytes-: xref:token/ERC20.adoc#SafeERC20-transferAndCallRelaxed-contract-IERC1363-address-uint256-bytes-
- :xref-SafeERC20-transferFromAndCallRelaxed-contract-IERC1363-address-address-uint256-bytes-: xref:token/ERC20.adoc#SafeERC20-transferFromAndCallRelaxed-contract-IERC1363-address-address-uint256-bytes-
- :xref-SafeERC20-approveAndCallRelaxed-contract-IERC1363-address-uint256-bytes-: xref:token/ERC20.adoc#SafeERC20-approveAndCallRelaxed-contract-IERC1363-address-uint256-bytes-
- :xref-SafeERC20-SafeERC20FailedOperation-address-: xref:token/ERC20.adoc#SafeERC20-SafeERC20FailedOperation-address-
- :xref-SafeERC20-SafeERC20FailedDecreaseAllowance-address-uint256-uint256-: xref:token/ERC20.adoc#SafeERC20-SafeERC20FailedDecreaseAllowance-address-uint256-uint256-
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC721: pass:normal[xref:token/ERC721.adoc#ERC721[`ERC721`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC721: pass:normal[xref:token/ERC721.adoc#ERC721[`ERC721`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC721: pass:normal[xref:token/ERC721.adoc#ERC721[`ERC721`]]
- :ERC1363: pass:normal[xref:token/ERC20.adoc#ERC1363[`ERC1363`]]
- :ERC1363-approveAndCall: pass:normal[xref:token/ERC20.adoc#ERC1363-approveAndCall-address-uint256-bytes-[`ERC1363.approveAndCall`]]
- :xref-ERC1363Utils-checkOnERC1363TransferReceived-address-address-address-uint256-bytes-: xref:token/ERC20.adoc#ERC1363Utils-checkOnERC1363TransferReceived-address-address-address-uint256-bytes-
- :xref-ERC1363Utils-checkOnERC1363ApprovalReceived-address-address-uint256-bytes-: xref:token/ERC20.adoc#ERC1363Utils-checkOnERC1363ApprovalReceived-address-address-uint256-bytes-
- :xref-ERC1363Utils-ERC1363InvalidReceiver-address-: xref:token/ERC20.adoc#ERC1363Utils-ERC1363InvalidReceiver-address-
- :xref-ERC1363Utils-ERC1363InvalidSpender-address-: xref:token/ERC20.adoc#ERC1363Utils-ERC1363InvalidSpender-address-
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Receiver: pass:normal[xref:interfaces.adoc#IERC1363Receiver[`IERC1363Receiver`]]
- :IERC1363Receiver-onTransferReceived: pass:normal[xref:interfaces.adoc#IERC1363Receiver-onTransferReceived-address-address-uint256-bytes-[`IERC1363Receiver.onTransferReceived`]]
- :IERC1363Spender-onApprovalReceived: pass:normal[xref:interfaces.adoc#IERC1363Spender-onApprovalReceived-address-uint256-bytes-[`IERC1363Spender.onApprovalReceived`]]
- :IERC1363Spender: pass:normal[xref:interfaces.adoc#IERC1363Spender[`IERC1363Spender`]]
- :IERC1363Spender-onApprovalReceived: pass:normal[xref:interfaces.adoc#IERC1363Spender-onApprovalReceived-address-uint256-bytes-[`IERC1363Spender.onApprovalReceived`]]
- = ERC-20
- [.readme-notice]
- NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc20
- This set of interfaces, contracts, and utilities are all related to the https://eips.ethereum.org/EIPS/eip-20[ERC-20 Token Standard].
- TIP: For an overview of ERC-20 tokens and a walk through on how to create a token contract read our xref:ROOT:erc20.adoc[ERC-20 guide].
- There are a few core contracts that implement the behavior specified in the ERC:
- * {IERC20}: the interface all ERC-20 implementations should conform to.
- * {IERC20Metadata}: the extended ERC-20 interface including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> functions.
- * {ERC20}: the implementation of the ERC-20 interface, including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> optional standard extension to the base interface.
- Additionally there are multiple custom extensions, including:
- * {ERC20Permit}: gasless approval of tokens (standardized as ERC-2612).
- * {ERC20Burnable}: destruction of own tokens.
- * {ERC20Capped}: enforcement of a cap to the total supply when minting tokens.
- * {ERC20Pausable}: ability to pause token transfers.
- * {ERC20FlashMint}: token level support for flash loans through the minting and burning of ephemeral tokens (standardized as ERC-3156).
- * {ERC20Votes}: support for voting and vote delegation.
- * {ERC20Wrapper}: wrapper to create an ERC-20 backed by another ERC-20, with deposit and withdraw methods. Useful in conjunction with {ERC20Votes}.
- * {ERC20TemporaryApproval}: support for approvals lasting for only one transaction, as defined in ERC-7674.
- * {ERC1363}: support for calling the target of a transfer or approval, enabling code execution on the receiver within a single transaction.
- * {ERC4626}: tokenized vault that manages shares (represented as ERC-20) that are backed by assets (another ERC-20).
- Finally, there are some utilities to interact with ERC-20 contracts in various ways:
- * {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values.
- Other utilities that support ERC-20 assets can be found in codebase:
- * ERC-20 tokens can be timelocked (held tokens for a beneficiary until a specified time) or vested (released following a given schedule) using a {VestingWallet}.
- NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC-20 (such as <<ERC20-_mint-address-uint256-,`_mint`>>) and expose them as external functions in the way they prefer.
- == Core
- :Transfer: pass:normal[xref:#IERC20-Transfer-address-address-uint256-[`++Transfer++`]]
- :Approval: pass:normal[xref:#IERC20-Approval-address-address-uint256-[`++Approval++`]]
- :totalSupply: pass:normal[xref:#IERC20-totalSupply--[`++totalSupply++`]]
- :balanceOf: pass:normal[xref:#IERC20-balanceOf-address-[`++balanceOf++`]]
- :transfer: pass:normal[xref:#IERC20-transfer-address-uint256-[`++transfer++`]]
- :allowance: pass:normal[xref:#IERC20-allowance-address-address-[`++allowance++`]]
- :approve: pass:normal[xref:#IERC20-approve-address-uint256-[`++approve++`]]
- :transferFrom: pass:normal[xref:#IERC20-transferFrom-address-address-uint256-[`++transferFrom++`]]
- [.contract]
- [[IERC20]]
- === `++IERC20++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/IERC20.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
- ```
- Interface of the ERC-20 standard as defined in the ERC.
- [.contract-index]
- .Functions
- --
- * {xref-IERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-IERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-IERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-IERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-IERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-IERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- --
- [.contract-index]
- .Events
- --
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-item]
- [[IERC20-totalSupply--]]
- ==== `[.contract-item-name]#++totalSupply++#++() → uint256++` [.item-kind]#external#
- Returns the value of tokens in existence.
- [.contract-item]
- [[IERC20-balanceOf-address-]]
- ==== `[.contract-item-name]#++balanceOf++#++(address account) → uint256++` [.item-kind]#external#
- Returns the value of tokens owned by `account`.
- [.contract-item]
- [[IERC20-transfer-address-uint256-]]
- ==== `[.contract-item-name]#++transfer++#++(address to, uint256 value) → bool++` [.item-kind]#external#
- Moves a `value` amount of tokens from the caller's account to `to`.
- Returns a boolean value indicating whether the operation succeeded.
- Emits a {Transfer} event.
- [.contract-item]
- [[IERC20-allowance-address-address-]]
- ==== `[.contract-item-name]#++allowance++#++(address owner, address spender) → uint256++` [.item-kind]#external#
- Returns the remaining number of tokens that `spender` will be
- allowed to spend on behalf of `owner` through {transferFrom}. This is
- zero by default.
- This value changes when {approve} or {transferFrom} are called.
- [.contract-item]
- [[IERC20-approve-address-uint256-]]
- ==== `[.contract-item-name]#++approve++#++(address spender, uint256 value) → bool++` [.item-kind]#external#
- Sets a `value` amount of tokens as the allowance of `spender` over the
- caller's tokens.
- Returns a boolean value indicating whether the operation succeeded.
- IMPORTANT: Beware that changing an allowance with this method brings the risk
- that someone may use both the old and the new allowance by unfortunate
- transaction ordering. One possible solution to mitigate this race
- condition is to first reduce the spender's allowance to 0 and set the
- desired value afterwards:
- https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
- Emits an {Approval} event.
- [.contract-item]
- [[IERC20-transferFrom-address-address-uint256-]]
- ==== `[.contract-item-name]#++transferFrom++#++(address from, address to, uint256 value) → bool++` [.item-kind]#external#
- Moves a `value` amount of tokens from `from` to `to` using the
- allowance mechanism. `value` is then deducted from the caller's
- allowance.
- Returns a boolean value indicating whether the operation succeeded.
- Emits a {Transfer} event.
- [.contract-item]
- [[IERC20-Transfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++Transfer++#++(address indexed from, address indexed to, uint256 value)++` [.item-kind]#event#
- Emitted when `value` tokens are moved from one account (`from`) to
- another (`to`).
- Note that `value` may be zero.
- [.contract-item]
- [[IERC20-Approval-address-address-uint256-]]
- ==== `[.contract-item-name]#++Approval++#++(address indexed owner, address indexed spender, uint256 value)++` [.item-kind]#event#
- Emitted when the allowance of a `spender` for an `owner` is set by
- a call to {approve}. `value` is the new allowance.
- :name: pass:normal[xref:#IERC20Metadata-name--[`++name++`]]
- :symbol: pass:normal[xref:#IERC20Metadata-symbol--[`++symbol++`]]
- :decimals: pass:normal[xref:#IERC20Metadata-decimals--[`++decimals++`]]
- [.contract]
- [[IERC20Metadata]]
- === `++IERC20Metadata++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/IERC20Metadata.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
- ```
- Interface for the optional metadata functions from the ERC-20 standard.
- [.contract-index]
- .Functions
- --
- * {xref-IERC20Metadata-name--}[`++name()++`]
- * {xref-IERC20Metadata-symbol--}[`++symbol()++`]
- * {xref-IERC20Metadata-decimals--}[`++decimals()++`]
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-IERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-IERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-IERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-IERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-IERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-item]
- [[IERC20Metadata-name--]]
- ==== `[.contract-item-name]#++name++#++() → string++` [.item-kind]#external#
- Returns the name of the token.
- [.contract-item]
- [[IERC20Metadata-symbol--]]
- ==== `[.contract-item-name]#++symbol++#++() → string++` [.item-kind]#external#
- Returns the symbol of the token.
- [.contract-item]
- [[IERC20Metadata-decimals--]]
- ==== `[.contract-item-name]#++decimals++#++() → uint8++` [.item-kind]#external#
- Returns the decimals places of the token.
- :constructor: pass:normal[xref:#ERC20-constructor-string-string-[`++constructor++`]]
- :name: pass:normal[xref:#ERC20-name--[`++name++`]]
- :symbol: pass:normal[xref:#ERC20-symbol--[`++symbol++`]]
- :decimals: pass:normal[xref:#ERC20-decimals--[`++decimals++`]]
- :totalSupply: pass:normal[xref:#ERC20-totalSupply--[`++totalSupply++`]]
- :balanceOf: pass:normal[xref:#ERC20-balanceOf-address-[`++balanceOf++`]]
- :transfer: pass:normal[xref:#ERC20-transfer-address-uint256-[`++transfer++`]]
- :allowance: pass:normal[xref:#ERC20-allowance-address-address-[`++allowance++`]]
- :approve: pass:normal[xref:#ERC20-approve-address-uint256-[`++approve++`]]
- :transferFrom: pass:normal[xref:#ERC20-transferFrom-address-address-uint256-[`++transferFrom++`]]
- :_transfer: pass:normal[xref:#ERC20-_transfer-address-address-uint256-[`++_transfer++`]]
- :_update: pass:normal[xref:#ERC20-_update-address-address-uint256-[`++_update++`]]
- :_mint: pass:normal[xref:#ERC20-_mint-address-uint256-[`++_mint++`]]
- :_burn: pass:normal[xref:#ERC20-_burn-address-uint256-[`++_burn++`]]
- :_approve: pass:normal[xref:#ERC20-_approve-address-address-uint256-[`++_approve++`]]
- :_approve: pass:normal[xref:#ERC20-_approve-address-address-uint256-bool-[`++_approve++`]]
- :_spendAllowance: pass:normal[xref:#ERC20-_spendAllowance-address-address-uint256-[`++_spendAllowance++`]]
- [.contract]
- [[ERC20]]
- === `++ERC20++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/ERC20.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
- ```
- Implementation of the {IERC20} interface.
- This implementation is agnostic to the way tokens are created. This means
- that a supply mechanism has to be added in a derived contract using {_mint}.
- TIP: For a detailed writeup see our guide
- https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
- to implement supply mechanisms].
- The default value of {decimals} is 18. To change this, you should override
- this function so it returns a different value.
- We have followed general OpenZeppelin Contracts guidelines: functions revert
- instead returning `false` on failure. This behavior is nonetheless
- conventional and does not conflict with the expectations of ERC-20
- applications.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20-constructor-string-string-}[`++constructor(name_, symbol_)++`]
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20-constructor-string-string-]]
- ==== `[.contract-item-name]#++constructor++#++(string name_, string symbol_)++` [.item-kind]#internal#
- Sets the values for {name} and {symbol}.
- All two of these values are immutable: they can only be set once during
- construction.
- [.contract-item]
- [[ERC20-name--]]
- ==== `[.contract-item-name]#++name++#++() → string++` [.item-kind]#public#
- Returns the name of the token.
- [.contract-item]
- [[ERC20-symbol--]]
- ==== `[.contract-item-name]#++symbol++#++() → string++` [.item-kind]#public#
- Returns the symbol of the token, usually a shorter version of the
- name.
- [.contract-item]
- [[ERC20-decimals--]]
- ==== `[.contract-item-name]#++decimals++#++() → uint8++` [.item-kind]#public#
- Returns the number of decimals used to get its user representation.
- For example, if `decimals` equals `2`, a balance of `505` tokens should
- be displayed to a user as `5.05` (`505 / 10 ** 2`).
- Tokens usually opt for a value of 18, imitating the relationship between
- Ether and Wei. This is the default value returned by this function, unless
- it's overridden.
- NOTE: This information is only used for _display_ purposes: it in
- no way affects any of the arithmetic of the contract, including
- {IERC20-balanceOf} and {IERC20-transfer}.
- [.contract-item]
- [[ERC20-totalSupply--]]
- ==== `[.contract-item-name]#++totalSupply++#++() → uint256++` [.item-kind]#public#
- See {IERC20-totalSupply}.
- [.contract-item]
- [[ERC20-balanceOf-address-]]
- ==== `[.contract-item-name]#++balanceOf++#++(address account) → uint256++` [.item-kind]#public#
- See {IERC20-balanceOf}.
- [.contract-item]
- [[ERC20-transfer-address-uint256-]]
- ==== `[.contract-item-name]#++transfer++#++(address to, uint256 value) → bool++` [.item-kind]#public#
- See {IERC20-transfer}.
- Requirements:
- - `to` cannot be the zero address.
- - the caller must have a balance of at least `value`.
- [.contract-item]
- [[ERC20-allowance-address-address-]]
- ==== `[.contract-item-name]#++allowance++#++(address owner, address spender) → uint256++` [.item-kind]#public#
- See {IERC20-allowance}.
- [.contract-item]
- [[ERC20-approve-address-uint256-]]
- ==== `[.contract-item-name]#++approve++#++(address spender, uint256 value) → bool++` [.item-kind]#public#
- See {IERC20-approve}.
- NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
- `transferFrom`. This is semantically equivalent to an infinite approval.
- Requirements:
- - `spender` cannot be the zero address.
- [.contract-item]
- [[ERC20-transferFrom-address-address-uint256-]]
- ==== `[.contract-item-name]#++transferFrom++#++(address from, address to, uint256 value) → bool++` [.item-kind]#public#
- See {IERC20-transferFrom}.
- Skips emitting an {Approval} event indicating an allowance update. This is not
- required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
- NOTE: Does not update the allowance if the current allowance
- is the maximum `uint256`.
- Requirements:
- - `from` and `to` cannot be the zero address.
- - `from` must have a balance of at least `value`.
- - the caller must have allowance for ``from``'s tokens of at least
- `value`.
- [.contract-item]
- [[ERC20-_transfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_transfer++#++(address from, address to, uint256 value)++` [.item-kind]#internal#
- Moves a `value` amount of tokens from `from` to `to`.
- This internal function is equivalent to {transfer}, and can be used to
- e.g. implement automatic token fees, slashing mechanisms, etc.
- Emits a {Transfer} event.
- NOTE: This function is not virtual, {_update} should be overridden instead.
- [.contract-item]
- [[ERC20-_update-address-address-uint256-]]
- ==== `[.contract-item-name]#++_update++#++(address from, address to, uint256 value)++` [.item-kind]#internal#
- Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
- (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
- this function.
- Emits a {Transfer} event.
- [.contract-item]
- [[ERC20-_mint-address-uint256-]]
- ==== `[.contract-item-name]#++_mint++#++(address account, uint256 value)++` [.item-kind]#internal#
- Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
- Relies on the `_update` mechanism
- Emits a {Transfer} event with `from` set to the zero address.
- NOTE: This function is not virtual, {_update} should be overridden instead.
- [.contract-item]
- [[ERC20-_burn-address-uint256-]]
- ==== `[.contract-item-name]#++_burn++#++(address account, uint256 value)++` [.item-kind]#internal#
- Destroys a `value` amount of tokens from `account`, lowering the total supply.
- Relies on the `_update` mechanism.
- Emits a {Transfer} event with `to` set to the zero address.
- NOTE: This function is not virtual, {_update} should be overridden instead
- [.contract-item]
- [[ERC20-_approve-address-address-uint256-]]
- ==== `[.contract-item-name]#++_approve++#++(address owner, address spender, uint256 value)++` [.item-kind]#internal#
- Sets `value` as the allowance of `spender` over the `owner` s tokens.
- This internal function is equivalent to `approve`, and can be used to
- e.g. set automatic allowances for certain subsystems, etc.
- Emits an {Approval} event.
- Requirements:
- - `owner` cannot be the zero address.
- - `spender` cannot be the zero address.
- Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
- [.contract-item]
- [[ERC20-_approve-address-address-uint256-bool-]]
- ==== `[.contract-item-name]#++_approve++#++(address owner, address spender, uint256 value, bool emitEvent)++` [.item-kind]#internal#
- Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
- By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
- `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
- `Approval` event during `transferFrom` operations.
- Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
- true using the following override:
- ```solidity
- function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
- super._approve(owner, spender, value, true);
- }
- ```
- Requirements are the same as {_approve}.
- [.contract-item]
- [[ERC20-_spendAllowance-address-address-uint256-]]
- ==== `[.contract-item-name]#++_spendAllowance++#++(address owner, address spender, uint256 value)++` [.item-kind]#internal#
- Updates `owner` s allowance for `spender` based on spent `value`.
- Does not update the allowance value in case of infinite allowance.
- Revert if not enough allowance is available.
- Does not emit an {Approval} event.
- == Extensions
- :permit: pass:normal[xref:#IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-[`++permit++`]]
- :nonces: pass:normal[xref:#IERC20Permit-nonces-address-[`++nonces++`]]
- :DOMAIN_SEPARATOR: pass:normal[xref:#IERC20Permit-DOMAIN_SEPARATOR--[`++DOMAIN_SEPARATOR++`]]
- [.contract]
- [[IERC20Permit]]
- === `++IERC20Permit++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/IERC20Permit.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
- ```
- Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
- https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
- Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
- presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
- need to send a transaction, and thus is not required to hold Ether at all.
- ==== Security Considerations
- There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
- expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
- considered as an intention to spend the allowance in any specific way. The second is that because permits have
- built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
- take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
- generally recommended is:
- ```solidity
- function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
- try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
- doThing(..., value);
- }
- function doThing(..., uint256 value) public {
- token.safeTransferFrom(msg.sender, address(this), value);
- ...
- }
- ```
- Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
- `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
- {SafeERC20-safeTransferFrom}).
- Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
- contracts should have entry points that don't rely on permit.
- [.contract-index]
- .Functions
- --
- * {xref-IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-}[`++permit(owner, spender, value, deadline, v, r, s)++`]
- * {xref-IERC20Permit-nonces-address-}[`++nonces(owner)++`]
- * {xref-IERC20Permit-DOMAIN_SEPARATOR--}[`++DOMAIN_SEPARATOR()++`]
- --
- [.contract-item]
- [[IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++permit++#++(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)++` [.item-kind]#external#
- Sets `value` as the allowance of `spender` over ``owner``'s tokens,
- given ``owner``'s signed approval.
- IMPORTANT: The same issues {IERC20-approve} has related to transaction
- ordering also apply here.
- Emits an {Approval} event.
- Requirements:
- - `spender` cannot be the zero address.
- - `deadline` must be a timestamp in the future.
- - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
- over the EIP712-formatted function arguments.
- - the signature must use ``owner``'s current nonce (see {nonces}).
- For more information on the signature format, see the
- https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
- section].
- CAUTION: See Security Considerations above.
- [.contract-item]
- [[IERC20Permit-nonces-address-]]
- ==== `[.contract-item-name]#++nonces++#++(address owner) → uint256++` [.item-kind]#external#
- Returns the current nonce for `owner`. This value must be
- included whenever a signature is generated for {permit}.
- Every successful call to {permit} increases ``owner``'s nonce by one. This
- prevents a signature from being used multiple times.
- [.contract-item]
- [[IERC20Permit-DOMAIN_SEPARATOR--]]
- ==== `[.contract-item-name]#++DOMAIN_SEPARATOR++#++() → bytes32++` [.item-kind]#external#
- Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
- :ERC2612ExpiredSignature: pass:normal[xref:#ERC20Permit-ERC2612ExpiredSignature-uint256-[`++ERC2612ExpiredSignature++`]]
- :ERC2612InvalidSigner: pass:normal[xref:#ERC20Permit-ERC2612InvalidSigner-address-address-[`++ERC2612InvalidSigner++`]]
- :constructor: pass:normal[xref:#ERC20Permit-constructor-string-[`++constructor++`]]
- :permit: pass:normal[xref:#ERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-[`++permit++`]]
- :nonces: pass:normal[xref:#ERC20Permit-nonces-address-[`++nonces++`]]
- :DOMAIN_SEPARATOR: pass:normal[xref:#ERC20Permit-DOMAIN_SEPARATOR--[`++DOMAIN_SEPARATOR++`]]
- [.contract]
- [[ERC20Permit]]
- === `++ERC20Permit++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Permit.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
- ```
- Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
- https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
- Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
- presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
- need to send a transaction, and thus is not required to hold Ether at all.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Permit-constructor-string-}[`++constructor(name)++`]
- * {xref-ERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-}[`++permit(owner, spender, value, deadline, v, r, s)++`]
- * {xref-ERC20Permit-nonces-address-}[`++nonces(owner)++`]
- * {xref-ERC20Permit-DOMAIN_SEPARATOR--}[`++DOMAIN_SEPARATOR()++`]
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-_useNonce-address-}[`++_useNonce(owner)++`]
- * {xref-Nonces-_useCheckedNonce-address-uint256-}[`++_useCheckedNonce(owner, nonce)++`]
- [.contract-subindex-inherited]
- .EIP712
- * {xref-EIP712-_domainSeparatorV4--}[`++_domainSeparatorV4()++`]
- * {xref-EIP712-_hashTypedDataV4-bytes32-}[`++_hashTypedDataV4(structHash)++`]
- * {xref-EIP712-eip712Domain--}[`++eip712Domain()++`]
- * {xref-EIP712-_EIP712Name--}[`++_EIP712Name()++`]
- * {xref-EIP712-_EIP712Version--}[`++_EIP712Version()++`]
- [.contract-subindex-inherited]
- .IERC5267
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .Nonces
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC5267
- * {xref-IERC5267-EIP712DomainChanged--}[`++EIP712DomainChanged()++`]
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC20Permit-ERC2612ExpiredSignature-uint256-}[`++ERC2612ExpiredSignature(deadline)++`]
- * {xref-ERC20Permit-ERC2612InvalidSigner-address-address-}[`++ERC2612InvalidSigner(signer, owner)++`]
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-InvalidAccountNonce-address-uint256-}[`++InvalidAccountNonce(account, currentNonce)++`]
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC5267
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Permit-constructor-string-]]
- ==== `[.contract-item-name]#++constructor++#++(string name)++` [.item-kind]#internal#
- Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
- It's a good idea to use the same `name` that is defined as the ERC-20 token name.
- [.contract-item]
- [[ERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++permit++#++(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)++` [.item-kind]#public#
- Sets `value` as the allowance of `spender` over ``owner``'s tokens,
- given ``owner``'s signed approval.
- IMPORTANT: The same issues {IERC20-approve} has related to transaction
- ordering also apply here.
- Emits an {Approval} event.
- Requirements:
- - `spender` cannot be the zero address.
- - `deadline` must be a timestamp in the future.
- - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
- over the EIP712-formatted function arguments.
- - the signature must use ``owner``'s current nonce (see {nonces}).
- For more information on the signature format, see the
- https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
- section].
- CAUTION: See Security Considerations above.
- [.contract-item]
- [[ERC20Permit-nonces-address-]]
- ==== `[.contract-item-name]#++nonces++#++(address owner) → uint256++` [.item-kind]#public#
- Returns the current nonce for `owner`. This value must be
- included whenever a signature is generated for {permit}.
- Every successful call to {permit} increases ``owner``'s nonce by one. This
- prevents a signature from being used multiple times.
- [.contract-item]
- [[ERC20Permit-DOMAIN_SEPARATOR--]]
- ==== `[.contract-item-name]#++DOMAIN_SEPARATOR++#++() → bytes32++` [.item-kind]#external#
- Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
- [.contract-item]
- [[ERC20Permit-ERC2612ExpiredSignature-uint256-]]
- ==== `[.contract-item-name]#++ERC2612ExpiredSignature++#++(uint256 deadline)++` [.item-kind]#error#
- Permit deadline has expired.
- [.contract-item]
- [[ERC20Permit-ERC2612InvalidSigner-address-address-]]
- ==== `[.contract-item-name]#++ERC2612InvalidSigner++#++(address signer, address owner)++` [.item-kind]#error#
- Mismatched signature.
- :burn: pass:normal[xref:#ERC20Burnable-burn-uint256-[`++burn++`]]
- :burnFrom: pass:normal[xref:#ERC20Burnable-burnFrom-address-uint256-[`++burnFrom++`]]
- [.contract]
- [[ERC20Burnable]]
- === `++ERC20Burnable++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Burnable.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
- ```
- Extension of {ERC20} that allows token holders to destroy both their own
- tokens and those that they have an allowance for, in a way that can be
- recognized off-chain (via event analysis).
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Burnable-burn-uint256-}[`++burn(value)++`]
- * {xref-ERC20Burnable-burnFrom-address-uint256-}[`++burnFrom(account, value)++`]
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Burnable-burn-uint256-]]
- ==== `[.contract-item-name]#++burn++#++(uint256 value)++` [.item-kind]#public#
- Destroys a `value` amount of tokens from the caller.
- See {ERC20-_burn}.
- [.contract-item]
- [[ERC20Burnable-burnFrom-address-uint256-]]
- ==== `[.contract-item-name]#++burnFrom++#++(address account, uint256 value)++` [.item-kind]#public#
- Destroys a `value` amount of tokens from `account`, deducting from
- the caller's allowance.
- See {ERC20-_burn} and {ERC20-allowance}.
- Requirements:
- - the caller must have allowance for ``accounts``'s tokens of at least
- `value`.
- :ERC20ExceededCap: pass:normal[xref:#ERC20Capped-ERC20ExceededCap-uint256-uint256-[`++ERC20ExceededCap++`]]
- :ERC20InvalidCap: pass:normal[xref:#ERC20Capped-ERC20InvalidCap-uint256-[`++ERC20InvalidCap++`]]
- :constructor: pass:normal[xref:#ERC20Capped-constructor-uint256-[`++constructor++`]]
- :cap: pass:normal[xref:#ERC20Capped-cap--[`++cap++`]]
- :_update: pass:normal[xref:#ERC20Capped-_update-address-address-uint256-[`++_update++`]]
- [.contract]
- [[ERC20Capped]]
- === `++ERC20Capped++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Capped.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Capped.sol";
- ```
- Extension of {ERC20} that adds a cap to the supply of tokens.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Capped-constructor-uint256-}[`++constructor(cap_)++`]
- * {xref-ERC20Capped-cap--}[`++cap()++`]
- * {xref-ERC20Capped-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC20Capped-ERC20ExceededCap-uint256-uint256-}[`++ERC20ExceededCap(increasedSupply, cap)++`]
- * {xref-ERC20Capped-ERC20InvalidCap-uint256-}[`++ERC20InvalidCap(cap)++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Capped-constructor-uint256-]]
- ==== `[.contract-item-name]#++constructor++#++(uint256 cap_)++` [.item-kind]#internal#
- Sets the value of the `cap`. This value is immutable, it can only be
- set once during construction.
- [.contract-item]
- [[ERC20Capped-cap--]]
- ==== `[.contract-item-name]#++cap++#++() → uint256++` [.item-kind]#public#
- Returns the cap on the token's total supply.
- [.contract-item]
- [[ERC20Capped-_update-address-address-uint256-]]
- ==== `[.contract-item-name]#++_update++#++(address from, address to, uint256 value)++` [.item-kind]#internal#
- See {ERC20-_update}.
- [.contract-item]
- [[ERC20Capped-ERC20ExceededCap-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC20ExceededCap++#++(uint256 increasedSupply, uint256 cap)++` [.item-kind]#error#
- Total supply cap has been exceeded.
- [.contract-item]
- [[ERC20Capped-ERC20InvalidCap-uint256-]]
- ==== `[.contract-item-name]#++ERC20InvalidCap++#++(uint256 cap)++` [.item-kind]#error#
- The supplied cap is not a valid cap.
- :_update: pass:normal[xref:#ERC20Pausable-_update-address-address-uint256-[`++_update++`]]
- [.contract]
- [[ERC20Pausable]]
- === `++ERC20Pausable++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Pausable.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
- ```
- ERC-20 token with pausable token transfers, minting and burning.
- Useful for scenarios such as preventing trades until the end of an evaluation
- period, or having an emergency switch for freezing all token transfers in the
- event of a large bug.
- IMPORTANT: This contract does not include public pause and unpause functions. In
- addition to inheriting this contract, you must define both functions, invoking the
- {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
- access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
- make the contract pause mechanism of the contract unreachable, and thus unusable.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Pausable-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- [.contract-subindex-inherited]
- .Pausable
- * {xref-Pausable-paused--}[`++paused()++`]
- * {xref-Pausable-_requireNotPaused--}[`++_requireNotPaused()++`]
- * {xref-Pausable-_requirePaused--}[`++_requirePaused()++`]
- * {xref-Pausable-_pause--}[`++_pause()++`]
- * {xref-Pausable-_unpause--}[`++_unpause()++`]
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .Pausable
- * {xref-Pausable-Paused-address-}[`++Paused(account)++`]
- * {xref-Pausable-Unpaused-address-}[`++Unpaused(account)++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- [.contract-subindex-inherited]
- .Pausable
- * {xref-Pausable-EnforcedPause--}[`++EnforcedPause()++`]
- * {xref-Pausable-ExpectedPause--}[`++ExpectedPause()++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Pausable-_update-address-address-uint256-]]
- ==== `[.contract-item-name]#++_update++#++(address from, address to, uint256 value)++` [.item-kind]#internal#
- See {ERC20-_update}.
- Requirements:
- - the contract must not be paused.
- :ERC20ExceededSafeSupply: pass:normal[xref:#ERC20Votes-ERC20ExceededSafeSupply-uint256-uint256-[`++ERC20ExceededSafeSupply++`]]
- :_maxSupply: pass:normal[xref:#ERC20Votes-_maxSupply--[`++_maxSupply++`]]
- :_update: pass:normal[xref:#ERC20Votes-_update-address-address-uint256-[`++_update++`]]
- :_getVotingUnits: pass:normal[xref:#ERC20Votes-_getVotingUnits-address-[`++_getVotingUnits++`]]
- :numCheckpoints: pass:normal[xref:#ERC20Votes-numCheckpoints-address-[`++numCheckpoints++`]]
- :checkpoints: pass:normal[xref:#ERC20Votes-checkpoints-address-uint32-[`++checkpoints++`]]
- [.contract]
- [[ERC20Votes]]
- === `++ERC20Votes++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Votes.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
- ```
- Extension of ERC-20 to support Compound-like voting and delegation. This version is more generic than Compound's,
- and supports token supply up to 2^208^ - 1, while COMP is limited to 2^96^ - 1.
- NOTE: This contract does not provide interface compatibility with Compound's COMP token.
- This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
- by calling the {Votes-delegate} function directly, or by providing a signature to be used with {Votes-delegateBySig}. Voting
- power can be queried through the public accessors {Votes-getVotes} and {Votes-getPastVotes}.
- By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
- requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Votes-_maxSupply--}[`++_maxSupply()++`]
- * {xref-ERC20Votes-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20Votes-_getVotingUnits-address-}[`++_getVotingUnits(account)++`]
- * {xref-ERC20Votes-numCheckpoints-address-}[`++numCheckpoints(account)++`]
- * {xref-ERC20Votes-checkpoints-address-uint32-}[`++checkpoints(account, pos)++`]
- [.contract-subindex-inherited]
- .Votes
- * {xref-Votes-clock--}[`++clock()++`]
- * {xref-Votes-CLOCK_MODE--}[`++CLOCK_MODE()++`]
- * {xref-Votes-_validateTimepoint-uint256-}[`++_validateTimepoint(timepoint)++`]
- * {xref-Votes-getVotes-address-}[`++getVotes(account)++`]
- * {xref-Votes-getPastVotes-address-uint256-}[`++getPastVotes(account, timepoint)++`]
- * {xref-Votes-getPastTotalSupply-uint256-}[`++getPastTotalSupply(timepoint)++`]
- * {xref-Votes-_getTotalSupply--}[`++_getTotalSupply()++`]
- * {xref-Votes-delegates-address-}[`++delegates(account)++`]
- * {xref-Votes-delegate-address-}[`++delegate(delegatee)++`]
- * {xref-Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-}[`++delegateBySig(delegatee, nonce, expiry, v, r, s)++`]
- * {xref-Votes-_delegate-address-address-}[`++_delegate(account, delegatee)++`]
- * {xref-Votes-_transferVotingUnits-address-address-uint256-}[`++_transferVotingUnits(from, to, amount)++`]
- * {xref-Votes-_moveDelegateVotes-address-address-uint256-}[`++_moveDelegateVotes(from, to, amount)++`]
- * {xref-Votes-_numCheckpoints-address-}[`++_numCheckpoints(account)++`]
- * {xref-Votes-_checkpoints-address-uint32-}[`++_checkpoints(account, pos)++`]
- [.contract-subindex-inherited]
- .IERC5805
- [.contract-subindex-inherited]
- .IVotes
- [.contract-subindex-inherited]
- .IERC6372
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-nonces-address-}[`++nonces(owner)++`]
- * {xref-Nonces-_useNonce-address-}[`++_useNonce(owner)++`]
- * {xref-Nonces-_useCheckedNonce-address-uint256-}[`++_useCheckedNonce(owner, nonce)++`]
- [.contract-subindex-inherited]
- .EIP712
- * {xref-EIP712-_domainSeparatorV4--}[`++_domainSeparatorV4()++`]
- * {xref-EIP712-_hashTypedDataV4-bytes32-}[`++_hashTypedDataV4(structHash)++`]
- * {xref-EIP712-eip712Domain--}[`++eip712Domain()++`]
- * {xref-EIP712-_EIP712Name--}[`++_EIP712Name()++`]
- * {xref-EIP712-_EIP712Version--}[`++_EIP712Version()++`]
- [.contract-subindex-inherited]
- .IERC5267
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .Votes
- [.contract-subindex-inherited]
- .IERC5805
- [.contract-subindex-inherited]
- .IVotes
- * {xref-IVotes-DelegateChanged-address-address-address-}[`++DelegateChanged(delegator, fromDelegate, toDelegate)++`]
- * {xref-IVotes-DelegateVotesChanged-address-uint256-uint256-}[`++DelegateVotesChanged(delegate, previousVotes, newVotes)++`]
- [.contract-subindex-inherited]
- .IERC6372
- [.contract-subindex-inherited]
- .Nonces
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC5267
- * {xref-IERC5267-EIP712DomainChanged--}[`++EIP712DomainChanged()++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC20Votes-ERC20ExceededSafeSupply-uint256-uint256-}[`++ERC20ExceededSafeSupply(increasedSupply, cap)++`]
- [.contract-subindex-inherited]
- .Votes
- * {xref-Votes-ERC6372InconsistentClock--}[`++ERC6372InconsistentClock()++`]
- * {xref-Votes-ERC5805FutureLookup-uint256-uint48-}[`++ERC5805FutureLookup(timepoint, clock)++`]
- [.contract-subindex-inherited]
- .IERC5805
- [.contract-subindex-inherited]
- .IVotes
- * {xref-IVotes-VotesExpiredSignature-uint256-}[`++VotesExpiredSignature(expiry)++`]
- [.contract-subindex-inherited]
- .IERC6372
- [.contract-subindex-inherited]
- .Nonces
- * {xref-Nonces-InvalidAccountNonce-address-uint256-}[`++InvalidAccountNonce(account, currentNonce)++`]
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC5267
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Votes-_maxSupply--]]
- ==== `[.contract-item-name]#++_maxSupply++#++() → uint256++` [.item-kind]#internal#
- Maximum token supply. Defaults to `type(uint208).max` (2^208^ - 1).
- This maximum is enforced in {_update}. It limits the total supply of the token, which is otherwise a uint256,
- so that checkpoints can be stored in the Trace208 structure used by {Votes}. Increasing this value will not
- remove the underlying limitation, and will cause {_update} to fail because of a math overflow in
- {Votes-_transferVotingUnits}. An override could be used to further restrict the total supply (to a lower value) if
- additional logic requires it. When resolving override conflicts on this function, the minimum should be
- returned.
- [.contract-item]
- [[ERC20Votes-_update-address-address-uint256-]]
- ==== `[.contract-item-name]#++_update++#++(address from, address to, uint256 value)++` [.item-kind]#internal#
- Move voting power when tokens are transferred.
- Emits a {IVotes-DelegateVotesChanged} event.
- [.contract-item]
- [[ERC20Votes-_getVotingUnits-address-]]
- ==== `[.contract-item-name]#++_getVotingUnits++#++(address account) → uint256++` [.item-kind]#internal#
- Returns the voting units of an `account`.
- WARNING: Overriding this function may compromise the internal vote accounting.
- `ERC20Votes` assumes tokens map to voting units 1:1 and this is not easy to change.
- [.contract-item]
- [[ERC20Votes-numCheckpoints-address-]]
- ==== `[.contract-item-name]#++numCheckpoints++#++(address account) → uint32++` [.item-kind]#public#
- Get number of checkpoints for `account`.
- [.contract-item]
- [[ERC20Votes-checkpoints-address-uint32-]]
- ==== `[.contract-item-name]#++checkpoints++#++(address account, uint32 pos) → struct Checkpoints.Checkpoint208++` [.item-kind]#public#
- Get the `pos`-th checkpoint for `account`.
- [.contract-item]
- [[ERC20Votes-ERC20ExceededSafeSupply-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC20ExceededSafeSupply++#++(uint256 increasedSupply, uint256 cap)++` [.item-kind]#error#
- Total supply cap has been exceeded, introducing a risk of votes overflowing.
- :ERC20InvalidUnderlying: pass:normal[xref:#ERC20Wrapper-ERC20InvalidUnderlying-address-[`++ERC20InvalidUnderlying++`]]
- :constructor: pass:normal[xref:#ERC20Wrapper-constructor-contract-IERC20-[`++constructor++`]]
- :decimals: pass:normal[xref:#ERC20Wrapper-decimals--[`++decimals++`]]
- :underlying: pass:normal[xref:#ERC20Wrapper-underlying--[`++underlying++`]]
- :depositFor: pass:normal[xref:#ERC20Wrapper-depositFor-address-uint256-[`++depositFor++`]]
- :withdrawTo: pass:normal[xref:#ERC20Wrapper-withdrawTo-address-uint256-[`++withdrawTo++`]]
- :_recover: pass:normal[xref:#ERC20Wrapper-_recover-address-[`++_recover++`]]
- [.contract]
- [[ERC20Wrapper]]
- === `++ERC20Wrapper++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20Wrapper.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Wrapper.sol";
- ```
- Extension of the ERC-20 token contract to support token wrapping.
- Users can deposit and withdraw "underlying tokens" and receive a matching number of "wrapped tokens". This is useful
- in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the
- wrapping of an existing "basic" ERC-20 into a governance token.
- WARNING: Any mechanism in which the underlying token changes the {balanceOf} of an account without an explicit transfer
- may desynchronize this contract's supply and its underlying balance. Please exercise caution when wrapping tokens that
- may undercollateralize the wrapper (i.e. wrapper's total supply is higher than its underlying balance). See {_recover}
- for recovering value accrued to the wrapper.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Wrapper-constructor-contract-IERC20-}[`++constructor(underlyingToken)++`]
- * {xref-ERC20Wrapper-decimals--}[`++decimals()++`]
- * {xref-ERC20Wrapper-underlying--}[`++underlying()++`]
- * {xref-ERC20Wrapper-depositFor-address-uint256-}[`++depositFor(account, value)++`]
- * {xref-ERC20Wrapper-withdrawTo-address-uint256-}[`++withdrawTo(account, value)++`]
- * {xref-ERC20Wrapper-_recover-address-}[`++_recover(account)++`]
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC20Wrapper-ERC20InvalidUnderlying-address-}[`++ERC20InvalidUnderlying(token)++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20Wrapper-constructor-contract-IERC20-]]
- ==== `[.contract-item-name]#++constructor++#++(contract IERC20 underlyingToken)++` [.item-kind]#internal#
- [.contract-item]
- [[ERC20Wrapper-decimals--]]
- ==== `[.contract-item-name]#++decimals++#++() → uint8++` [.item-kind]#public#
- See {ERC20-decimals}.
- [.contract-item]
- [[ERC20Wrapper-underlying--]]
- ==== `[.contract-item-name]#++underlying++#++() → contract IERC20++` [.item-kind]#public#
- Returns the address of the underlying ERC-20 token that is being wrapped.
- [.contract-item]
- [[ERC20Wrapper-depositFor-address-uint256-]]
- ==== `[.contract-item-name]#++depositFor++#++(address account, uint256 value) → bool++` [.item-kind]#public#
- Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens.
- [.contract-item]
- [[ERC20Wrapper-withdrawTo-address-uint256-]]
- ==== `[.contract-item-name]#++withdrawTo++#++(address account, uint256 value) → bool++` [.item-kind]#public#
- Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens.
- [.contract-item]
- [[ERC20Wrapper-_recover-address-]]
- ==== `[.contract-item-name]#++_recover++#++(address account) → uint256++` [.item-kind]#internal#
- Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake or acquired from
- rebasing mechanisms. Internal function that can be exposed with access control if desired.
- [.contract-item]
- [[ERC20Wrapper-ERC20InvalidUnderlying-address-]]
- ==== `[.contract-item-name]#++ERC20InvalidUnderlying++#++(address token)++` [.item-kind]#error#
- The underlying token couldn't be wrapped.
- :ERC3156UnsupportedToken: pass:normal[xref:#ERC20FlashMint-ERC3156UnsupportedToken-address-[`++ERC3156UnsupportedToken++`]]
- :ERC3156ExceededMaxLoan: pass:normal[xref:#ERC20FlashMint-ERC3156ExceededMaxLoan-uint256-[`++ERC3156ExceededMaxLoan++`]]
- :ERC3156InvalidReceiver: pass:normal[xref:#ERC20FlashMint-ERC3156InvalidReceiver-address-[`++ERC3156InvalidReceiver++`]]
- :maxFlashLoan: pass:normal[xref:#ERC20FlashMint-maxFlashLoan-address-[`++maxFlashLoan++`]]
- :flashFee: pass:normal[xref:#ERC20FlashMint-flashFee-address-uint256-[`++flashFee++`]]
- :_flashFee: pass:normal[xref:#ERC20FlashMint-_flashFee-address-uint256-[`++_flashFee++`]]
- :_flashFeeReceiver: pass:normal[xref:#ERC20FlashMint-_flashFeeReceiver--[`++_flashFeeReceiver++`]]
- :flashLoan: pass:normal[xref:#ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-[`++flashLoan++`]]
- [.contract]
- [[ERC20FlashMint]]
- === `++ERC20FlashMint++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC20FlashMint.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
- ```
- Implementation of the ERC-3156 Flash loans extension, as defined in
- https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
- Adds the {flashLoan} method, which provides flash loan support at the token
- level. By default there is no fee, but this can be changed by overriding {flashFee}.
- NOTE: When this extension is used along with the {ERC20Capped} or {ERC20Votes} extensions,
- {maxFlashLoan} will not correctly reflect the maximum that can be flash minted. We recommend
- overriding {maxFlashLoan} so that it correctly reflects the supply cap.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20FlashMint-maxFlashLoan-address-}[`++maxFlashLoan(token)++`]
- * {xref-ERC20FlashMint-flashFee-address-uint256-}[`++flashFee(token, value)++`]
- * {xref-ERC20FlashMint-_flashFee-address-uint256-}[`++_flashFee(token, value)++`]
- * {xref-ERC20FlashMint-_flashFeeReceiver--}[`++_flashFeeReceiver()++`]
- * {xref-ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-}[`++flashLoan(receiver, token, value, data)++`]
- [.contract-subindex-inherited]
- .IERC3156FlashLender
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC3156FlashLender
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC20FlashMint-ERC3156UnsupportedToken-address-}[`++ERC3156UnsupportedToken(token)++`]
- * {xref-ERC20FlashMint-ERC3156ExceededMaxLoan-uint256-}[`++ERC3156ExceededMaxLoan(maxLoan)++`]
- * {xref-ERC20FlashMint-ERC3156InvalidReceiver-address-}[`++ERC3156InvalidReceiver(receiver)++`]
- [.contract-subindex-inherited]
- .IERC3156FlashLender
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20FlashMint-maxFlashLoan-address-]]
- ==== `[.contract-item-name]#++maxFlashLoan++#++(address token) → uint256++` [.item-kind]#public#
- Returns the maximum amount of tokens available for loan.
- [.contract-item]
- [[ERC20FlashMint-flashFee-address-uint256-]]
- ==== `[.contract-item-name]#++flashFee++#++(address token, uint256 value) → uint256++` [.item-kind]#public#
- Returns the fee applied when doing flash loans. This function calls
- the {_flashFee} function which returns the fee applied when doing flash
- loans.
- [.contract-item]
- [[ERC20FlashMint-_flashFee-address-uint256-]]
- ==== `[.contract-item-name]#++_flashFee++#++(address token, uint256 value) → uint256++` [.item-kind]#internal#
- Returns the fee applied when doing flash loans. By default this
- implementation has 0 fees. This function can be overloaded to make
- the flash loan mechanism deflationary.
- [.contract-item]
- [[ERC20FlashMint-_flashFeeReceiver--]]
- ==== `[.contract-item-name]#++_flashFeeReceiver++#++() → address++` [.item-kind]#internal#
- Returns the receiver address of the flash fee. By default this
- implementation returns the address(0) which means the fee amount will be burnt.
- This function can be overloaded to change the fee receiver.
- [.contract-item]
- [[ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++flashLoan++#++(contract IERC3156FlashBorrower receiver, address token, uint256 value, bytes data) → bool++` [.item-kind]#public#
- Performs a flash loan. New tokens are minted and sent to the
- `receiver`, who is required to implement the {IERC3156FlashBorrower}
- interface. By the end of the flash loan, the receiver is expected to own
- value + fee tokens and have them approved back to the token contract itself so
- they can be burned.
- [.contract-item]
- [[ERC20FlashMint-ERC3156UnsupportedToken-address-]]
- ==== `[.contract-item-name]#++ERC3156UnsupportedToken++#++(address token)++` [.item-kind]#error#
- The loan token is not valid.
- [.contract-item]
- [[ERC20FlashMint-ERC3156ExceededMaxLoan-uint256-]]
- ==== `[.contract-item-name]#++ERC3156ExceededMaxLoan++#++(uint256 maxLoan)++` [.item-kind]#error#
- The requested loan exceeds the max loan value for `token`.
- [.contract-item]
- [[ERC20FlashMint-ERC3156InvalidReceiver-address-]]
- ==== `[.contract-item-name]#++ERC3156InvalidReceiver++#++(address receiver)++` [.item-kind]#error#
- The receiver of a flashloan is not a valid {IERC3156FlashBorrower-onFlashLoan} implementer.
- :allowance: pass:normal[xref:#ERC20TemporaryApproval-allowance-address-address-[`++allowance++`]]
- :_temporaryAllowance: pass:normal[xref:#ERC20TemporaryApproval-_temporaryAllowance-address-address-[`++_temporaryAllowance++`]]
- :temporaryApprove: pass:normal[xref:#ERC20TemporaryApproval-temporaryApprove-address-uint256-[`++temporaryApprove++`]]
- :_temporaryApprove: pass:normal[xref:#ERC20TemporaryApproval-_temporaryApprove-address-address-uint256-[`++_temporaryApprove++`]]
- :_spendAllowance: pass:normal[xref:#ERC20TemporaryApproval-_spendAllowance-address-address-uint256-[`++_spendAllowance++`]]
- [.contract]
- [[ERC20TemporaryApproval]]
- === `++ERC20TemporaryApproval++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/draft-ERC20TemporaryApproval.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20TemporaryApproval.sol";
- ```
- Extension of {ERC20} that adds support for temporary allowances following ERC-7674.
- WARNING: This is a draft contract. The corresponding ERC is still subject to changes.
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20TemporaryApproval-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20TemporaryApproval-_temporaryAllowance-address-address-}[`++_temporaryAllowance(owner, spender)++`]
- * {xref-ERC20TemporaryApproval-temporaryApprove-address-uint256-}[`++temporaryApprove(spender, value)++`]
- * {xref-ERC20TemporaryApproval-_temporaryApprove-address-address-uint256-}[`++_temporaryApprove(owner, spender, value)++`]
- * {xref-ERC20TemporaryApproval-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC7674
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC7674
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- [.contract-subindex-inherited]
- .IERC7674
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC20TemporaryApproval-allowance-address-address-]]
- ==== `[.contract-item-name]#++allowance++#++(address owner, address spender) → uint256++` [.item-kind]#public#
- {allowance} override that includes the temporary allowance when looking up the current allowance. If
- adding up the persistent and the temporary allowances result in an overflow, type(uint256).max is returned.
- [.contract-item]
- [[ERC20TemporaryApproval-_temporaryAllowance-address-address-]]
- ==== `[.contract-item-name]#++_temporaryAllowance++#++(address owner, address spender) → uint256++` [.item-kind]#internal#
- Internal getter for the current temporary allowance that `spender` has over `owner` tokens.
- [.contract-item]
- [[ERC20TemporaryApproval-temporaryApprove-address-uint256-]]
- ==== `[.contract-item-name]#++temporaryApprove++#++(address spender, uint256 value) → bool++` [.item-kind]#public#
- Alternative to {approve} that sets a `value` amount of tokens as the temporary allowance of `spender` over
- the caller's tokens.
- Returns a boolean value indicating whether the operation succeeded.
- Requirements:
- - `spender` cannot be the zero address.
- Does NOT emit an {Approval} event.
- [.contract-item]
- [[ERC20TemporaryApproval-_temporaryApprove-address-address-uint256-]]
- ==== `[.contract-item-name]#++_temporaryApprove++#++(address owner, address spender, uint256 value)++` [.item-kind]#internal#
- Sets `value` as the temporary allowance of `spender` over the `owner` s tokens.
- This internal function is equivalent to `temporaryApprove`, and can be used to e.g. set automatic allowances
- for certain subsystems, etc.
- Requirements:
- - `owner` cannot be the zero address.
- - `spender` cannot be the zero address.
- Does NOT emit an {Approval} event.
- [.contract-item]
- [[ERC20TemporaryApproval-_spendAllowance-address-address-uint256-]]
- ==== `[.contract-item-name]#++_spendAllowance++#++(address owner, address spender, uint256 value)++` [.item-kind]#internal#
- {_spendAllowance} override that consumes the temporary allowance (if any) before eventually falling back
- to consuming the persistent allowance.
- NOTE: This function skips calling `super._spendAllowance` if the temporary allowance
- is enough to cover the spending.
- :ERC1363TransferFailed: pass:normal[xref:#ERC1363-ERC1363TransferFailed-address-uint256-[`++ERC1363TransferFailed++`]]
- :ERC1363TransferFromFailed: pass:normal[xref:#ERC1363-ERC1363TransferFromFailed-address-address-uint256-[`++ERC1363TransferFromFailed++`]]
- :ERC1363ApproveFailed: pass:normal[xref:#ERC1363-ERC1363ApproveFailed-address-uint256-[`++ERC1363ApproveFailed++`]]
- :supportsInterface: pass:normal[xref:#ERC1363-supportsInterface-bytes4-[`++supportsInterface++`]]
- :transferAndCall: pass:normal[xref:#ERC1363-transferAndCall-address-uint256-[`++transferAndCall++`]]
- :transferAndCall: pass:normal[xref:#ERC1363-transferAndCall-address-uint256-bytes-[`++transferAndCall++`]]
- :transferFromAndCall: pass:normal[xref:#ERC1363-transferFromAndCall-address-address-uint256-[`++transferFromAndCall++`]]
- :transferFromAndCall: pass:normal[xref:#ERC1363-transferFromAndCall-address-address-uint256-bytes-[`++transferFromAndCall++`]]
- :approveAndCall: pass:normal[xref:#ERC1363-approveAndCall-address-uint256-[`++approveAndCall++`]]
- :approveAndCall: pass:normal[xref:#ERC1363-approveAndCall-address-uint256-bytes-[`++approveAndCall++`]]
- [.contract]
- [[ERC1363]]
- === `++ERC1363++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC1363.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC1363.sol";
- ```
- Extension of {ERC20} tokens that adds support for code execution after transfers and approvals
- on recipient contracts. Calls after transfers are enabled through the {ERC1363-transferAndCall} and
- {ERC1363-transferFromAndCall} methods while calls after approvals can be made with {ERC1363-approveAndCall}
- _Available since v5.1._
- [.contract-index]
- .Functions
- --
- * {xref-ERC1363-supportsInterface-bytes4-}[`++supportsInterface(interfaceId)++`]
- * {xref-ERC1363-transferAndCall-address-uint256-}[`++transferAndCall(to, value)++`]
- * {xref-ERC1363-transferAndCall-address-uint256-bytes-}[`++transferAndCall(to, value, data)++`]
- * {xref-ERC1363-transferFromAndCall-address-address-uint256-}[`++transferFromAndCall(from, to, value)++`]
- * {xref-ERC1363-transferFromAndCall-address-address-uint256-bytes-}[`++transferFromAndCall(from, to, value, data)++`]
- * {xref-ERC1363-approveAndCall-address-uint256-}[`++approveAndCall(spender, value)++`]
- * {xref-ERC1363-approveAndCall-address-uint256-bytes-}[`++approveAndCall(spender, value, data)++`]
- [.contract-subindex-inherited]
- .IERC1363
- [.contract-subindex-inherited]
- .ERC165
- [.contract-subindex-inherited]
- .IERC165
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-decimals--}[`++decimals()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC1363
- [.contract-subindex-inherited]
- .ERC165
- [.contract-subindex-inherited]
- .IERC165
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC1363-ERC1363TransferFailed-address-uint256-}[`++ERC1363TransferFailed(receiver, value)++`]
- * {xref-ERC1363-ERC1363TransferFromFailed-address-address-uint256-}[`++ERC1363TransferFromFailed(sender, receiver, value)++`]
- * {xref-ERC1363-ERC1363ApproveFailed-address-uint256-}[`++ERC1363ApproveFailed(spender, value)++`]
- [.contract-subindex-inherited]
- .IERC1363
- [.contract-subindex-inherited]
- .ERC165
- [.contract-subindex-inherited]
- .IERC165
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC1363-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.
- [.contract-item]
- [[ERC1363-transferAndCall-address-uint256-]]
- ==== `[.contract-item-name]#++transferAndCall++#++(address to, uint256 value) → bool++` [.item-kind]#public#
- Moves a `value` amount of tokens from the caller's account to `to`
- and then calls {IERC1363Receiver-onTransferReceived} on `to`. Returns a flag that indicates
- if the call succeeded.
- Requirements:
- - The target has code (i.e. is a contract).
- - The target `to` must implement the {IERC1363Receiver} interface.
- - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
- - The internal {transfer} must succeed (returned `true`).
- [.contract-item]
- [[ERC1363-transferAndCall-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++transferAndCall++#++(address to, uint256 value, bytes data) → bool++` [.item-kind]#public#
- Variant of {transferAndCall} that accepts an additional `data` parameter with
- no specified format.
- [.contract-item]
- [[ERC1363-transferFromAndCall-address-address-uint256-]]
- ==== `[.contract-item-name]#++transferFromAndCall++#++(address from, address to, uint256 value) → bool++` [.item-kind]#public#
- Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
- and then calls {IERC1363Receiver-onTransferReceived} on `to`. Returns a flag that indicates
- if the call succeeded.
- Requirements:
- - The target has code (i.e. is a contract).
- - The target `to` must implement the {IERC1363Receiver} interface.
- - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
- - The internal {transferFrom} must succeed (returned `true`).
- [.contract-item]
- [[ERC1363-transferFromAndCall-address-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++transferFromAndCall++#++(address from, address to, uint256 value, bytes data) → bool++` [.item-kind]#public#
- Variant of {transferFromAndCall} that accepts an additional `data` parameter with
- no specified format.
- [.contract-item]
- [[ERC1363-approveAndCall-address-uint256-]]
- ==== `[.contract-item-name]#++approveAndCall++#++(address spender, uint256 value) → bool++` [.item-kind]#public#
- Sets a `value` amount of tokens as the allowance of `spender` over the
- caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
- Returns a flag that indicates if the call succeeded.
- Requirements:
- - The target has code (i.e. is a contract).
- - The target `spender` must implement the {IERC1363Spender} interface.
- - The target must return the {IERC1363Spender-onApprovalReceived} selector to accept the approval.
- - The internal {approve} must succeed (returned `true`).
- [.contract-item]
- [[ERC1363-approveAndCall-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++approveAndCall++#++(address spender, uint256 value, bytes data) → bool++` [.item-kind]#public#
- Variant of {approveAndCall} that accepts an additional `data` parameter with
- no specified format.
- [.contract-item]
- [[ERC1363-ERC1363TransferFailed-address-uint256-]]
- ==== `[.contract-item-name]#++ERC1363TransferFailed++#++(address receiver, uint256 value)++` [.item-kind]#error#
- Indicates a failure within the {transfer} part of a transferAndCall operation.
- [.contract-item]
- [[ERC1363-ERC1363TransferFromFailed-address-address-uint256-]]
- ==== `[.contract-item-name]#++ERC1363TransferFromFailed++#++(address sender, address receiver, uint256 value)++` [.item-kind]#error#
- Indicates a failure within the {transferFrom} part of a transferFromAndCall operation.
- [.contract-item]
- [[ERC1363-ERC1363ApproveFailed-address-uint256-]]
- ==== `[.contract-item-name]#++ERC1363ApproveFailed++#++(address spender, uint256 value)++` [.item-kind]#error#
- Indicates a failure within the {approve} part of a approveAndCall operation.
- :ERC4626ExceededMaxDeposit: pass:normal[xref:#ERC4626-ERC4626ExceededMaxDeposit-address-uint256-uint256-[`++ERC4626ExceededMaxDeposit++`]]
- :ERC4626ExceededMaxMint: pass:normal[xref:#ERC4626-ERC4626ExceededMaxMint-address-uint256-uint256-[`++ERC4626ExceededMaxMint++`]]
- :ERC4626ExceededMaxWithdraw: pass:normal[xref:#ERC4626-ERC4626ExceededMaxWithdraw-address-uint256-uint256-[`++ERC4626ExceededMaxWithdraw++`]]
- :ERC4626ExceededMaxRedeem: pass:normal[xref:#ERC4626-ERC4626ExceededMaxRedeem-address-uint256-uint256-[`++ERC4626ExceededMaxRedeem++`]]
- :constructor: pass:normal[xref:#ERC4626-constructor-contract-IERC20-[`++constructor++`]]
- :decimals: pass:normal[xref:#ERC4626-decimals--[`++decimals++`]]
- :asset: pass:normal[xref:#ERC4626-asset--[`++asset++`]]
- :totalAssets: pass:normal[xref:#ERC4626-totalAssets--[`++totalAssets++`]]
- :convertToShares: pass:normal[xref:#ERC4626-convertToShares-uint256-[`++convertToShares++`]]
- :convertToAssets: pass:normal[xref:#ERC4626-convertToAssets-uint256-[`++convertToAssets++`]]
- :maxDeposit: pass:normal[xref:#ERC4626-maxDeposit-address-[`++maxDeposit++`]]
- :maxMint: pass:normal[xref:#ERC4626-maxMint-address-[`++maxMint++`]]
- :maxWithdraw: pass:normal[xref:#ERC4626-maxWithdraw-address-[`++maxWithdraw++`]]
- :maxRedeem: pass:normal[xref:#ERC4626-maxRedeem-address-[`++maxRedeem++`]]
- :previewDeposit: pass:normal[xref:#ERC4626-previewDeposit-uint256-[`++previewDeposit++`]]
- :previewMint: pass:normal[xref:#ERC4626-previewMint-uint256-[`++previewMint++`]]
- :previewWithdraw: pass:normal[xref:#ERC4626-previewWithdraw-uint256-[`++previewWithdraw++`]]
- :previewRedeem: pass:normal[xref:#ERC4626-previewRedeem-uint256-[`++previewRedeem++`]]
- :deposit: pass:normal[xref:#ERC4626-deposit-uint256-address-[`++deposit++`]]
- :mint: pass:normal[xref:#ERC4626-mint-uint256-address-[`++mint++`]]
- :withdraw: pass:normal[xref:#ERC4626-withdraw-uint256-address-address-[`++withdraw++`]]
- :redeem: pass:normal[xref:#ERC4626-redeem-uint256-address-address-[`++redeem++`]]
- :_convertToShares: pass:normal[xref:#ERC4626-_convertToShares-uint256-enum-Math-Rounding-[`++_convertToShares++`]]
- :_convertToAssets: pass:normal[xref:#ERC4626-_convertToAssets-uint256-enum-Math-Rounding-[`++_convertToAssets++`]]
- :_deposit: pass:normal[xref:#ERC4626-_deposit-address-address-uint256-uint256-[`++_deposit++`]]
- :_withdraw: pass:normal[xref:#ERC4626-_withdraw-address-address-address-uint256-uint256-[`++_withdraw++`]]
- :_decimalsOffset: pass:normal[xref:#ERC4626-_decimalsOffset--[`++_decimalsOffset++`]]
- [.contract]
- [[ERC4626]]
- === `++ERC4626++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/extensions/ERC4626.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
- ```
- Implementation of the ERC-4626 "Tokenized Vault Standard" as defined in
- https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].
- This extension allows the minting and burning of "shares" (represented using the ERC-20 inheritance) in exchange for
- underlying "assets" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends
- the ERC-20 standard. Any additional extensions included along it would affect the "shares" token represented by this
- contract and not the "assets" token which is an independent contract.
- [CAUTION]
- ====
- In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning
- with a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation
- attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial
- deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may
- similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by
- verifying the amount received is as expected, using a wrapper that performs these checks such as
- https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router].
- Since v4.9, this implementation introduces configurable virtual assets and shares to help developers mitigate that risk.
- The `_decimalsOffset()` corresponds to an offset in the decimal representation between the underlying asset's decimals
- and the vault decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which
- itself determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default
- offset (0) makes it non-profitable even if an attacker is able to capture value from multiple user deposits, as a result
- of the value being captured by the virtual shares (out of the attacker's donation) matching the attacker's expected gains.
- With a larger offset, the attack becomes orders of magnitude more expensive than it is profitable. More details about the
- underlying math can be found xref:erc4626.adoc#inflation-attack[here].
- The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued
- to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets
- will cause the first user to exit to experience reduced losses in detriment to the last users that will experience
- bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the
- `_convertToShares` and `_convertToAssets` functions.
- To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide].
- ====
- [.contract-index]
- .Functions
- --
- * {xref-ERC4626-constructor-contract-IERC20-}[`++constructor(asset_)++`]
- * {xref-ERC4626-decimals--}[`++decimals()++`]
- * {xref-ERC4626-asset--}[`++asset()++`]
- * {xref-ERC4626-totalAssets--}[`++totalAssets()++`]
- * {xref-ERC4626-convertToShares-uint256-}[`++convertToShares(assets)++`]
- * {xref-ERC4626-convertToAssets-uint256-}[`++convertToAssets(shares)++`]
- * {xref-ERC4626-maxDeposit-address-}[`++maxDeposit()++`]
- * {xref-ERC4626-maxMint-address-}[`++maxMint()++`]
- * {xref-ERC4626-maxWithdraw-address-}[`++maxWithdraw(owner)++`]
- * {xref-ERC4626-maxRedeem-address-}[`++maxRedeem(owner)++`]
- * {xref-ERC4626-previewDeposit-uint256-}[`++previewDeposit(assets)++`]
- * {xref-ERC4626-previewMint-uint256-}[`++previewMint(shares)++`]
- * {xref-ERC4626-previewWithdraw-uint256-}[`++previewWithdraw(assets)++`]
- * {xref-ERC4626-previewRedeem-uint256-}[`++previewRedeem(shares)++`]
- * {xref-ERC4626-deposit-uint256-address-}[`++deposit(assets, receiver)++`]
- * {xref-ERC4626-mint-uint256-address-}[`++mint(shares, receiver)++`]
- * {xref-ERC4626-withdraw-uint256-address-address-}[`++withdraw(assets, receiver, owner)++`]
- * {xref-ERC4626-redeem-uint256-address-address-}[`++redeem(shares, receiver, owner)++`]
- * {xref-ERC4626-_convertToShares-uint256-enum-Math-Rounding-}[`++_convertToShares(assets, rounding)++`]
- * {xref-ERC4626-_convertToAssets-uint256-enum-Math-Rounding-}[`++_convertToAssets(shares, rounding)++`]
- * {xref-ERC4626-_deposit-address-address-uint256-uint256-}[`++_deposit(caller, receiver, assets, shares)++`]
- * {xref-ERC4626-_withdraw-address-address-address-uint256-uint256-}[`++_withdraw(caller, receiver, owner, assets, shares)++`]
- * {xref-ERC4626-_decimalsOffset--}[`++_decimalsOffset()++`]
- [.contract-subindex-inherited]
- .IERC4626
- [.contract-subindex-inherited]
- .ERC20
- * {xref-ERC20-name--}[`++name()++`]
- * {xref-ERC20-symbol--}[`++symbol()++`]
- * {xref-ERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-ERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-ERC20-transfer-address-uint256-}[`++transfer(to, value)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, value)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, value)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, value)++`]
- * {xref-ERC20-_update-address-address-uint256-}[`++_update(from, to, value)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, value)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, value)++`]
- * {xref-ERC20-_approve-address-address-uint256-bool-}[`++_approve(owner, spender, value, emitEvent)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, value)++`]
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC4626
- * {xref-IERC4626-Deposit-address-address-uint256-uint256-}[`++Deposit(sender, owner, assets, shares)++`]
- * {xref-IERC4626-Withdraw-address-address-address-uint256-uint256-}[`++Withdraw(sender, receiver, owner, assets, shares)++`]
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- * {xref-IERC20-Transfer-address-address-uint256-}[`++Transfer(from, to, value)++`]
- * {xref-IERC20-Approval-address-address-uint256-}[`++Approval(owner, spender, value)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC4626-ERC4626ExceededMaxDeposit-address-uint256-uint256-}[`++ERC4626ExceededMaxDeposit(receiver, assets, max)++`]
- * {xref-ERC4626-ERC4626ExceededMaxMint-address-uint256-uint256-}[`++ERC4626ExceededMaxMint(receiver, shares, max)++`]
- * {xref-ERC4626-ERC4626ExceededMaxWithdraw-address-uint256-uint256-}[`++ERC4626ExceededMaxWithdraw(owner, assets, max)++`]
- * {xref-ERC4626-ERC4626ExceededMaxRedeem-address-uint256-uint256-}[`++ERC4626ExceededMaxRedeem(owner, shares, max)++`]
- [.contract-subindex-inherited]
- .IERC4626
- [.contract-subindex-inherited]
- .ERC20
- [.contract-subindex-inherited]
- .IERC20Errors
- * {xref-IERC20Errors-ERC20InsufficientBalance-address-uint256-uint256-}[`++ERC20InsufficientBalance(sender, balance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidSender-address-}[`++ERC20InvalidSender(sender)++`]
- * {xref-IERC20Errors-ERC20InvalidReceiver-address-}[`++ERC20InvalidReceiver(receiver)++`]
- * {xref-IERC20Errors-ERC20InsufficientAllowance-address-uint256-uint256-}[`++ERC20InsufficientAllowance(spender, allowance, needed)++`]
- * {xref-IERC20Errors-ERC20InvalidApprover-address-}[`++ERC20InvalidApprover(approver)++`]
- * {xref-IERC20Errors-ERC20InvalidSpender-address-}[`++ERC20InvalidSpender(spender)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-item]
- [[ERC4626-constructor-contract-IERC20-]]
- ==== `[.contract-item-name]#++constructor++#++(contract IERC20 asset_)++` [.item-kind]#internal#
- Set the underlying asset contract. This must be an ERC20-compatible contract (ERC-20 or ERC-777).
- [.contract-item]
- [[ERC4626-decimals--]]
- ==== `[.contract-item-name]#++decimals++#++() → uint8++` [.item-kind]#public#
- Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This
- "original" value is cached during construction of the vault contract. If this read operation fails (e.g., the
- asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals.
- See {IERC20Metadata-decimals}.
- [.contract-item]
- [[ERC4626-asset--]]
- ==== `[.contract-item-name]#++asset++#++() → address++` [.item-kind]#public#
- See {IERC4626-asset}.
- [.contract-item]
- [[ERC4626-totalAssets--]]
- ==== `[.contract-item-name]#++totalAssets++#++() → uint256++` [.item-kind]#public#
- See {IERC4626-totalAssets}.
- [.contract-item]
- [[ERC4626-convertToShares-uint256-]]
- ==== `[.contract-item-name]#++convertToShares++#++(uint256 assets) → uint256++` [.item-kind]#public#
- See {IERC4626-convertToShares}.
- [.contract-item]
- [[ERC4626-convertToAssets-uint256-]]
- ==== `[.contract-item-name]#++convertToAssets++#++(uint256 shares) → uint256++` [.item-kind]#public#
- See {IERC4626-convertToAssets}.
- [.contract-item]
- [[ERC4626-maxDeposit-address-]]
- ==== `[.contract-item-name]#++maxDeposit++#++(address) → uint256++` [.item-kind]#public#
- See {IERC4626-maxDeposit}.
- [.contract-item]
- [[ERC4626-maxMint-address-]]
- ==== `[.contract-item-name]#++maxMint++#++(address) → uint256++` [.item-kind]#public#
- See {IERC4626-maxMint}.
- [.contract-item]
- [[ERC4626-maxWithdraw-address-]]
- ==== `[.contract-item-name]#++maxWithdraw++#++(address owner) → uint256++` [.item-kind]#public#
- See {IERC4626-maxWithdraw}.
- [.contract-item]
- [[ERC4626-maxRedeem-address-]]
- ==== `[.contract-item-name]#++maxRedeem++#++(address owner) → uint256++` [.item-kind]#public#
- See {IERC4626-maxRedeem}.
- [.contract-item]
- [[ERC4626-previewDeposit-uint256-]]
- ==== `[.contract-item-name]#++previewDeposit++#++(uint256 assets) → uint256++` [.item-kind]#public#
- See {IERC4626-previewDeposit}.
- [.contract-item]
- [[ERC4626-previewMint-uint256-]]
- ==== `[.contract-item-name]#++previewMint++#++(uint256 shares) → uint256++` [.item-kind]#public#
- See {IERC4626-previewMint}.
- [.contract-item]
- [[ERC4626-previewWithdraw-uint256-]]
- ==== `[.contract-item-name]#++previewWithdraw++#++(uint256 assets) → uint256++` [.item-kind]#public#
- See {IERC4626-previewWithdraw}.
- [.contract-item]
- [[ERC4626-previewRedeem-uint256-]]
- ==== `[.contract-item-name]#++previewRedeem++#++(uint256 shares) → uint256++` [.item-kind]#public#
- See {IERC4626-previewRedeem}.
- [.contract-item]
- [[ERC4626-deposit-uint256-address-]]
- ==== `[.contract-item-name]#++deposit++#++(uint256 assets, address receiver) → uint256++` [.item-kind]#public#
- See {IERC4626-deposit}.
- [.contract-item]
- [[ERC4626-mint-uint256-address-]]
- ==== `[.contract-item-name]#++mint++#++(uint256 shares, address receiver) → uint256++` [.item-kind]#public#
- See {IERC4626-mint}.
- [.contract-item]
- [[ERC4626-withdraw-uint256-address-address-]]
- ==== `[.contract-item-name]#++withdraw++#++(uint256 assets, address receiver, address owner) → uint256++` [.item-kind]#public#
- See {IERC4626-withdraw}.
- [.contract-item]
- [[ERC4626-redeem-uint256-address-address-]]
- ==== `[.contract-item-name]#++redeem++#++(uint256 shares, address receiver, address owner) → uint256++` [.item-kind]#public#
- See {IERC4626-redeem}.
- [.contract-item]
- [[ERC4626-_convertToShares-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++_convertToShares++#++(uint256 assets, enum Math.Rounding rounding) → uint256++` [.item-kind]#internal#
- Internal conversion function (from assets to shares) with support for rounding direction.
- [.contract-item]
- [[ERC4626-_convertToAssets-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++_convertToAssets++#++(uint256 shares, enum Math.Rounding rounding) → uint256++` [.item-kind]#internal#
- Internal conversion function (from shares to assets) with support for rounding direction.
- [.contract-item]
- [[ERC4626-_deposit-address-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++_deposit++#++(address caller, address receiver, uint256 assets, uint256 shares)++` [.item-kind]#internal#
- Deposit/mint common workflow.
- [.contract-item]
- [[ERC4626-_withdraw-address-address-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++_withdraw++#++(address caller, address receiver, address owner, uint256 assets, uint256 shares)++` [.item-kind]#internal#
- Withdraw/redeem common workflow.
- [.contract-item]
- [[ERC4626-_decimalsOffset--]]
- ==== `[.contract-item-name]#++_decimalsOffset++#++() → uint8++` [.item-kind]#internal#
- [.contract-item]
- [[ERC4626-ERC4626ExceededMaxDeposit-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC4626ExceededMaxDeposit++#++(address receiver, uint256 assets, uint256 max)++` [.item-kind]#error#
- Attempted to deposit more assets than the max amount for `receiver`.
- [.contract-item]
- [[ERC4626-ERC4626ExceededMaxMint-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC4626ExceededMaxMint++#++(address receiver, uint256 shares, uint256 max)++` [.item-kind]#error#
- Attempted to mint more shares than the max amount for `receiver`.
- [.contract-item]
- [[ERC4626-ERC4626ExceededMaxWithdraw-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC4626ExceededMaxWithdraw++#++(address owner, uint256 assets, uint256 max)++` [.item-kind]#error#
- Attempted to withdraw more assets than the max amount for `receiver`.
- [.contract-item]
- [[ERC4626-ERC4626ExceededMaxRedeem-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++ERC4626ExceededMaxRedeem++#++(address owner, uint256 shares, uint256 max)++` [.item-kind]#error#
- Attempted to redeem more shares than the max amount for `receiver`.
- == Utilities
- :SafeERC20FailedOperation: pass:normal[xref:#SafeERC20-SafeERC20FailedOperation-address-[`++SafeERC20FailedOperation++`]]
- :SafeERC20FailedDecreaseAllowance: pass:normal[xref:#SafeERC20-SafeERC20FailedDecreaseAllowance-address-uint256-uint256-[`++SafeERC20FailedDecreaseAllowance++`]]
- :safeTransfer: pass:normal[xref:#SafeERC20-safeTransfer-contract-IERC20-address-uint256-[`++safeTransfer++`]]
- :safeTransferFrom: pass:normal[xref:#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-[`++safeTransferFrom++`]]
- :safeIncreaseAllowance: pass:normal[xref:#SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-[`++safeIncreaseAllowance++`]]
- :safeDecreaseAllowance: pass:normal[xref:#SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-[`++safeDecreaseAllowance++`]]
- :forceApprove: pass:normal[xref:#SafeERC20-forceApprove-contract-IERC20-address-uint256-[`++forceApprove++`]]
- :transferAndCallRelaxed: pass:normal[xref:#SafeERC20-transferAndCallRelaxed-contract-IERC1363-address-uint256-bytes-[`++transferAndCallRelaxed++`]]
- :transferFromAndCallRelaxed: pass:normal[xref:#SafeERC20-transferFromAndCallRelaxed-contract-IERC1363-address-address-uint256-bytes-[`++transferFromAndCallRelaxed++`]]
- :approveAndCallRelaxed: pass:normal[xref:#SafeERC20-approveAndCallRelaxed-contract-IERC1363-address-uint256-bytes-[`++approveAndCallRelaxed++`]]
- [.contract]
- [[SafeERC20]]
- === `++SafeERC20++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/utils/SafeERC20.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
- ```
- Wrappers around ERC-20 operations that throw on failure (when the token
- contract returns false). Tokens that return no value (and instead revert or
- throw on failure) are also supported, non-reverting calls are assumed to be
- successful.
- To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
- which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
- [.contract-index]
- .Functions
- --
- * {xref-SafeERC20-safeTransfer-contract-IERC20-address-uint256-}[`++safeTransfer(token, to, value)++`]
- * {xref-SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-}[`++safeTransferFrom(token, from, to, value)++`]
- * {xref-SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-}[`++safeIncreaseAllowance(token, spender, value)++`]
- * {xref-SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-}[`++safeDecreaseAllowance(token, spender, requestedDecrease)++`]
- * {xref-SafeERC20-forceApprove-contract-IERC20-address-uint256-}[`++forceApprove(token, spender, value)++`]
- * {xref-SafeERC20-transferAndCallRelaxed-contract-IERC1363-address-uint256-bytes-}[`++transferAndCallRelaxed(token, to, value, data)++`]
- * {xref-SafeERC20-transferFromAndCallRelaxed-contract-IERC1363-address-address-uint256-bytes-}[`++transferFromAndCallRelaxed(token, from, to, value, data)++`]
- * {xref-SafeERC20-approveAndCallRelaxed-contract-IERC1363-address-uint256-bytes-}[`++approveAndCallRelaxed(token, to, value, data)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-SafeERC20-SafeERC20FailedOperation-address-}[`++SafeERC20FailedOperation(token)++`]
- * {xref-SafeERC20-SafeERC20FailedDecreaseAllowance-address-uint256-uint256-}[`++SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease)++`]
- --
- [.contract-item]
- [[SafeERC20-safeTransfer-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeTransfer++#++(contract IERC20 token, address to, uint256 value)++` [.item-kind]#internal#
- Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
- non-reverting calls are assumed to be successful.
- [.contract-item]
- [[SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-]]
- ==== `[.contract-item-name]#++safeTransferFrom++#++(contract IERC20 token, address from, address to, uint256 value)++` [.item-kind]#internal#
- Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
- calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
- [.contract-item]
- [[SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeIncreaseAllowance++#++(contract IERC20 token, address spender, uint256 value)++` [.item-kind]#internal#
- Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
- non-reverting calls are assumed to be successful.
- IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
- smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
- this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
- that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
- [.contract-item]
- [[SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeDecreaseAllowance++#++(contract IERC20 token, address spender, uint256 requestedDecrease)++` [.item-kind]#internal#
- Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
- value, non-reverting calls are assumed to be successful.
- IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
- smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
- this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
- that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
- [.contract-item]
- [[SafeERC20-forceApprove-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++forceApprove++#++(contract IERC20 token, address spender, uint256 value)++` [.item-kind]#internal#
- Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
- non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
- to be set to zero before setting it to a non-zero value, such as USDT.
- NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
- only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
- set here.
- [.contract-item]
- [[SafeERC20-transferAndCallRelaxed-contract-IERC1363-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++transferAndCallRelaxed++#++(contract IERC1363 token, address to, uint256 value, bytes data)++` [.item-kind]#internal#
- Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
- code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
- targeting contracts.
- Reverts if the returned value is other than `true`.
- [.contract-item]
- [[SafeERC20-transferFromAndCallRelaxed-contract-IERC1363-address-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++transferFromAndCallRelaxed++#++(contract IERC1363 token, address from, address to, uint256 value, bytes data)++` [.item-kind]#internal#
- Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
- has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
- targeting contracts.
- Reverts if the returned value is other than `true`.
- [.contract-item]
- [[SafeERC20-approveAndCallRelaxed-contract-IERC1363-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++approveAndCallRelaxed++#++(contract IERC1363 token, address to, uint256 value, bytes data)++` [.item-kind]#internal#
- Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
- code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
- targeting contracts.
- NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
- Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
- once without retrying, and relies on the returned value to be true.
- Reverts if the returned value is other than `true`.
- [.contract-item]
- [[SafeERC20-SafeERC20FailedOperation-address-]]
- ==== `[.contract-item-name]#++SafeERC20FailedOperation++#++(address token)++` [.item-kind]#error#
- An operation with an ERC-20 token failed.
- [.contract-item]
- [[SafeERC20-SafeERC20FailedDecreaseAllowance-address-uint256-uint256-]]
- ==== `[.contract-item-name]#++SafeERC20FailedDecreaseAllowance++#++(address spender, uint256 currentAllowance, uint256 requestedDecrease)++` [.item-kind]#error#
- Indicates a failed `decreaseAllowance` request.
- :ERC1363InvalidReceiver: pass:normal[xref:#ERC1363Utils-ERC1363InvalidReceiver-address-[`++ERC1363InvalidReceiver++`]]
- :ERC1363InvalidSpender: pass:normal[xref:#ERC1363Utils-ERC1363InvalidSpender-address-[`++ERC1363InvalidSpender++`]]
- :checkOnERC1363TransferReceived: pass:normal[xref:#ERC1363Utils-checkOnERC1363TransferReceived-address-address-address-uint256-bytes-[`++checkOnERC1363TransferReceived++`]]
- :checkOnERC1363ApprovalReceived: pass:normal[xref:#ERC1363Utils-checkOnERC1363ApprovalReceived-address-address-uint256-bytes-[`++checkOnERC1363ApprovalReceived++`]]
- [.contract]
- [[ERC1363Utils]]
- === `++ERC1363Utils++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.2.0/contracts/token/ERC20/utils/ERC1363Utils.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/utils/ERC1363Utils.sol";
- ```
- Library that provides common ERC-1363 utility functions.
- See https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
- [.contract-index]
- .Functions
- --
- * {xref-ERC1363Utils-checkOnERC1363TransferReceived-address-address-address-uint256-bytes-}[`++checkOnERC1363TransferReceived(operator, from, to, value, data)++`]
- * {xref-ERC1363Utils-checkOnERC1363ApprovalReceived-address-address-uint256-bytes-}[`++checkOnERC1363ApprovalReceived(operator, spender, value, data)++`]
- --
- [.contract-index]
- .Errors
- --
- * {xref-ERC1363Utils-ERC1363InvalidReceiver-address-}[`++ERC1363InvalidReceiver(receiver)++`]
- * {xref-ERC1363Utils-ERC1363InvalidSpender-address-}[`++ERC1363InvalidSpender(spender)++`]
- --
- [.contract-item]
- [[ERC1363Utils-checkOnERC1363TransferReceived-address-address-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++checkOnERC1363TransferReceived++#++(address operator, address from, address to, uint256 value, bytes data)++` [.item-kind]#internal#
- Performs a call to {IERC1363Receiver-onTransferReceived} on a target address.
- Requirements:
- - The target has code (i.e. is a contract).
- - The target `to` must implement the {IERC1363Receiver} interface.
- - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
- [.contract-item]
- [[ERC1363Utils-checkOnERC1363ApprovalReceived-address-address-uint256-bytes-]]
- ==== `[.contract-item-name]#++checkOnERC1363ApprovalReceived++#++(address operator, address spender, uint256 value, bytes data)++` [.item-kind]#internal#
- Performs a call to {IERC1363Spender-onApprovalReceived} on a target address.
- Requirements:
- - The target has code (i.e. is a contract).
- - The target `spender` must implement the {IERC1363Spender} interface.
- - The target must return the {IERC1363Spender-onApprovalReceived} selector to accept the approval.
- [.contract-item]
- [[ERC1363Utils-ERC1363InvalidReceiver-address-]]
- ==== `[.contract-item-name]#++ERC1363InvalidReceiver++#++(address receiver)++` [.item-kind]#error#
- Indicates a failure with the token `receiver`. Used in transfers.
- [.contract-item]
- [[ERC1363Utils-ERC1363InvalidSpender-address-]]
- ==== `[.contract-item-name]#++ERC1363InvalidSpender++#++(address spender)++` [.item-kind]#error#
- Indicates a failure with the token `spender`. Used in approvals.
|