1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007 |
- :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`]]
- :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`]]
- :ERC20Snapshot: pass:normal[xref:token/ERC20.adoc#ERC20Snapshot[`ERC20Snapshot`]]
- :ERC20Permit: pass:normal[xref:token/ERC20.adoc#ERC20Permit[`ERC20Permit`]]
- :ERC20FlashMint: pass:normal[xref:token/ERC20.adoc#ERC20FlashMint[`ERC20FlashMint`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :ERC20VotesComp: pass:normal[xref:token/ERC20.adoc#ERC20VotesComp[`ERC20VotesComp`]]
- :ERC20Wrapper: pass:normal[xref:token/ERC20.adoc#ERC20Wrapper[`ERC20Wrapper`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :ERC4626: pass:normal[xref:token/ERC20.adoc#ERC4626[`ERC4626`]]
- :SafeERC20: pass:normal[xref:token/ERC20.adoc#SafeERC20[`SafeERC20`]]
- :TokenTimelock: pass:normal[xref:token/ERC20.adoc#TokenTimelock[`TokenTimelock`]]
- :ERC20Permit: pass:normal[xref:token/ERC20.adoc#ERC20Permit[`ERC20Permit`]]
- :ERC20PresetMinterPauser: pass:normal[xref:token/ERC20.adoc#ERC20PresetMinterPauser[`ERC20PresetMinterPauser`]]
- :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`]]
- :ERC20PresetMinterPauser: pass:normal[xref:token/ERC20.adoc#ERC20PresetMinterPauser[`ERC20PresetMinterPauser`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :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`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :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-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20Capped-_mint-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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :ERC20-_mint: pass:normal[xref:token/ERC20.adoc#ERC20-_mint-address-uint256-[`ERC20._mint`]]
- :Pausable-_pause: pass:normal[xref:security.adoc#Pausable-_pause--[`Pausable._pause`]]
- :Pausable-_unpause: pass:normal[xref:security.adoc#Pausable-_unpause--[`Pausable._unpause`]]
- :AccessControl: pass:normal[xref:access.adoc#AccessControl[`AccessControl`]]
- :Ownable: pass:normal[xref:access.adoc#Ownable[`Ownable`]]
- :xref-ERC20Pausable-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20Pausable-_beforeTokenTransfer-address-address-uint256-
- :xref-Pausable-paused--: xref:security.adoc#Pausable-paused--
- :xref-Pausable-_requireNotPaused--: xref:security.adoc#Pausable-_requireNotPaused--
- :xref-Pausable-_requirePaused--: xref:security.adoc#Pausable-_requirePaused--
- :xref-Pausable-_pause--: xref:security.adoc#Pausable-_pause--
- :xref-Pausable-_unpause--: xref:security.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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-address-address-uint256-
- :xref-Pausable-Paused-address-: xref:security.adoc#Pausable-Paused-address-
- :xref-Pausable-Unpaused-address-: xref:security.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-
- :ERC20-_beforeTokenTransfer: pass:normal[xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-[`ERC20._beforeTokenTransfer`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :xref-ERC20Snapshot-_snapshot--: xref:token/ERC20.adoc#ERC20Snapshot-_snapshot--
- :xref-ERC20Snapshot-_getCurrentSnapshotId--: xref:token/ERC20.adoc#ERC20Snapshot-_getCurrentSnapshotId--
- :xref-ERC20Snapshot-balanceOfAt-address-uint256-: xref:token/ERC20.adoc#ERC20Snapshot-balanceOfAt-address-uint256-
- :xref-ERC20Snapshot-totalSupplyAt-uint256-: xref:token/ERC20.adoc#ERC20Snapshot-totalSupplyAt-uint256-
- :xref-ERC20Snapshot-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20Snapshot-_beforeTokenTransfer-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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-address-address-uint256-
- :xref-ERC20Snapshot-Snapshot-uint256-: xref:token/ERC20.adoc#ERC20Snapshot-Snapshot-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-
- :AccessControl: pass:normal[xref:access.adoc#AccessControl[`AccessControl`]]
- :ERC20VotesComp: pass:normal[xref:token/ERC20.adoc#ERC20VotesComp[`ERC20VotesComp`]]
- :xref-ERC20Votes-checkpoints-address-uint32-: xref:token/ERC20.adoc#ERC20Votes-checkpoints-address-uint32-
- :xref-ERC20Votes-numCheckpoints-address-: xref:token/ERC20.adoc#ERC20Votes-numCheckpoints-address-
- :xref-ERC20Votes-delegates-address-: xref:token/ERC20.adoc#ERC20Votes-delegates-address-
- :xref-ERC20Votes-getVotes-address-: xref:token/ERC20.adoc#ERC20Votes-getVotes-address-
- :xref-ERC20Votes-getPastVotes-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-getPastVotes-address-uint256-
- :xref-ERC20Votes-getPastTotalSupply-uint256-: xref:token/ERC20.adoc#ERC20Votes-getPastTotalSupply-uint256-
- :xref-ERC20Votes-delegate-address-: xref:token/ERC20.adoc#ERC20Votes-delegate-address-
- :xref-ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-: xref:token/ERC20.adoc#ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-
- :xref-ERC20Votes-_maxSupply--: xref:token/ERC20.adoc#ERC20Votes-_maxSupply--
- :xref-ERC20Votes-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_mint-address-uint256-
- :xref-ERC20Votes-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_burn-address-uint256-
- :xref-ERC20Votes-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_afterTokenTransfer-address-address-uint256-
- :xref-ERC20Votes-_delegate-address-address-: xref:token/ERC20.adoc#ERC20Votes-_delegate-address-address-
- :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-ERC20Permit-_useNonce-address-: xref:token/ERC20.adoc#ERC20Permit-_useNonce-address-
- :xref-EIP712-_domainSeparatorV4--: xref:utils.adoc#EIP712-_domainSeparatorV4--
- :xref-EIP712-_hashTypedDataV4-bytes32-: xref:utils.adoc#EIP712-_hashTypedDataV4-bytes32-
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-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-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-
- :IVotes-DelegateVotesChanged: pass:normal[xref:governance.adoc#IVotes-DelegateVotesChanged-address-uint256-uint256-[`IVotes.DelegateVotesChanged`]]
- :IVotes-DelegateChanged: pass:normal[xref:governance.adoc#IVotes-DelegateChanged-address-address-address-[`IVotes.DelegateChanged`]]
- :IVotes-DelegateVotesChanged: pass:normal[xref:governance.adoc#IVotes-DelegateVotesChanged-address-uint256-uint256-[`IVotes.DelegateVotesChanged`]]
- :ERC20Votes: pass:normal[xref:token/ERC20.adoc#ERC20Votes[`ERC20Votes`]]
- :xref-ERC20VotesComp-getCurrentVotes-address-: xref:token/ERC20.adoc#ERC20VotesComp-getCurrentVotes-address-
- :xref-ERC20VotesComp-getPriorVotes-address-uint256-: xref:token/ERC20.adoc#ERC20VotesComp-getPriorVotes-address-uint256-
- :xref-ERC20VotesComp-_maxSupply--: xref:token/ERC20.adoc#ERC20VotesComp-_maxSupply--
- :xref-ERC20Votes-checkpoints-address-uint32-: xref:token/ERC20.adoc#ERC20Votes-checkpoints-address-uint32-
- :xref-ERC20Votes-numCheckpoints-address-: xref:token/ERC20.adoc#ERC20Votes-numCheckpoints-address-
- :xref-ERC20Votes-delegates-address-: xref:token/ERC20.adoc#ERC20Votes-delegates-address-
- :xref-ERC20Votes-getVotes-address-: xref:token/ERC20.adoc#ERC20Votes-getVotes-address-
- :xref-ERC20Votes-getPastVotes-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-getPastVotes-address-uint256-
- :xref-ERC20Votes-getPastTotalSupply-uint256-: xref:token/ERC20.adoc#ERC20Votes-getPastTotalSupply-uint256-
- :xref-ERC20Votes-delegate-address-: xref:token/ERC20.adoc#ERC20Votes-delegate-address-
- :xref-ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-: xref:token/ERC20.adoc#ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-
- :xref-ERC20Votes-_mint-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_mint-address-uint256-
- :xref-ERC20Votes-_burn-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_burn-address-uint256-
- :xref-ERC20Votes-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20Votes-_afterTokenTransfer-address-address-uint256-
- :xref-ERC20Votes-_delegate-address-address-: xref:token/ERC20.adoc#ERC20Votes-_delegate-address-address-
- :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-ERC20Permit-_useNonce-address-: xref:token/ERC20.adoc#ERC20Permit-_useNonce-address-
- :xref-EIP712-_domainSeparatorV4--: xref:utils.adoc#EIP712-_domainSeparatorV4--
- :xref-EIP712-_hashTypedDataV4-bytes32-: xref:utils.adoc#EIP712-_hashTypedDataV4-bytes32-
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-address-uint256-
- :xref-ERC20-_transfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :xref-ERC20-_approve-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :xref-ERC20-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-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-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-
- :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-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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :ERC20-decimals: pass:normal[xref:token/ERC20.adoc#ERC20-decimals--[`ERC20.decimals`]]
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :IERC3156FlashBorrower: pass:normal[xref:interfaces.adoc#IERC3156FlashBorrower[`IERC3156FlashBorrower`]]
- :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-_initialConvertToShares-uint256-enum-Math-Rounding-: xref:token/ERC20.adoc#ERC4626-_initialConvertToShares-uint256-enum-Math-Rounding-
- :xref-ERC4626-_convertToAssets-uint256-enum-Math-Rounding-: xref:token/ERC20.adoc#ERC4626-_convertToAssets-uint256-enum-Math-Rounding-
- :xref-ERC4626-_initialConvertToAssets-uint256-enum-Math-Rounding-: xref:token/ERC20.adoc#ERC4626-_initialConvertToAssets-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-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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :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`]]
- :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-ERC20Permit-_useNonce-address-: xref:token/ERC20.adoc#ERC20Permit-_useNonce-address-
- :xref-EIP712-_domainSeparatorV4--: xref:utils.adoc#EIP712-_domainSeparatorV4--
- :xref-EIP712-_hashTypedDataV4-bytes32-: xref:utils.adoc#EIP712-_hashTypedDataV4-bytes32-
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :EIP712: pass:normal[xref:utils.adoc#EIP712[`EIP712`]]
- :IERC20Permit-permit: pass:normal[xref:token/ERC20.adoc#IERC20Permit-permit-address-address-uint256-uint256-uint8-bytes32-bytes32-[`IERC20Permit.permit`]]
- :IERC20Permit-nonces: pass:normal[xref:token/ERC20.adoc#IERC20Permit-nonces-address-[`IERC20Permit.nonces`]]
- :IERC20Permit-DOMAIN_SEPARATOR: pass:normal[xref:token/ERC20.adoc#IERC20Permit-DOMAIN_SEPARATOR--[`IERC20Permit.DOMAIN_SEPARATOR`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :AccessControl: pass:normal[xref:access.adoc#AccessControl[`AccessControl`]]
- :xref-ERC20PresetMinterPauser-constructor-string-string-: xref:token/ERC20.adoc#ERC20PresetMinterPauser-constructor-string-string-
- :xref-ERC20PresetMinterPauser-mint-address-uint256-: xref:token/ERC20.adoc#ERC20PresetMinterPauser-mint-address-uint256-
- :xref-ERC20PresetMinterPauser-pause--: xref:token/ERC20.adoc#ERC20PresetMinterPauser-pause--
- :xref-ERC20PresetMinterPauser-unpause--: xref:token/ERC20.adoc#ERC20PresetMinterPauser-unpause--
- :xref-ERC20PresetMinterPauser-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20PresetMinterPauser-_beforeTokenTransfer-address-address-uint256-
- :xref-Pausable-paused--: xref:security.adoc#Pausable-paused--
- :xref-Pausable-_requireNotPaused--: xref:security.adoc#Pausable-_requireNotPaused--
- :xref-Pausable-_requirePaused--: xref:security.adoc#Pausable-_requirePaused--
- :xref-Pausable-_pause--: xref:security.adoc#Pausable-_pause--
- :xref-Pausable-_unpause--: xref:security.adoc#Pausable-_unpause--
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-address-address-uint256-
- :xref-AccessControlEnumerable-supportsInterface-bytes4-: xref:access.adoc#AccessControlEnumerable-supportsInterface-bytes4-
- :xref-AccessControlEnumerable-getRoleMember-bytes32-uint256-: xref:access.adoc#AccessControlEnumerable-getRoleMember-bytes32-uint256-
- :xref-AccessControlEnumerable-getRoleMemberCount-bytes32-: xref:access.adoc#AccessControlEnumerable-getRoleMemberCount-bytes32-
- :xref-AccessControlEnumerable-_grantRole-bytes32-address-: xref:access.adoc#AccessControlEnumerable-_grantRole-bytes32-address-
- :xref-AccessControlEnumerable-_revokeRole-bytes32-address-: xref:access.adoc#AccessControlEnumerable-_revokeRole-bytes32-address-
- :xref-AccessControl-hasRole-bytes32-address-: xref:access.adoc#AccessControl-hasRole-bytes32-address-
- :xref-AccessControl-_checkRole-bytes32-: xref:access.adoc#AccessControl-_checkRole-bytes32-
- :xref-AccessControl-_checkRole-bytes32-address-: xref:access.adoc#AccessControl-_checkRole-bytes32-address-
- :xref-AccessControl-getRoleAdmin-bytes32-: xref:access.adoc#AccessControl-getRoleAdmin-bytes32-
- :xref-AccessControl-grantRole-bytes32-address-: xref:access.adoc#AccessControl-grantRole-bytes32-address-
- :xref-AccessControl-revokeRole-bytes32-address-: xref:access.adoc#AccessControl-revokeRole-bytes32-address-
- :xref-AccessControl-renounceRole-bytes32-address-: xref:access.adoc#AccessControl-renounceRole-bytes32-address-
- :xref-AccessControl-_setupRole-bytes32-address-: xref:access.adoc#AccessControl-_setupRole-bytes32-address-
- :xref-AccessControl-_setRoleAdmin-bytes32-bytes32-: xref:access.adoc#AccessControl-_setRoleAdmin-bytes32-bytes32-
- :xref-Pausable-Paused-address-: xref:security.adoc#Pausable-Paused-address-
- :xref-Pausable-Unpaused-address-: xref:security.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-IAccessControl-RoleAdminChanged-bytes32-bytes32-bytes32-: xref:access.adoc#IAccessControl-RoleAdminChanged-bytes32-bytes32-bytes32-
- :xref-IAccessControl-RoleGranted-bytes32-address-address-: xref:access.adoc#IAccessControl-RoleGranted-bytes32-address-address-
- :xref-IAccessControl-RoleRevoked-bytes32-address-address-: xref:access.adoc#IAccessControl-RoleRevoked-bytes32-address-address-
- :ERC20-constructor: pass:normal[xref:token/ERC20.adoc#ERC20-constructor-string-string-[`ERC20.constructor`]]
- :ERC20-_mint: pass:normal[xref:token/ERC20.adoc#ERC20-_mint-address-uint256-[`ERC20._mint`]]
- :ERC20Pausable: pass:normal[xref:token/ERC20.adoc#ERC20Pausable[`ERC20Pausable`]]
- :Pausable-_pause: pass:normal[xref:security.adoc#Pausable-_pause--[`Pausable._pause`]]
- :ERC20Pausable: pass:normal[xref:token/ERC20.adoc#ERC20Pausable[`ERC20Pausable`]]
- :Pausable-_unpause: pass:normal[xref:security.adoc#Pausable-_unpause--[`Pausable._unpause`]]
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :ERC20Burnable: pass:normal[xref:token/ERC20.adoc#ERC20Burnable[`ERC20Burnable`]]
- :xref-ERC20PresetFixedSupply-constructor-string-string-uint256-address-: xref:token/ERC20.adoc#ERC20PresetFixedSupply-constructor-string-string-uint256-address-
- :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-increaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :xref-ERC20-decreaseAllowance-address-uint256-: xref:token/ERC20.adoc#ERC20-decreaseAllowance-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-_spendAllowance-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_spendAllowance-address-address-uint256-
- :xref-ERC20-_beforeTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-
- :xref-ERC20-_afterTokenTransfer-address-address-uint256-: xref:token/ERC20.adoc#ERC20-_afterTokenTransfer-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-
- :ERC20-constructor: pass:normal[xref:token/ERC20.adoc#ERC20-constructor-string-string-[`ERC20.constructor`]]
- :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-safeApprove-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#SafeERC20-safeApprove-contract-IERC20-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-safePermit-contract-IERC20Permit-address-address-uint256-uint256-uint8-bytes32-bytes32-: xref:token/ERC20.adoc#SafeERC20-safePermit-contract-IERC20Permit-address-address-uint256-uint256-uint8-bytes32-bytes32-
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :xref-TokenTimelock-constructor-contract-IERC20-address-uint256-: xref:token/ERC20.adoc#TokenTimelock-constructor-contract-IERC20-address-uint256-
- :xref-TokenTimelock-token--: xref:token/ERC20.adoc#TokenTimelock-token--
- :xref-TokenTimelock-beneficiary--: xref:token/ERC20.adoc#TokenTimelock-beneficiary--
- :xref-TokenTimelock-releaseTime--: xref:token/ERC20.adoc#TokenTimelock-releaseTime--
- :xref-TokenTimelock-release--: xref:token/ERC20.adoc#TokenTimelock-release--
- = 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[ERC20 Token Standard].
- TIP: For an overview of ERC20 tokens and a walk through on how to create a token contract read our xref:ROOT:erc20.adoc[ERC20 guide].
- There are a few core contracts that implement the behavior specified in the EIP:
- * {IERC20}: the interface all ERC20 implementations should conform to.
- * {IERC20Metadata}: the extended ERC20 interface including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> functions.
- * {ERC20}: the implementation of the ERC20 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:
- * {ERC20Burnable}: destruction of own tokens.
- * {ERC20Capped}: enforcement of a cap to the total supply when minting tokens.
- * {ERC20Pausable}: ability to pause token transfers.
- * {ERC20Snapshot}: efficient storage of past token balances to be later queried at any point in time.
- * {ERC20Permit}: gasless approval of tokens (standardized as ERC2612).
- * {ERC20FlashMint}: token level support for flash loans through the minting and burning of ephemeral tokens (standardized as ERC3156).
- * {ERC20Votes}: support for voting and vote delegation.
- * {ERC20VotesComp}: support for voting and vote delegation (compatible with Compound's token, with uint96 restrictions).
- * {ERC20Wrapper}: wrapper to create an ERC20 backed by another ERC20, with deposit and withdraw methods. Useful in conjunction with {ERC20Votes}.
- * {ERC4626}: tokenized vault that manages shares (represented as ERC20) that are backed by assets (another ERC20).
- Finally, there are some utilities to interact with ERC20 contracts in various ways.
- * {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values.
- * {TokenTimelock}: hold tokens for a beneficiary until a specified time.
- The following related EIPs are in draft status.
- - {ERC20Permit}
- NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <<ERC20-_mint-address-uint256-,`_mint`>>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts.
- == 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/v4.8.3/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 ERC20 standard as defined in the EIP.
- [.contract-index]
- .Functions
- --
- * {xref-IERC20-totalSupply--}[`++totalSupply()++`]
- * {xref-IERC20-balanceOf-address-}[`++balanceOf(account)++`]
- * {xref-IERC20-transfer-address-uint256-}[`++transfer(to, amount)++`]
- * {xref-IERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-IERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-IERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- --
- [.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 amount of tokens in existence.
- [.contract-item]
- [[IERC20-balanceOf-address-]]
- ==== `[.contract-item-name]#++balanceOf++#++(address account) → uint256++` [.item-kind]#external#
- Returns the amount of tokens owned by `account`.
- [.contract-item]
- [[IERC20-transfer-address-uint256-]]
- ==== `[.contract-item-name]#++transfer++#++(address to, uint256 amount) → bool++` [.item-kind]#external#
- Moves `amount` 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 amount) → bool++` [.item-kind]#external#
- Sets `amount` as the allowance of `spender` over the caller's tokens.
- Returns a boolean value indicating whether the operation succeeded.
- IMPORTANT: Beware that changing an allowance with this method brings the risk
- that someone may use both the old and the new allowance by unfortunate
- transaction ordering. One possible solution to mitigate this race
- condition is to first reduce the spender's allowance to 0 and set the
- desired value afterwards:
- https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
- Emits an {Approval} event.
- [.contract-item]
- [[IERC20-transferFrom-address-address-uint256-]]
- ==== `[.contract-item-name]#++transferFrom++#++(address from, address to, uint256 amount) → bool++` [.item-kind]#external#
- Moves `amount` tokens from `from` to `to` using the
- allowance mechanism. `amount` is then deducted from the caller's
- allowance.
- Returns a boolean value indicating whether the operation succeeded.
- Emits a {Transfer} event.
- [.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/v4.8.3/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 ERC20 standard.
- _Available since v4.1._
- [.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, amount)++`]
- * {xref-IERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-IERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-IERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- --
- [.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.
- :_balances: pass:normal[xref:#ERC20-_balances-mapping-address----uint256-[`++_balances++`]]
- :_allowances: pass:normal[xref:#ERC20-_allowances-mapping-address----mapping-address----uint256--[`++_allowances++`]]
- :_totalSupply: pass:normal[xref:#ERC20-_totalSupply-uint256[`++_totalSupply++`]]
- :_name: pass:normal[xref:#ERC20-_name-string[`++_name++`]]
- :_symbol: pass:normal[xref:#ERC20-_symbol-string[`++_symbol++`]]
- :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++`]]
- :increaseAllowance: pass:normal[xref:#ERC20-increaseAllowance-address-uint256-[`++increaseAllowance++`]]
- :decreaseAllowance: pass:normal[xref:#ERC20-decreaseAllowance-address-uint256-[`++decreaseAllowance++`]]
- :_transfer: pass:normal[xref:#ERC20-_transfer-address-address-uint256-[`++_transfer++`]]
- :_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++`]]
- :_spendAllowance: pass:normal[xref:#ERC20-_spendAllowance-address-address-uint256-[`++_spendAllowance++`]]
- :_beforeTokenTransfer: pass:normal[xref:#ERC20-_beforeTokenTransfer-address-address-uint256-[`++_beforeTokenTransfer++`]]
- :_afterTokenTransfer: pass:normal[xref:#ERC20-_afterTokenTransfer-address-address-uint256-[`++_afterTokenTransfer++`]]
- [.contract]
- [[ERC20]]
- === `++ERC20++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/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}.
- For a generic mechanism see {ERC20PresetMinterPauser}.
- TIP: For a detailed writeup see our guide
- https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
- to implement supply mechanisms].
- We have followed general OpenZeppelin Contracts guidelines: functions revert
- instead returning `false` on failure. This behavior is nonetheless
- conventional and does not conflict with the expectations of ERC20
- applications.
- Additionally, an {Approval} event is emitted on calls to {transferFrom}.
- This allows applications to reconstruct the allowance for all accounts just
- by listening to said events. Other implementations of the EIP may not emit
- these events, as it isn't required by the specification.
- Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
- functions have been added to mitigate the well-known issues around setting
- allowances. See {IERC20-approve}.
- [.contract-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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.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-item]
- [[ERC20-constructor-string-string-]]
- ==== `[.contract-item-name]#++constructor++#++(string name_, string symbol_)++` [.item-kind]#public#
- Sets the values for {name} and {symbol}.
- The default value of {decimals} is 18. To select a different value for
- {decimals} you should overload it.
- All two of these values are immutable: they can only be set once during
- construction.
- [.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 value {ERC20} uses, unless this function is
- overridden;
- NOTE: This information is only used for _display_ purposes: it in
- no way affects any of the arithmetic of the contract, including
- {IERC20-balanceOf} and {IERC20-transfer}.
- [.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 amount) → bool++` [.item-kind]#public#
- See {IERC20-transfer}.
- Requirements:
- - `to` cannot be the zero address.
- - the caller must have a balance of at least `amount`.
- [.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 amount) → bool++` [.item-kind]#public#
- See {IERC20-approve}.
- NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
- `transferFrom`. This is semantically equivalent to an infinite approval.
- Requirements:
- - `spender` cannot be the zero address.
- [.contract-item]
- [[ERC20-transferFrom-address-address-uint256-]]
- ==== `[.contract-item-name]#++transferFrom++#++(address from, address to, uint256 amount) → bool++` [.item-kind]#public#
- See {IERC20-transferFrom}.
- Emits an {Approval} event indicating the updated allowance. This is not
- required by the EIP. See the note at the beginning of {ERC20}.
- NOTE: Does not update the allowance if the current allowance
- is the maximum `uint256`.
- Requirements:
- - `from` and `to` cannot be the zero address.
- - `from` must have a balance of at least `amount`.
- - the caller must have allowance for ``from``'s tokens of at least
- `amount`.
- [.contract-item]
- [[ERC20-increaseAllowance-address-uint256-]]
- ==== `[.contract-item-name]#++increaseAllowance++#++(address spender, uint256 addedValue) → bool++` [.item-kind]#public#
- Atomically increases the allowance granted to `spender` by the caller.
- This is an alternative to {approve} that can be used as a mitigation for
- problems described in {IERC20-approve}.
- Emits an {Approval} event indicating the updated allowance.
- Requirements:
- - `spender` cannot be the zero address.
- [.contract-item]
- [[ERC20-decreaseAllowance-address-uint256-]]
- ==== `[.contract-item-name]#++decreaseAllowance++#++(address spender, uint256 subtractedValue) → bool++` [.item-kind]#public#
- Atomically decreases the allowance granted to `spender` by the caller.
- This is an alternative to {approve} that can be used as a mitigation for
- problems described in {IERC20-approve}.
- Emits an {Approval} event indicating the updated allowance.
- Requirements:
- - `spender` cannot be the zero address.
- - `spender` must have allowance for the caller of at least
- `subtractedValue`.
- [.contract-item]
- [[ERC20-_transfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_transfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- Moves `amount` of tokens from `from` to `to`.
- This internal function is equivalent to {transfer}, and can be used to
- e.g. implement automatic token fees, slashing mechanisms, etc.
- Emits a {Transfer} event.
- Requirements:
- - `from` cannot be the zero address.
- - `to` cannot be the zero address.
- - `from` must have a balance of at least `amount`.
- [.contract-item]
- [[ERC20-_mint-address-uint256-]]
- ==== `[.contract-item-name]#++_mint++#++(address account, uint256 amount)++` [.item-kind]#internal#
- Creates `amount` tokens and assigns them to `account`, increasing
- the total supply.
- Emits a {Transfer} event with `from` set to the zero address.
- Requirements:
- - `account` cannot be the zero address.
- [.contract-item]
- [[ERC20-_burn-address-uint256-]]
- ==== `[.contract-item-name]#++_burn++#++(address account, uint256 amount)++` [.item-kind]#internal#
- Destroys `amount` tokens from `account`, reducing the
- total supply.
- Emits a {Transfer} event with `to` set to the zero address.
- Requirements:
- - `account` cannot be the zero address.
- - `account` must have at least `amount` tokens.
- [.contract-item]
- [[ERC20-_approve-address-address-uint256-]]
- ==== `[.contract-item-name]#++_approve++#++(address owner, address spender, uint256 amount)++` [.item-kind]#internal#
- Sets `amount` as the allowance of `spender` over the `owner` s tokens.
- This internal function is equivalent to `approve`, and can be used to
- e.g. set automatic allowances for certain subsystems, etc.
- Emits an {Approval} event.
- Requirements:
- - `owner` cannot be the zero address.
- - `spender` cannot be the zero address.
- [.contract-item]
- [[ERC20-_spendAllowance-address-address-uint256-]]
- ==== `[.contract-item-name]#++_spendAllowance++#++(address owner, address spender, uint256 amount)++` [.item-kind]#internal#
- Updates `owner` s allowance for `spender` based on spent `amount`.
- Does not update the allowance amount in case of infinite allowance.
- Revert if not enough allowance is available.
- Might emit an {Approval} event.
- [.contract-item]
- [[ERC20-_beforeTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_beforeTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- Hook that is called before any transfer of tokens. This includes
- minting and burning.
- Calling conditions:
- - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
- will be transferred to `to`.
- - when `from` is zero, `amount` tokens will be minted for `to`.
- - when `to` is zero, `amount` of ``from``'s tokens will be burned.
- - `from` and `to` are never both zero.
- To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
- [.contract-item]
- [[ERC20-_afterTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_afterTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- Hook that is called after any transfer of tokens. This includes
- minting and burning.
- Calling conditions:
- - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
- has been transferred to `to`.
- - when `from` is zero, `amount` tokens have been minted for `to`.
- - when `to` is zero, `amount` of ``from``'s tokens have been burned.
- - `from` and `to` are never both zero.
- To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
- == Extensions
- :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/v4.8.3/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(amount)++`]
- * {xref-ERC20Burnable-burnFrom-address-uint256-}[`++burnFrom(account, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.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-item]
- [[ERC20Burnable-burn-uint256-]]
- ==== `[.contract-item-name]#++burn++#++(uint256 amount)++` [.item-kind]#public#
- Destroys `amount` tokens from the caller.
- See {ERC20-_burn}.
- [.contract-item]
- [[ERC20Burnable-burnFrom-address-uint256-]]
- ==== `[.contract-item-name]#++burnFrom++#++(address account, uint256 amount)++` [.item-kind]#public#
- Destroys `amount` 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
- `amount`.
- :_cap: pass:normal[xref:#ERC20Capped-_cap-uint256[`++_cap++`]]
- :constructor: pass:normal[xref:#ERC20Capped-constructor-uint256-[`++constructor++`]]
- :cap: pass:normal[xref:#ERC20Capped-cap--[`++cap++`]]
- :_mint: pass:normal[xref:#ERC20Capped-_mint-address-uint256-[`++_mint++`]]
- [.contract]
- [[ERC20Capped]]
- === `++ERC20Capped++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/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-_mint-address-uint256-}[`++_mint(account, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.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-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-_mint-address-uint256-]]
- ==== `[.contract-item-name]#++_mint++#++(address account, uint256 amount)++` [.item-kind]#internal#
- See {ERC20-_mint}.
- :_beforeTokenTransfer: pass:normal[xref:#ERC20Pausable-_beforeTokenTransfer-address-address-uint256-[`++_beforeTokenTransfer++`]]
- [.contract]
- [[ERC20Pausable]]
- === `++ERC20Pausable++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/extensions/ERC20Pausable.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
- ```
- ERC20 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 unpausable.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Pausable-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.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]
- .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-item]
- [[ERC20Pausable-_beforeTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_beforeTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- See {ERC20-_beforeTokenTransfer}.
- Requirements:
- - the contract must not be paused.
- :Snapshots: pass:normal[xref:#ERC20Snapshot-Snapshots[`++Snapshots++`]]
- :_accountBalanceSnapshots: pass:normal[xref:#ERC20Snapshot-_accountBalanceSnapshots-mapping-address----struct-ERC20Snapshot-Snapshots-[`++_accountBalanceSnapshots++`]]
- :_totalSupplySnapshots: pass:normal[xref:#ERC20Snapshot-_totalSupplySnapshots-struct-ERC20Snapshot-Snapshots[`++_totalSupplySnapshots++`]]
- :_currentSnapshotId: pass:normal[xref:#ERC20Snapshot-_currentSnapshotId-struct-Counters-Counter[`++_currentSnapshotId++`]]
- :Snapshot: pass:normal[xref:#ERC20Snapshot-Snapshot-uint256-[`++Snapshot++`]]
- :_snapshot: pass:normal[xref:#ERC20Snapshot-_snapshot--[`++_snapshot++`]]
- :_getCurrentSnapshotId: pass:normal[xref:#ERC20Snapshot-_getCurrentSnapshotId--[`++_getCurrentSnapshotId++`]]
- :balanceOfAt: pass:normal[xref:#ERC20Snapshot-balanceOfAt-address-uint256-[`++balanceOfAt++`]]
- :totalSupplyAt: pass:normal[xref:#ERC20Snapshot-totalSupplyAt-uint256-[`++totalSupplyAt++`]]
- :_beforeTokenTransfer: pass:normal[xref:#ERC20Snapshot-_beforeTokenTransfer-address-address-uint256-[`++_beforeTokenTransfer++`]]
- :_valueAt: pass:normal[xref:#ERC20Snapshot-_valueAt-uint256-struct-ERC20Snapshot-Snapshots-[`++_valueAt++`]]
- :_updateAccountSnapshot: pass:normal[xref:#ERC20Snapshot-_updateAccountSnapshot-address-[`++_updateAccountSnapshot++`]]
- :_updateTotalSupplySnapshot: pass:normal[xref:#ERC20Snapshot-_updateTotalSupplySnapshot--[`++_updateTotalSupplySnapshot++`]]
- :_updateSnapshot: pass:normal[xref:#ERC20Snapshot-_updateSnapshot-struct-ERC20Snapshot-Snapshots-uint256-[`++_updateSnapshot++`]]
- :_lastSnapshotId: pass:normal[xref:#ERC20Snapshot-_lastSnapshotId-uint256---[`++_lastSnapshotId++`]]
- [.contract]
- [[ERC20Snapshot]]
- === `++ERC20Snapshot++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/extensions/ERC20Snapshot.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
- ```
- This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
- total supply at the time are recorded for later access.
- This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
- In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
- accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
- used to create an efficient ERC20 forking mechanism.
- Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
- snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
- id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
- and the account address.
- NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
- return `block.number` will trigger the creation of snapshot at the beginning of each new block. When overriding this
- function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
- Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
- alternative consider {ERC20Votes}.
- ==== Gas Costs
- Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
- n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
- smaller since identical balances in subsequent snapshots are stored as a single entry.
- There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
- only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
- transfers will have normal cost until the next snapshot, and so on.
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Snapshot-_snapshot--}[`++_snapshot()++`]
- * {xref-ERC20Snapshot-_getCurrentSnapshotId--}[`++_getCurrentSnapshotId()++`]
- * {xref-ERC20Snapshot-balanceOfAt-address-uint256-}[`++balanceOfAt(account, snapshotId)++`]
- * {xref-ERC20Snapshot-totalSupplyAt-uint256-}[`++totalSupplyAt(snapshotId)++`]
- * {xref-ERC20Snapshot-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- * {xref-ERC20Snapshot-Snapshot-uint256-}[`++Snapshot(id)++`]
- [.contract-subindex-inherited]
- .ERC20
- [.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-item]
- [[ERC20Snapshot-_snapshot--]]
- ==== `[.contract-item-name]#++_snapshot++#++() → uint256++` [.item-kind]#internal#
- Creates a new snapshot and returns its snapshot id.
- Emits a {Snapshot} event that contains the same id.
- {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
- set of accounts, for example using {AccessControl}, or it may be open to the public.
- [WARNING]
- ====
- While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
- you must consider that it can potentially be used by attackers in two ways.
- First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
- logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
- specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
- section above.
- We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
- ====
- [.contract-item]
- [[ERC20Snapshot-_getCurrentSnapshotId--]]
- ==== `[.contract-item-name]#++_getCurrentSnapshotId++#++() → uint256++` [.item-kind]#internal#
- Get the current snapshotId
- [.contract-item]
- [[ERC20Snapshot-balanceOfAt-address-uint256-]]
- ==== `[.contract-item-name]#++balanceOfAt++#++(address account, uint256 snapshotId) → uint256++` [.item-kind]#public#
- Retrieves the balance of `account` at the time `snapshotId` was created.
- [.contract-item]
- [[ERC20Snapshot-totalSupplyAt-uint256-]]
- ==== `[.contract-item-name]#++totalSupplyAt++#++(uint256 snapshotId) → uint256++` [.item-kind]#public#
- Retrieves the total supply at the time `snapshotId` was created.
- [.contract-item]
- [[ERC20Snapshot-_beforeTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_beforeTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- Hook that is called before any transfer of tokens. This includes
- minting and burning.
- Calling conditions:
- - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
- will be transferred to `to`.
- - when `from` is zero, `amount` tokens will be minted for `to`.
- - when `to` is zero, `amount` of ``from``'s tokens will be burned.
- - `from` and `to` are never both zero.
- To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
- [.contract-item]
- [[ERC20Snapshot-Snapshot-uint256-]]
- ==== `[.contract-item-name]#++Snapshot++#++(uint256 id)++` [.item-kind]#event#
- Emitted by {_snapshot} when a snapshot identified by `id` is created.
- :Checkpoint: pass:normal[xref:#ERC20Votes-Checkpoint[`++Checkpoint++`]]
- :_DELEGATION_TYPEHASH: pass:normal[xref:#ERC20Votes-_DELEGATION_TYPEHASH-bytes32[`++_DELEGATION_TYPEHASH++`]]
- :_delegates: pass:normal[xref:#ERC20Votes-_delegates-mapping-address----address-[`++_delegates++`]]
- :_checkpoints: pass:normal[xref:#ERC20Votes-_checkpoints-mapping-address----struct-ERC20Votes-Checkpoint---[`++_checkpoints++`]]
- :_totalSupplyCheckpoints: pass:normal[xref:#ERC20Votes-_totalSupplyCheckpoints-struct-ERC20Votes-Checkpoint--[`++_totalSupplyCheckpoints++`]]
- :checkpoints: pass:normal[xref:#ERC20Votes-checkpoints-address-uint32-[`++checkpoints++`]]
- :numCheckpoints: pass:normal[xref:#ERC20Votes-numCheckpoints-address-[`++numCheckpoints++`]]
- :delegates: pass:normal[xref:#ERC20Votes-delegates-address-[`++delegates++`]]
- :getVotes: pass:normal[xref:#ERC20Votes-getVotes-address-[`++getVotes++`]]
- :getPastVotes: pass:normal[xref:#ERC20Votes-getPastVotes-address-uint256-[`++getPastVotes++`]]
- :getPastTotalSupply: pass:normal[xref:#ERC20Votes-getPastTotalSupply-uint256-[`++getPastTotalSupply++`]]
- :_checkpointsLookup: pass:normal[xref:#ERC20Votes-_checkpointsLookup-struct-ERC20Votes-Checkpoint---uint256-[`++_checkpointsLookup++`]]
- :delegate: pass:normal[xref:#ERC20Votes-delegate-address-[`++delegate++`]]
- :delegateBySig: pass:normal[xref:#ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-[`++delegateBySig++`]]
- :_maxSupply: pass:normal[xref:#ERC20Votes-_maxSupply--[`++_maxSupply++`]]
- :_mint: pass:normal[xref:#ERC20Votes-_mint-address-uint256-[`++_mint++`]]
- :_burn: pass:normal[xref:#ERC20Votes-_burn-address-uint256-[`++_burn++`]]
- :_afterTokenTransfer: pass:normal[xref:#ERC20Votes-_afterTokenTransfer-address-address-uint256-[`++_afterTokenTransfer++`]]
- :_delegate: pass:normal[xref:#ERC20Votes-_delegate-address-address-[`++_delegate++`]]
- :_moveVotingPower: pass:normal[xref:#ERC20Votes-_moveVotingPower-address-address-uint256-[`++_moveVotingPower++`]]
- :_writeCheckpoint: pass:normal[xref:#ERC20Votes-_writeCheckpoint-struct-ERC20Votes-Checkpoint---function--uint256-uint256--view-returns--uint256--uint256-[`++_writeCheckpoint++`]]
- :_add: pass:normal[xref:#ERC20Votes-_add-uint256-uint256-[`++_add++`]]
- :_subtract: pass:normal[xref:#ERC20Votes-_subtract-uint256-uint256-[`++_subtract++`]]
- :_unsafeAccess: pass:normal[xref:#ERC20Votes-_unsafeAccess-struct-ERC20Votes-Checkpoint---uint256-[`++_unsafeAccess++`]]
- [.contract]
- [[ERC20Votes]]
- === `++ERC20Votes++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/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 ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,
- and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.
- NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.
- This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
- by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
- power can be queried through the public accessors {getVotes} and {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.
- _Available since v4.2._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Votes-checkpoints-address-uint32-}[`++checkpoints(account, pos)++`]
- * {xref-ERC20Votes-numCheckpoints-address-}[`++numCheckpoints(account)++`]
- * {xref-ERC20Votes-delegates-address-}[`++delegates(account)++`]
- * {xref-ERC20Votes-getVotes-address-}[`++getVotes(account)++`]
- * {xref-ERC20Votes-getPastVotes-address-uint256-}[`++getPastVotes(account, blockNumber)++`]
- * {xref-ERC20Votes-getPastTotalSupply-uint256-}[`++getPastTotalSupply(blockNumber)++`]
- * {xref-ERC20Votes-delegate-address-}[`++delegate(delegatee)++`]
- * {xref-ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-}[`++delegateBySig(delegatee, nonce, expiry, v, r, s)++`]
- * {xref-ERC20Votes-_maxSupply--}[`++_maxSupply()++`]
- * {xref-ERC20Votes-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20Votes-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20Votes-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- * {xref-ERC20Votes-_delegate-address-address-}[`++_delegate(delegator, delegatee)++`]
- [.contract-subindex-inherited]
- .ERC20Permit
- * {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()++`]
- * {xref-ERC20Permit-_useNonce-address-}[`++_useNonce(owner)++`]
- [.contract-subindex-inherited]
- .EIP712
- * {xref-EIP712-_domainSeparatorV4--}[`++_domainSeparatorV4()++`]
- * {xref-EIP712-_hashTypedDataV4-bytes32-}[`++_hashTypedDataV4(structHash)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- [.contract-subindex-inherited]
- .IVotes
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20Permit
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- [.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-subindex-inherited]
- .IVotes
- * {xref-IVotes-DelegateChanged-address-address-address-}[`++DelegateChanged(delegator, fromDelegate, toDelegate)++`]
- * {xref-IVotes-DelegateVotesChanged-address-uint256-uint256-}[`++DelegateVotesChanged(delegate, previousBalance, newBalance)++`]
- --
- [.contract-item]
- [[ERC20Votes-checkpoints-address-uint32-]]
- ==== `[.contract-item-name]#++checkpoints++#++(address account, uint32 pos) → struct ERC20Votes.Checkpoint++` [.item-kind]#public#
- Get the `pos`-th checkpoint for `account`.
- [.contract-item]
- [[ERC20Votes-numCheckpoints-address-]]
- ==== `[.contract-item-name]#++numCheckpoints++#++(address account) → uint32++` [.item-kind]#public#
- Get number of checkpoints for `account`.
- [.contract-item]
- [[ERC20Votes-delegates-address-]]
- ==== `[.contract-item-name]#++delegates++#++(address account) → address++` [.item-kind]#public#
- Get the address `account` is currently delegating to.
- [.contract-item]
- [[ERC20Votes-getVotes-address-]]
- ==== `[.contract-item-name]#++getVotes++#++(address account) → uint256++` [.item-kind]#public#
- Gets the current votes balance for `account`
- [.contract-item]
- [[ERC20Votes-getPastVotes-address-uint256-]]
- ==== `[.contract-item-name]#++getPastVotes++#++(address account, uint256 blockNumber) → uint256++` [.item-kind]#public#
- Retrieve the number of votes for `account` at the end of `blockNumber`.
- Requirements:
- - `blockNumber` must have been already mined
- [.contract-item]
- [[ERC20Votes-getPastTotalSupply-uint256-]]
- ==== `[.contract-item-name]#++getPastTotalSupply++#++(uint256 blockNumber) → uint256++` [.item-kind]#public#
- Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
- It is but NOT the sum of all the delegated votes!
- Requirements:
- - `blockNumber` must have been already mined
- [.contract-item]
- [[ERC20Votes-delegate-address-]]
- ==== `[.contract-item-name]#++delegate++#++(address delegatee)++` [.item-kind]#public#
- Delegate votes from the sender to `delegatee`.
- [.contract-item]
- [[ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++delegateBySig++#++(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s)++` [.item-kind]#public#
- Delegates votes from signer to `delegatee`
- [.contract-item]
- [[ERC20Votes-_maxSupply--]]
- ==== `[.contract-item-name]#++_maxSupply++#++() → uint224++` [.item-kind]#internal#
- Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
- [.contract-item]
- [[ERC20Votes-_mint-address-uint256-]]
- ==== `[.contract-item-name]#++_mint++#++(address account, uint256 amount)++` [.item-kind]#internal#
- Snapshots the totalSupply after it has been increased.
- [.contract-item]
- [[ERC20Votes-_burn-address-uint256-]]
- ==== `[.contract-item-name]#++_burn++#++(address account, uint256 amount)++` [.item-kind]#internal#
- Snapshots the totalSupply after it has been decreased.
- [.contract-item]
- [[ERC20Votes-_afterTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_afterTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- Move voting power when tokens are transferred.
- Emits a {IVotes-DelegateVotesChanged} event.
- [.contract-item]
- [[ERC20Votes-_delegate-address-address-]]
- ==== `[.contract-item-name]#++_delegate++#++(address delegator, address delegatee)++` [.item-kind]#internal#
- Change delegation for `delegator` to `delegatee`.
- Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
- :getCurrentVotes: pass:normal[xref:#ERC20VotesComp-getCurrentVotes-address-[`++getCurrentVotes++`]]
- :getPriorVotes: pass:normal[xref:#ERC20VotesComp-getPriorVotes-address-uint256-[`++getPriorVotes++`]]
- :_maxSupply: pass:normal[xref:#ERC20VotesComp-_maxSupply--[`++_maxSupply++`]]
- [.contract]
- [[ERC20VotesComp]]
- === `++ERC20VotesComp++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/extensions/ERC20VotesComp.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/ERC20VotesComp.sol";
- ```
- Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's
- interface, with the drawback of only supporting supply up to (2^96^ - 1).
- NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token
- with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the
- {ERC20Votes} variant of this module.
- This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
- by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
- power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}.
- 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.
- _Available since v4.2._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20VotesComp-getCurrentVotes-address-}[`++getCurrentVotes(account)++`]
- * {xref-ERC20VotesComp-getPriorVotes-address-uint256-}[`++getPriorVotes(account, blockNumber)++`]
- * {xref-ERC20VotesComp-_maxSupply--}[`++_maxSupply()++`]
- [.contract-subindex-inherited]
- .ERC20Votes
- * {xref-ERC20Votes-checkpoints-address-uint32-}[`++checkpoints(account, pos)++`]
- * {xref-ERC20Votes-numCheckpoints-address-}[`++numCheckpoints(account)++`]
- * {xref-ERC20Votes-delegates-address-}[`++delegates(account)++`]
- * {xref-ERC20Votes-getVotes-address-}[`++getVotes(account)++`]
- * {xref-ERC20Votes-getPastVotes-address-uint256-}[`++getPastVotes(account, blockNumber)++`]
- * {xref-ERC20Votes-getPastTotalSupply-uint256-}[`++getPastTotalSupply(blockNumber)++`]
- * {xref-ERC20Votes-delegate-address-}[`++delegate(delegatee)++`]
- * {xref-ERC20Votes-delegateBySig-address-uint256-uint256-uint8-bytes32-bytes32-}[`++delegateBySig(delegatee, nonce, expiry, v, r, s)++`]
- * {xref-ERC20Votes-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20Votes-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20Votes-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- * {xref-ERC20Votes-_delegate-address-address-}[`++_delegate(delegator, delegatee)++`]
- [.contract-subindex-inherited]
- .ERC20Permit
- * {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()++`]
- * {xref-ERC20Permit-_useNonce-address-}[`++_useNonce(owner)++`]
- [.contract-subindex-inherited]
- .EIP712
- * {xref-EIP712-_domainSeparatorV4--}[`++_domainSeparatorV4()++`]
- * {xref-EIP712-_hashTypedDataV4-bytes32-}[`++_hashTypedDataV4(structHash)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- [.contract-subindex-inherited]
- .IVotes
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20Votes
- [.contract-subindex-inherited]
- .ERC20Permit
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- [.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-subindex-inherited]
- .IVotes
- * {xref-IVotes-DelegateChanged-address-address-address-}[`++DelegateChanged(delegator, fromDelegate, toDelegate)++`]
- * {xref-IVotes-DelegateVotesChanged-address-uint256-uint256-}[`++DelegateVotesChanged(delegate, previousBalance, newBalance)++`]
- --
- [.contract-item]
- [[ERC20VotesComp-getCurrentVotes-address-]]
- ==== `[.contract-item-name]#++getCurrentVotes++#++(address account) → uint96++` [.item-kind]#external#
- Comp version of the {getVotes} accessor, with `uint96` return type.
- [.contract-item]
- [[ERC20VotesComp-getPriorVotes-address-uint256-]]
- ==== `[.contract-item-name]#++getPriorVotes++#++(address account, uint256 blockNumber) → uint96++` [.item-kind]#external#
- Comp version of the {getPastVotes} accessor, with `uint96` return type.
- [.contract-item]
- [[ERC20VotesComp-_maxSupply--]]
- ==== `[.contract-item-name]#++_maxSupply++#++() → uint224++` [.item-kind]#internal#
- Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface.
- :underlying: pass:normal[xref:#ERC20Wrapper-underlying-contract-IERC20[`++underlying++`]]
- :constructor: pass:normal[xref:#ERC20Wrapper-constructor-contract-IERC20-[`++constructor++`]]
- :decimals: pass:normal[xref:#ERC20Wrapper-decimals--[`++decimals++`]]
- :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/v4.8.3/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 ERC20 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" ERC20 into a governance token.
- _Available since v4.2._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20Wrapper-constructor-contract-IERC20-}[`++constructor(underlyingToken)++`]
- * {xref-ERC20Wrapper-decimals--}[`++decimals()++`]
- * {xref-ERC20Wrapper-depositFor-address-uint256-}[`++depositFor(account, amount)++`]
- * {xref-ERC20Wrapper-withdrawTo-address-uint256-}[`++withdrawTo(account, amount)++`]
- * {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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20
- [.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-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-depositFor-address-uint256-]]
- ==== `[.contract-item-name]#++depositFor++#++(address account, uint256 amount) → 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 amount) → 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. Internal
- function that can be exposed with access control if desired.
- :_RETURN_VALUE: pass:normal[xref:#ERC20FlashMint-_RETURN_VALUE-bytes32[`++_RETURN_VALUE++`]]
- :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/v4.8.3/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 ERC3156 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}.
- _Available since v4.1._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20FlashMint-maxFlashLoan-address-}[`++maxFlashLoan(token)++`]
- * {xref-ERC20FlashMint-flashFee-address-uint256-}[`++flashFee(token, amount)++`]
- * {xref-ERC20FlashMint-_flashFee-address-uint256-}[`++_flashFee(token, amount)++`]
- * {xref-ERC20FlashMint-_flashFeeReceiver--}[`++_flashFeeReceiver()++`]
- * {xref-ERC20FlashMint-flashLoan-contract-IERC3156FlashBorrower-address-uint256-bytes-}[`++flashLoan(receiver, token, amount, 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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .IERC3156FlashLender
- [.contract-subindex-inherited]
- .ERC20
- [.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-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 amount) → 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 amount) → 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 amount, 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
- amount + fee tokens and have them approved back to the token contract itself so
- they can be burned.
- :_asset: pass:normal[xref:#ERC4626-_asset-contract-IERC20[`++_asset++`]]
- :_decimals: pass:normal[xref:#ERC4626-_decimals-uint8[`++_decimals++`]]
- :constructor: pass:normal[xref:#ERC4626-constructor-contract-IERC20-[`++constructor++`]]
- :_tryGetAssetDecimals: pass:normal[xref:#ERC4626-_tryGetAssetDecimals-contract-IERC20-[`++_tryGetAssetDecimals++`]]
- :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++`]]
- :_initialConvertToShares: pass:normal[xref:#ERC4626-_initialConvertToShares-uint256-enum-Math-Rounding-[`++_initialConvertToShares++`]]
- :_convertToAssets: pass:normal[xref:#ERC4626-_convertToAssets-uint256-enum-Math-Rounding-[`++_convertToAssets++`]]
- :_initialConvertToAssets: pass:normal[xref:#ERC4626-_initialConvertToAssets-uint256-enum-Math-Rounding-[`++_initialConvertToAssets++`]]
- :_deposit: pass:normal[xref:#ERC4626-_deposit-address-address-uint256-uint256-[`++_deposit++`]]
- :_withdraw: pass:normal[xref:#ERC4626-_withdraw-address-address-address-uint256-uint256-[`++_withdraw++`]]
- :_isVaultCollateralized: pass:normal[xref:#ERC4626-_isVaultCollateralized--[`++_isVaultCollateralized++`]]
- [.contract]
- [[ERC4626]]
- === `++ERC4626++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/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 ERC4626 "Tokenized Vault Standard" as defined in
- https://eips.ethereum.org/EIPS/eip-4626[EIP-4626].
- This extension allows the minting and burning of "shares" (represented using the ERC20 inheritance) in exchange for
- underlying "assets" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends
- the ERC20 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: When the vault is empty or nearly empty, 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 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].
- _Available since v4.7._
- [.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-_initialConvertToShares-uint256-enum-Math-Rounding-}[`++_initialConvertToShares(assets, )++`]
- * {xref-ERC4626-_convertToAssets-uint256-enum-Math-Rounding-}[`++_convertToAssets(shares, rounding)++`]
- * {xref-ERC4626-_initialConvertToAssets-uint256-enum-Math-Rounding-}[`++_initialConvertToAssets(shares, )++`]
- * {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)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.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]
- .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-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 (ERC20 or ERC777).
- [.contract-item]
- [[ERC4626-decimals--]]
- ==== `[.contract-item-name]#++decimals++#++() → uint8++` [.item-kind]#public#
- Decimals are read from the underlying asset in the constructor and cached. If this fails (e.g., the asset
- has not been created yet), the cached value is set to a default obtained by `super.decimals()` (which depends on
- inheritance but is most likely 18). Override this function in order to set a guaranteed hardcoded value.
- 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 shares++` [.item-kind]#public#
- See {IERC4626-convertToShares}.
- [.contract-item]
- [[ERC4626-convertToAssets-uint256-]]
- ==== `[.contract-item-name]#++convertToAssets++#++(uint256 shares) → uint256 assets++` [.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}.
- As opposed to {deposit}, minting is allowed even if the vault is in a state where the price of a share is zero.
- In this case, the shares will be minted without requiring any assets to be deposited.
- [.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 shares++` [.item-kind]#internal#
- Internal conversion function (from assets to shares) with support for rounding direction.
- Will revert if assets > 0, totalSupply > 0 and totalAssets = 0. That corresponds to a case where any asset
- would represent an infinite amount of shares.
- [.contract-item]
- [[ERC4626-_initialConvertToShares-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++_initialConvertToShares++#++(uint256 assets, enum Math.Rounding) → uint256 shares++` [.item-kind]#internal#
- Internal conversion function (from assets to shares) to apply when the vault is empty.
- NOTE: Make sure to keep this function consistent with {_initialConvertToAssets} when overriding it.
- [.contract-item]
- [[ERC4626-_convertToAssets-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++_convertToAssets++#++(uint256 shares, enum Math.Rounding rounding) → uint256 assets++` [.item-kind]#internal#
- Internal conversion function (from shares to assets) with support for rounding direction.
- [.contract-item]
- [[ERC4626-_initialConvertToAssets-uint256-enum-Math-Rounding-]]
- ==== `[.contract-item-name]#++_initialConvertToAssets++#++(uint256 shares, enum Math.Rounding) → uint256 assets++` [.item-kind]#internal#
- Internal conversion function (from shares to assets) to apply when the vault is empty.
- NOTE: Make sure to keep this function consistent with {_initialConvertToShares} when overriding it.
- [.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.
- == Draft EIPs
- The following EIPs are still in Draft status. Due to their nature as drafts, the details of these contracts may change and we cannot guarantee their xref:ROOT:releases-stability.adoc[stability]. Minor releases of OpenZeppelin Contracts may contain breaking changes for the contracts in this directory, which will be duly announced in the https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md[changelog]. The EIPs included here are used by projects in production and this may make them less likely to change significantly.
- :_nonces: pass:normal[xref:#ERC20Permit-_nonces-mapping-address----struct-Counters-Counter-[`++_nonces++`]]
- :_PERMIT_TYPEHASH: pass:normal[xref:#ERC20Permit-_PERMIT_TYPEHASH-bytes32[`++_PERMIT_TYPEHASH++`]]
- :_PERMIT_TYPEHASH_DEPRECATED_SLOT: pass:normal[xref:#ERC20Permit-_PERMIT_TYPEHASH_DEPRECATED_SLOT-bytes32[`++_PERMIT_TYPEHASH_DEPRECATED_SLOT++`]]
- :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++`]]
- :_useNonce: pass:normal[xref:#ERC20Permit-_useNonce-address-[`++_useNonce++`]]
- [.contract]
- [[ERC20Permit]]
- === `++ERC20Permit++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/extensions/draft-ERC20Permit.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
- ```
- Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
- https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
- Adds the {permit} method, which can be used to change an account's ERC20 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.
- _Available since v3.4._
- [.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()++`]
- * {xref-ERC20Permit-_useNonce-address-}[`++_useNonce(owner)++`]
- [.contract-subindex-inherited]
- .EIP712
- * {xref-EIP712-_domainSeparatorV4--}[`++_domainSeparatorV4()++`]
- * {xref-EIP712-_hashTypedDataV4-bytes32-}[`++_hashTypedDataV4(structHash)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .EIP712
- [.contract-subindex-inherited]
- .IERC20Permit
- [.contract-subindex-inherited]
- .ERC20
- [.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-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 ERC20 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#
- See {IERC20Permit-permit}.
- [.contract-item]
- [[ERC20Permit-nonces-address-]]
- ==== `[.contract-item-name]#++nonces++#++(address owner) → uint256++` [.item-kind]#public#
- See {IERC20Permit-nonces}.
- [.contract-item]
- [[ERC20Permit-DOMAIN_SEPARATOR--]]
- ==== `[.contract-item-name]#++DOMAIN_SEPARATOR++#++() → bytes32++` [.item-kind]#external#
- See {IERC20Permit-DOMAIN_SEPARATOR}.
- [.contract-item]
- [[ERC20Permit-_useNonce-address-]]
- ==== `[.contract-item-name]#++_useNonce++#++(address owner) → uint256 current++` [.item-kind]#internal#
- "Consume a nonce": return the current value and increment.
- _Available since v4.1._
- == Presets
- These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code.
- :MINTER_ROLE: pass:normal[xref:#ERC20PresetMinterPauser-MINTER_ROLE-bytes32[`++MINTER_ROLE++`]]
- :PAUSER_ROLE: pass:normal[xref:#ERC20PresetMinterPauser-PAUSER_ROLE-bytes32[`++PAUSER_ROLE++`]]
- :constructor: pass:normal[xref:#ERC20PresetMinterPauser-constructor-string-string-[`++constructor++`]]
- :mint: pass:normal[xref:#ERC20PresetMinterPauser-mint-address-uint256-[`++mint++`]]
- :pause: pass:normal[xref:#ERC20PresetMinterPauser-pause--[`++pause++`]]
- :unpause: pass:normal[xref:#ERC20PresetMinterPauser-unpause--[`++unpause++`]]
- :_beforeTokenTransfer: pass:normal[xref:#ERC20PresetMinterPauser-_beforeTokenTransfer-address-address-uint256-[`++_beforeTokenTransfer++`]]
- [.contract]
- [[ERC20PresetMinterPauser]]
- === `++ERC20PresetMinterPauser++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol";
- ```
- {ERC20} token, including:
- - ability for holders to burn (destroy) their tokens
- - a minter role that allows for token minting (creation)
- - a pauser role that allows to stop all token transfers
- This contract uses {AccessControl} to lock permissioned functions using the
- different roles - head to its documentation for details.
- The account that deploys the contract will be granted the minter and pauser
- roles, as well as the default admin role, which will let it grant both minter
- and pauser roles to other accounts.
- _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20PresetMinterPauser-constructor-string-string-}[`++constructor(name, symbol)++`]
- * {xref-ERC20PresetMinterPauser-mint-address-uint256-}[`++mint(to, amount)++`]
- * {xref-ERC20PresetMinterPauser-pause--}[`++pause()++`]
- * {xref-ERC20PresetMinterPauser-unpause--}[`++unpause()++`]
- * {xref-ERC20PresetMinterPauser-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .ERC20Pausable
- [.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]
- .ERC20Burnable
- * {xref-ERC20Burnable-burn-uint256-}[`++burn(amount)++`]
- * {xref-ERC20Burnable-burnFrom-address-uint256-}[`++burnFrom(account, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- [.contract-subindex-inherited]
- .AccessControlEnumerable
- * {xref-AccessControlEnumerable-supportsInterface-bytes4-}[`++supportsInterface(interfaceId)++`]
- * {xref-AccessControlEnumerable-getRoleMember-bytes32-uint256-}[`++getRoleMember(role, index)++`]
- * {xref-AccessControlEnumerable-getRoleMemberCount-bytes32-}[`++getRoleMemberCount(role)++`]
- * {xref-AccessControlEnumerable-_grantRole-bytes32-address-}[`++_grantRole(role, account)++`]
- * {xref-AccessControlEnumerable-_revokeRole-bytes32-address-}[`++_revokeRole(role, account)++`]
- [.contract-subindex-inherited]
- .AccessControl
- * {xref-AccessControl-hasRole-bytes32-address-}[`++hasRole(role, account)++`]
- * {xref-AccessControl-_checkRole-bytes32-}[`++_checkRole(role)++`]
- * {xref-AccessControl-_checkRole-bytes32-address-}[`++_checkRole(role, account)++`]
- * {xref-AccessControl-getRoleAdmin-bytes32-}[`++getRoleAdmin(role)++`]
- * {xref-AccessControl-grantRole-bytes32-address-}[`++grantRole(role, account)++`]
- * {xref-AccessControl-revokeRole-bytes32-address-}[`++revokeRole(role, account)++`]
- * {xref-AccessControl-renounceRole-bytes32-address-}[`++renounceRole(role, account)++`]
- * {xref-AccessControl-_setupRole-bytes32-address-}[`++_setupRole(role, account)++`]
- * {xref-AccessControl-_setRoleAdmin-bytes32-bytes32-}[`++_setRoleAdmin(role, adminRole)++`]
- [.contract-subindex-inherited]
- .ERC165
- [.contract-subindex-inherited]
- .IERC165
- [.contract-subindex-inherited]
- .IAccessControlEnumerable
- [.contract-subindex-inherited]
- .IAccessControl
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20Pausable
- [.contract-subindex-inherited]
- .Pausable
- * {xref-Pausable-Paused-address-}[`++Paused(account)++`]
- * {xref-Pausable-Unpaused-address-}[`++Unpaused(account)++`]
- [.contract-subindex-inherited]
- .ERC20Burnable
- [.contract-subindex-inherited]
- .ERC20
- [.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-subindex-inherited]
- .AccessControlEnumerable
- [.contract-subindex-inherited]
- .AccessControl
- [.contract-subindex-inherited]
- .ERC165
- [.contract-subindex-inherited]
- .IERC165
- [.contract-subindex-inherited]
- .IAccessControlEnumerable
- [.contract-subindex-inherited]
- .IAccessControl
- * {xref-IAccessControl-RoleAdminChanged-bytes32-bytes32-bytes32-}[`++RoleAdminChanged(role, previousAdminRole, newAdminRole)++`]
- * {xref-IAccessControl-RoleGranted-bytes32-address-address-}[`++RoleGranted(role, account, sender)++`]
- * {xref-IAccessControl-RoleRevoked-bytes32-address-address-}[`++RoleRevoked(role, account, sender)++`]
- --
- [.contract-item]
- [[ERC20PresetMinterPauser-constructor-string-string-]]
- ==== `[.contract-item-name]#++constructor++#++(string name, string symbol)++` [.item-kind]#public#
- Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
- account that deploys the contract.
- See {ERC20-constructor}.
- [.contract-item]
- [[ERC20PresetMinterPauser-mint-address-uint256-]]
- ==== `[.contract-item-name]#++mint++#++(address to, uint256 amount)++` [.item-kind]#public#
- Creates `amount` new tokens for `to`.
- See {ERC20-_mint}.
- Requirements:
- - the caller must have the `MINTER_ROLE`.
- [.contract-item]
- [[ERC20PresetMinterPauser-pause--]]
- ==== `[.contract-item-name]#++pause++#++()++` [.item-kind]#public#
- Pauses all token transfers.
- See {ERC20Pausable} and {Pausable-_pause}.
- Requirements:
- - the caller must have the `PAUSER_ROLE`.
- [.contract-item]
- [[ERC20PresetMinterPauser-unpause--]]
- ==== `[.contract-item-name]#++unpause++#++()++` [.item-kind]#public#
- Unpauses all token transfers.
- See {ERC20Pausable} and {Pausable-_unpause}.
- Requirements:
- - the caller must have the `PAUSER_ROLE`.
- [.contract-item]
- [[ERC20PresetMinterPauser-_beforeTokenTransfer-address-address-uint256-]]
- ==== `[.contract-item-name]#++_beforeTokenTransfer++#++(address from, address to, uint256 amount)++` [.item-kind]#internal#
- :constructor: pass:normal[xref:#ERC20PresetFixedSupply-constructor-string-string-uint256-address-[`++constructor++`]]
- [.contract]
- [[ERC20PresetFixedSupply]]
- === `++ERC20PresetFixedSupply++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
- ```
- {ERC20} token, including:
- - Preminted initial supply
- - Ability for holders to burn (destroy) their tokens
- - No access control mechanism (for minting/pausing) and hence no governance
- This contract uses {ERC20Burnable} to include burn capabilities - head to
- its documentation for details.
- _Available since v3.4._
- _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
- [.contract-index]
- .Functions
- --
- * {xref-ERC20PresetFixedSupply-constructor-string-string-uint256-address-}[`++constructor(name, symbol, initialSupply, owner)++`]
- [.contract-subindex-inherited]
- .ERC20Burnable
- * {xref-ERC20Burnable-burn-uint256-}[`++burn(amount)++`]
- * {xref-ERC20Burnable-burnFrom-address-uint256-}[`++burnFrom(account, amount)++`]
- [.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, amount)++`]
- * {xref-ERC20-allowance-address-address-}[`++allowance(owner, spender)++`]
- * {xref-ERC20-approve-address-uint256-}[`++approve(spender, amount)++`]
- * {xref-ERC20-transferFrom-address-address-uint256-}[`++transferFrom(from, to, amount)++`]
- * {xref-ERC20-increaseAllowance-address-uint256-}[`++increaseAllowance(spender, addedValue)++`]
- * {xref-ERC20-decreaseAllowance-address-uint256-}[`++decreaseAllowance(spender, subtractedValue)++`]
- * {xref-ERC20-_transfer-address-address-uint256-}[`++_transfer(from, to, amount)++`]
- * {xref-ERC20-_mint-address-uint256-}[`++_mint(account, amount)++`]
- * {xref-ERC20-_burn-address-uint256-}[`++_burn(account, amount)++`]
- * {xref-ERC20-_approve-address-address-uint256-}[`++_approve(owner, spender, amount)++`]
- * {xref-ERC20-_spendAllowance-address-address-uint256-}[`++_spendAllowance(owner, spender, amount)++`]
- * {xref-ERC20-_beforeTokenTransfer-address-address-uint256-}[`++_beforeTokenTransfer(from, to, amount)++`]
- * {xref-ERC20-_afterTokenTransfer-address-address-uint256-}[`++_afterTokenTransfer(from, to, amount)++`]
- [.contract-subindex-inherited]
- .IERC20Metadata
- [.contract-subindex-inherited]
- .IERC20
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .ERC20Burnable
- [.contract-subindex-inherited]
- .ERC20
- [.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-item]
- [[ERC20PresetFixedSupply-constructor-string-string-uint256-address-]]
- ==== `[.contract-item-name]#++constructor++#++(string name, string symbol, uint256 initialSupply, address owner)++` [.item-kind]#public#
- Mints `initialSupply` amount of token and transfers them to `owner`.
- See {ERC20-constructor}.
- == Utilities
- :safeTransfer: pass:normal[xref:#SafeERC20-safeTransfer-contract-IERC20-address-uint256-[`++safeTransfer++`]]
- :safeTransferFrom: pass:normal[xref:#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-[`++safeTransferFrom++`]]
- :safeApprove: pass:normal[xref:#SafeERC20-safeApprove-contract-IERC20-address-uint256-[`++safeApprove++`]]
- :safeIncreaseAllowance: pass:normal[xref:#SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-[`++safeIncreaseAllowance++`]]
- :safeDecreaseAllowance: pass:normal[xref:#SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-[`++safeDecreaseAllowance++`]]
- :safePermit: pass:normal[xref:#SafeERC20-safePermit-contract-IERC20Permit-address-address-uint256-uint256-uint8-bytes32-bytes32-[`++safePermit++`]]
- :_callOptionalReturn: pass:normal[xref:#SafeERC20-_callOptionalReturn-contract-IERC20-bytes-[`++_callOptionalReturn++`]]
- [.contract]
- [[SafeERC20]]
- === `++SafeERC20++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/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 ERC20 operations that throw on failure (when the token
- contract returns false). Tokens that return no value (and instead revert or
- throw on failure) are also supported, non-reverting calls are assumed to be
- successful.
- To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
- which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
- [.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-safeApprove-contract-IERC20-address-uint256-}[`++safeApprove(token, spender, value)++`]
- * {xref-SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-}[`++safeIncreaseAllowance(token, spender, value)++`]
- * {xref-SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-}[`++safeDecreaseAllowance(token, spender, value)++`]
- * {xref-SafeERC20-safePermit-contract-IERC20Permit-address-address-uint256-uint256-uint8-bytes32-bytes32-}[`++safePermit(token, owner, spender, value, deadline, v, r, s)++`]
- --
- [.contract-item]
- [[SafeERC20-safeTransfer-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeTransfer++#++(contract IERC20 token, address to, uint256 value)++` [.item-kind]#internal#
- [.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#
- [.contract-item]
- [[SafeERC20-safeApprove-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeApprove++#++(contract IERC20 token, address spender, uint256 value)++` [.item-kind]#internal#
- Deprecated. This function has issues similar to the ones found in
- {IERC20-approve}, and its usage is discouraged.
- Whenever possible, use {safeIncreaseAllowance} and
- {safeDecreaseAllowance} instead.
- [.contract-item]
- [[SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeIncreaseAllowance++#++(contract IERC20 token, address spender, uint256 value)++` [.item-kind]#internal#
- [.contract-item]
- [[SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++safeDecreaseAllowance++#++(contract IERC20 token, address spender, uint256 value)++` [.item-kind]#internal#
- [.contract-item]
- [[SafeERC20-safePermit-contract-IERC20Permit-address-address-uint256-uint256-uint8-bytes32-bytes32-]]
- ==== `[.contract-item-name]#++safePermit++#++(contract IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)++` [.item-kind]#internal#
- :_token: pass:normal[xref:#TokenTimelock-_token-contract-IERC20[`++_token++`]]
- :_beneficiary: pass:normal[xref:#TokenTimelock-_beneficiary-address[`++_beneficiary++`]]
- :_releaseTime: pass:normal[xref:#TokenTimelock-_releaseTime-uint256[`++_releaseTime++`]]
- :constructor: pass:normal[xref:#TokenTimelock-constructor-contract-IERC20-address-uint256-[`++constructor++`]]
- :token: pass:normal[xref:#TokenTimelock-token--[`++token++`]]
- :beneficiary: pass:normal[xref:#TokenTimelock-beneficiary--[`++beneficiary++`]]
- :releaseTime: pass:normal[xref:#TokenTimelock-releaseTime--[`++releaseTime++`]]
- :release: pass:normal[xref:#TokenTimelock-release--[`++release++`]]
- [.contract]
- [[TokenTimelock]]
- === `++TokenTimelock++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/utils/TokenTimelock.sol[{github-icon},role=heading-link]
- [.hljs-theme-light.nopadding]
- ```solidity
- import "@openzeppelin/contracts/token/ERC20/utils/TokenTimelock.sol";
- ```
- A token holder contract that will allow a beneficiary to extract the
- tokens after a given release time.
- Useful for simple vesting schedules like "advisors get all of their tokens
- after 1 year".
- [.contract-index]
- .Functions
- --
- * {xref-TokenTimelock-constructor-contract-IERC20-address-uint256-}[`++constructor(token_, beneficiary_, releaseTime_)++`]
- * {xref-TokenTimelock-token--}[`++token()++`]
- * {xref-TokenTimelock-beneficiary--}[`++beneficiary()++`]
- * {xref-TokenTimelock-releaseTime--}[`++releaseTime()++`]
- * {xref-TokenTimelock-release--}[`++release()++`]
- --
- [.contract-item]
- [[TokenTimelock-constructor-contract-IERC20-address-uint256-]]
- ==== `[.contract-item-name]#++constructor++#++(contract IERC20 token_, address beneficiary_, uint256 releaseTime_)++` [.item-kind]#public#
- Deploys a timelock instance that is able to hold the token specified, and will only release it to
- `beneficiary_` when {release} is invoked after `releaseTime_`. The release time is specified as a Unix timestamp
- (in seconds).
- [.contract-item]
- [[TokenTimelock-token--]]
- ==== `[.contract-item-name]#++token++#++() → contract IERC20++` [.item-kind]#public#
- Returns the token being held.
- [.contract-item]
- [[TokenTimelock-beneficiary--]]
- ==== `[.contract-item-name]#++beneficiary++#++() → address++` [.item-kind]#public#
- Returns the beneficiary that will receive the tokens.
- [.contract-item]
- [[TokenTimelock-releaseTime--]]
- ==== `[.contract-item-name]#++releaseTime++#++() → uint256++` [.item-kind]#public#
- Returns the time when the tokens are released in seconds since Unix epoch (i.e. Unix timestamp).
- [.contract-item]
- [[TokenTimelock-release--]]
- ==== `[.contract-item-name]#++release++#++()++` [.item-kind]#public#
- Transfers tokens held by the timelock to the beneficiary. Will only succeed if invoked after the release
- time.
|