123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944 |
- :Context: pass:normal[xref:GSN.adoc#Context[`Context`]]
- :xref-Context: xref:GSN.adoc#Context
- :Context-constructor: pass:normal[xref:GSN.adoc#Context-constructor--[`Context.constructor`]]
- :xref-Context-constructor: xref:GSN.adoc#Context-constructor--
- :Context-_msgSender: pass:normal[xref:GSN.adoc#Context-_msgSender--[`Context._msgSender`]]
- :xref-Context-_msgSender: xref:GSN.adoc#Context-_msgSender--
- :Context-_msgData: pass:normal[xref:GSN.adoc#Context-_msgData--[`Context._msgData`]]
- :xref-Context-_msgData: xref:GSN.adoc#Context-_msgData--
- :GSNRecipient: pass:normal[xref:GSN.adoc#GSNRecipient[`GSNRecipient`]]
- :xref-GSNRecipient: xref:GSN.adoc#GSNRecipient
- :GSNRecipient-POST_RELAYED_CALL_MAX_GAS: pass:normal[xref:GSN.adoc#GSNRecipient-POST_RELAYED_CALL_MAX_GAS-uint256[`GSNRecipient.POST_RELAYED_CALL_MAX_GAS`]]
- :xref-GSNRecipient-POST_RELAYED_CALL_MAX_GAS: xref:GSN.adoc#GSNRecipient-POST_RELAYED_CALL_MAX_GAS-uint256
- :GSNRecipient-getHubAddr: pass:normal[xref:GSN.adoc#GSNRecipient-getHubAddr--[`GSNRecipient.getHubAddr`]]
- :xref-GSNRecipient-getHubAddr: xref:GSN.adoc#GSNRecipient-getHubAddr--
- :GSNRecipient-_upgradeRelayHub: pass:normal[xref:GSN.adoc#GSNRecipient-_upgradeRelayHub-address-[`GSNRecipient._upgradeRelayHub`]]
- :xref-GSNRecipient-_upgradeRelayHub: xref:GSN.adoc#GSNRecipient-_upgradeRelayHub-address-
- :GSNRecipient-relayHubVersion: pass:normal[xref:GSN.adoc#GSNRecipient-relayHubVersion--[`GSNRecipient.relayHubVersion`]]
- :xref-GSNRecipient-relayHubVersion: xref:GSN.adoc#GSNRecipient-relayHubVersion--
- :GSNRecipient-_withdrawDeposits: pass:normal[xref:GSN.adoc#GSNRecipient-_withdrawDeposits-uint256-address-payable-[`GSNRecipient._withdrawDeposits`]]
- :xref-GSNRecipient-_withdrawDeposits: xref:GSN.adoc#GSNRecipient-_withdrawDeposits-uint256-address-payable-
- :GSNRecipient-_msgSender: pass:normal[xref:GSN.adoc#GSNRecipient-_msgSender--[`GSNRecipient._msgSender`]]
- :xref-GSNRecipient-_msgSender: xref:GSN.adoc#GSNRecipient-_msgSender--
- :GSNRecipient-_msgData: pass:normal[xref:GSN.adoc#GSNRecipient-_msgData--[`GSNRecipient._msgData`]]
- :xref-GSNRecipient-_msgData: xref:GSN.adoc#GSNRecipient-_msgData--
- :GSNRecipient-preRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-preRelayedCall-bytes-[`GSNRecipient.preRelayedCall`]]
- :xref-GSNRecipient-preRelayedCall: xref:GSN.adoc#GSNRecipient-preRelayedCall-bytes-
- :GSNRecipient-_preRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-_preRelayedCall-bytes-[`GSNRecipient._preRelayedCall`]]
- :xref-GSNRecipient-_preRelayedCall: xref:GSN.adoc#GSNRecipient-_preRelayedCall-bytes-
- :GSNRecipient-postRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-postRelayedCall-bytes-bool-uint256-bytes32-[`GSNRecipient.postRelayedCall`]]
- :xref-GSNRecipient-postRelayedCall: xref:GSN.adoc#GSNRecipient-postRelayedCall-bytes-bool-uint256-bytes32-
- :GSNRecipient-_postRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-_postRelayedCall-bytes-bool-uint256-bytes32-[`GSNRecipient._postRelayedCall`]]
- :xref-GSNRecipient-_postRelayedCall: xref:GSN.adoc#GSNRecipient-_postRelayedCall-bytes-bool-uint256-bytes32-
- :GSNRecipient-_approveRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-_approveRelayedCall--[`GSNRecipient._approveRelayedCall`]]
- :xref-GSNRecipient-_approveRelayedCall: xref:GSN.adoc#GSNRecipient-_approveRelayedCall--
- :GSNRecipient-_approveRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-_approveRelayedCall-bytes-[`GSNRecipient._approveRelayedCall`]]
- :xref-GSNRecipient-_approveRelayedCall: xref:GSN.adoc#GSNRecipient-_approveRelayedCall-bytes-
- :GSNRecipient-_rejectRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipient-_rejectRelayedCall-uint256-[`GSNRecipient._rejectRelayedCall`]]
- :xref-GSNRecipient-_rejectRelayedCall: xref:GSN.adoc#GSNRecipient-_rejectRelayedCall-uint256-
- :GSNRecipient-_computeCharge: pass:normal[xref:GSN.adoc#GSNRecipient-_computeCharge-uint256-uint256-uint256-[`GSNRecipient._computeCharge`]]
- :xref-GSNRecipient-_computeCharge: xref:GSN.adoc#GSNRecipient-_computeCharge-uint256-uint256-uint256-
- :GSNRecipient-RelayHubChanged: pass:normal[xref:GSN.adoc#GSNRecipient-RelayHubChanged-address-address-[`GSNRecipient.RelayHubChanged`]]
- :xref-GSNRecipient-RelayHubChanged: xref:GSN.adoc#GSNRecipient-RelayHubChanged-address-address-
- :GSNRecipientERC20Fee: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee[`GSNRecipientERC20Fee`]]
- :xref-GSNRecipientERC20Fee: xref:GSN.adoc#GSNRecipientERC20Fee
- :GSNRecipientERC20Fee-constructor: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-constructor-string-string-[`GSNRecipientERC20Fee.constructor`]]
- :xref-GSNRecipientERC20Fee-constructor: xref:GSN.adoc#GSNRecipientERC20Fee-constructor-string-string-
- :GSNRecipientERC20Fee-token: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-token--[`GSNRecipientERC20Fee.token`]]
- :xref-GSNRecipientERC20Fee-token: xref:GSN.adoc#GSNRecipientERC20Fee-token--
- :GSNRecipientERC20Fee-_mint: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-_mint-address-uint256-[`GSNRecipientERC20Fee._mint`]]
- :xref-GSNRecipientERC20Fee-_mint: xref:GSN.adoc#GSNRecipientERC20Fee-_mint-address-uint256-
- :GSNRecipientERC20Fee-acceptRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`GSNRecipientERC20Fee.acceptRelayedCall`]]
- :xref-GSNRecipientERC20Fee-acceptRelayedCall: xref:GSN.adoc#GSNRecipientERC20Fee-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-
- :GSNRecipientERC20Fee-_preRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-_preRelayedCall-bytes-[`GSNRecipientERC20Fee._preRelayedCall`]]
- :xref-GSNRecipientERC20Fee-_preRelayedCall: xref:GSN.adoc#GSNRecipientERC20Fee-_preRelayedCall-bytes-
- :GSNRecipientERC20Fee-_postRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientERC20Fee-_postRelayedCall-bytes-bool-uint256-bytes32-[`GSNRecipientERC20Fee._postRelayedCall`]]
- :xref-GSNRecipientERC20Fee-_postRelayedCall: xref:GSN.adoc#GSNRecipientERC20Fee-_postRelayedCall-bytes-bool-uint256-bytes32-
- :__unstable__ERC20PrimaryAdmin: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin[`__unstable__ERC20PrimaryAdmin`]]
- :xref-__unstable__ERC20PrimaryAdmin: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin
- :__unstable__ERC20PrimaryAdmin-constructor: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-constructor-string-string-uint8-[`__unstable__ERC20PrimaryAdmin.constructor`]]
- :xref-__unstable__ERC20PrimaryAdmin-constructor: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-constructor-string-string-uint8-
- :__unstable__ERC20PrimaryAdmin-mint: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-mint-address-uint256-[`__unstable__ERC20PrimaryAdmin.mint`]]
- :xref-__unstable__ERC20PrimaryAdmin-mint: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-mint-address-uint256-
- :__unstable__ERC20PrimaryAdmin-allowance: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-allowance-address-address-[`__unstable__ERC20PrimaryAdmin.allowance`]]
- :xref-__unstable__ERC20PrimaryAdmin-allowance: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-allowance-address-address-
- :__unstable__ERC20PrimaryAdmin-_approve: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-_approve-address-address-uint256-[`__unstable__ERC20PrimaryAdmin._approve`]]
- :xref-__unstable__ERC20PrimaryAdmin-_approve: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-_approve-address-address-uint256-
- :__unstable__ERC20PrimaryAdmin-transferFrom: pass:normal[xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-transferFrom-address-address-uint256-[`__unstable__ERC20PrimaryAdmin.transferFrom`]]
- :xref-__unstable__ERC20PrimaryAdmin-transferFrom: xref:GSN.adoc#__unstable__ERC20PrimaryAdmin-transferFrom-address-address-uint256-
- :GSNRecipientSignature: pass:normal[xref:GSN.adoc#GSNRecipientSignature[`GSNRecipientSignature`]]
- :xref-GSNRecipientSignature: xref:GSN.adoc#GSNRecipientSignature
- :GSNRecipientSignature-constructor: pass:normal[xref:GSN.adoc#GSNRecipientSignature-constructor-address-[`GSNRecipientSignature.constructor`]]
- :xref-GSNRecipientSignature-constructor: xref:GSN.adoc#GSNRecipientSignature-constructor-address-
- :GSNRecipientSignature-acceptRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientSignature-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`GSNRecipientSignature.acceptRelayedCall`]]
- :xref-GSNRecipientSignature-acceptRelayedCall: xref:GSN.adoc#GSNRecipientSignature-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-
- :GSNRecipientSignature-_preRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientSignature-_preRelayedCall-bytes-[`GSNRecipientSignature._preRelayedCall`]]
- :xref-GSNRecipientSignature-_preRelayedCall: xref:GSN.adoc#GSNRecipientSignature-_preRelayedCall-bytes-
- :GSNRecipientSignature-_postRelayedCall: pass:normal[xref:GSN.adoc#GSNRecipientSignature-_postRelayedCall-bytes-bool-uint256-bytes32-[`GSNRecipientSignature._postRelayedCall`]]
- :xref-GSNRecipientSignature-_postRelayedCall: xref:GSN.adoc#GSNRecipientSignature-_postRelayedCall-bytes-bool-uint256-bytes32-
- :IRelayHub: pass:normal[xref:GSN.adoc#IRelayHub[`IRelayHub`]]
- :xref-IRelayHub: xref:GSN.adoc#IRelayHub
- :IRelayHub-stake: pass:normal[xref:GSN.adoc#IRelayHub-stake-address-uint256-[`IRelayHub.stake`]]
- :xref-IRelayHub-stake: xref:GSN.adoc#IRelayHub-stake-address-uint256-
- :IRelayHub-registerRelay: pass:normal[xref:GSN.adoc#IRelayHub-registerRelay-uint256-string-[`IRelayHub.registerRelay`]]
- :xref-IRelayHub-registerRelay: xref:GSN.adoc#IRelayHub-registerRelay-uint256-string-
- :IRelayHub-removeRelayByOwner: pass:normal[xref:GSN.adoc#IRelayHub-removeRelayByOwner-address-[`IRelayHub.removeRelayByOwner`]]
- :xref-IRelayHub-removeRelayByOwner: xref:GSN.adoc#IRelayHub-removeRelayByOwner-address-
- :IRelayHub-unstake: pass:normal[xref:GSN.adoc#IRelayHub-unstake-address-[`IRelayHub.unstake`]]
- :xref-IRelayHub-unstake: xref:GSN.adoc#IRelayHub-unstake-address-
- :IRelayHub-getRelay: pass:normal[xref:GSN.adoc#IRelayHub-getRelay-address-[`IRelayHub.getRelay`]]
- :xref-IRelayHub-getRelay: xref:GSN.adoc#IRelayHub-getRelay-address-
- :IRelayHub-depositFor: pass:normal[xref:GSN.adoc#IRelayHub-depositFor-address-[`IRelayHub.depositFor`]]
- :xref-IRelayHub-depositFor: xref:GSN.adoc#IRelayHub-depositFor-address-
- :IRelayHub-balanceOf: pass:normal[xref:GSN.adoc#IRelayHub-balanceOf-address-[`IRelayHub.balanceOf`]]
- :xref-IRelayHub-balanceOf: xref:GSN.adoc#IRelayHub-balanceOf-address-
- :IRelayHub-withdraw: pass:normal[xref:GSN.adoc#IRelayHub-withdraw-uint256-address-payable-[`IRelayHub.withdraw`]]
- :xref-IRelayHub-withdraw: xref:GSN.adoc#IRelayHub-withdraw-uint256-address-payable-
- :IRelayHub-canRelay: pass:normal[xref:GSN.adoc#IRelayHub-canRelay-address-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-[`IRelayHub.canRelay`]]
- :xref-IRelayHub-canRelay: xref:GSN.adoc#IRelayHub-canRelay-address-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-
- :IRelayHub-relayCall: pass:normal[xref:GSN.adoc#IRelayHub-relayCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-[`IRelayHub.relayCall`]]
- :xref-IRelayHub-relayCall: xref:GSN.adoc#IRelayHub-relayCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-
- :IRelayHub-requiredGas: pass:normal[xref:GSN.adoc#IRelayHub-requiredGas-uint256-[`IRelayHub.requiredGas`]]
- :xref-IRelayHub-requiredGas: xref:GSN.adoc#IRelayHub-requiredGas-uint256-
- :IRelayHub-maxPossibleCharge: pass:normal[xref:GSN.adoc#IRelayHub-maxPossibleCharge-uint256-uint256-uint256-[`IRelayHub.maxPossibleCharge`]]
- :xref-IRelayHub-maxPossibleCharge: xref:GSN.adoc#IRelayHub-maxPossibleCharge-uint256-uint256-uint256-
- :IRelayHub-penalizeRepeatedNonce: pass:normal[xref:GSN.adoc#IRelayHub-penalizeRepeatedNonce-bytes-bytes-bytes-bytes-[`IRelayHub.penalizeRepeatedNonce`]]
- :xref-IRelayHub-penalizeRepeatedNonce: xref:GSN.adoc#IRelayHub-penalizeRepeatedNonce-bytes-bytes-bytes-bytes-
- :IRelayHub-penalizeIllegalTransaction: pass:normal[xref:GSN.adoc#IRelayHub-penalizeIllegalTransaction-bytes-bytes-[`IRelayHub.penalizeIllegalTransaction`]]
- :xref-IRelayHub-penalizeIllegalTransaction: xref:GSN.adoc#IRelayHub-penalizeIllegalTransaction-bytes-bytes-
- :IRelayHub-getNonce: pass:normal[xref:GSN.adoc#IRelayHub-getNonce-address-[`IRelayHub.getNonce`]]
- :xref-IRelayHub-getNonce: xref:GSN.adoc#IRelayHub-getNonce-address-
- :IRelayHub-Staked: pass:normal[xref:GSN.adoc#IRelayHub-Staked-address-uint256-uint256-[`IRelayHub.Staked`]]
- :xref-IRelayHub-Staked: xref:GSN.adoc#IRelayHub-Staked-address-uint256-uint256-
- :IRelayHub-RelayAdded: pass:normal[xref:GSN.adoc#IRelayHub-RelayAdded-address-address-uint256-uint256-uint256-string-[`IRelayHub.RelayAdded`]]
- :xref-IRelayHub-RelayAdded: xref:GSN.adoc#IRelayHub-RelayAdded-address-address-uint256-uint256-uint256-string-
- :IRelayHub-RelayRemoved: pass:normal[xref:GSN.adoc#IRelayHub-RelayRemoved-address-uint256-[`IRelayHub.RelayRemoved`]]
- :xref-IRelayHub-RelayRemoved: xref:GSN.adoc#IRelayHub-RelayRemoved-address-uint256-
- :IRelayHub-Unstaked: pass:normal[xref:GSN.adoc#IRelayHub-Unstaked-address-uint256-[`IRelayHub.Unstaked`]]
- :xref-IRelayHub-Unstaked: xref:GSN.adoc#IRelayHub-Unstaked-address-uint256-
- :IRelayHub-Deposited: pass:normal[xref:GSN.adoc#IRelayHub-Deposited-address-address-uint256-[`IRelayHub.Deposited`]]
- :xref-IRelayHub-Deposited: xref:GSN.adoc#IRelayHub-Deposited-address-address-uint256-
- :IRelayHub-Withdrawn: pass:normal[xref:GSN.adoc#IRelayHub-Withdrawn-address-address-uint256-[`IRelayHub.Withdrawn`]]
- :xref-IRelayHub-Withdrawn: xref:GSN.adoc#IRelayHub-Withdrawn-address-address-uint256-
- :IRelayHub-CanRelayFailed: pass:normal[xref:GSN.adoc#IRelayHub-CanRelayFailed-address-address-address-bytes4-uint256-[`IRelayHub.CanRelayFailed`]]
- :xref-IRelayHub-CanRelayFailed: xref:GSN.adoc#IRelayHub-CanRelayFailed-address-address-address-bytes4-uint256-
- :IRelayHub-TransactionRelayed: pass:normal[xref:GSN.adoc#IRelayHub-TransactionRelayed-address-address-address-bytes4-enum-IRelayHub-RelayCallStatus-uint256-[`IRelayHub.TransactionRelayed`]]
- :xref-IRelayHub-TransactionRelayed: xref:GSN.adoc#IRelayHub-TransactionRelayed-address-address-address-bytes4-enum-IRelayHub-RelayCallStatus-uint256-
- :IRelayHub-Penalized: pass:normal[xref:GSN.adoc#IRelayHub-Penalized-address-address-uint256-[`IRelayHub.Penalized`]]
- :xref-IRelayHub-Penalized: xref:GSN.adoc#IRelayHub-Penalized-address-address-uint256-
- :IRelayRecipient: pass:normal[xref:GSN.adoc#IRelayRecipient[`IRelayRecipient`]]
- :xref-IRelayRecipient: xref:GSN.adoc#IRelayRecipient
- :IRelayRecipient-getHubAddr: pass:normal[xref:GSN.adoc#IRelayRecipient-getHubAddr--[`IRelayRecipient.getHubAddr`]]
- :xref-IRelayRecipient-getHubAddr: xref:GSN.adoc#IRelayRecipient-getHubAddr--
- :IRelayRecipient-acceptRelayedCall: pass:normal[xref:GSN.adoc#IRelayRecipient-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`IRelayRecipient.acceptRelayedCall`]]
- :xref-IRelayRecipient-acceptRelayedCall: xref:GSN.adoc#IRelayRecipient-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-
- :IRelayRecipient-preRelayedCall: pass:normal[xref:GSN.adoc#IRelayRecipient-preRelayedCall-bytes-[`IRelayRecipient.preRelayedCall`]]
- :xref-IRelayRecipient-preRelayedCall: xref:GSN.adoc#IRelayRecipient-preRelayedCall-bytes-
- :IRelayRecipient-postRelayedCall: pass:normal[xref:GSN.adoc#IRelayRecipient-postRelayedCall-bytes-bool-uint256-bytes32-[`IRelayRecipient.postRelayedCall`]]
- :xref-IRelayRecipient-postRelayedCall: xref:GSN.adoc#IRelayRecipient-postRelayedCall-bytes-bool-uint256-bytes32-
- :Crowdsale: pass:normal[xref:crowdsale.adoc#Crowdsale[`Crowdsale`]]
- :xref-Crowdsale: xref:crowdsale.adoc#Crowdsale
- :Crowdsale-constructor: pass:normal[xref:crowdsale.adoc#Crowdsale-constructor-uint256-address-payable-contract-IERC20-[`Crowdsale.constructor`]]
- :xref-Crowdsale-constructor: xref:crowdsale.adoc#Crowdsale-constructor-uint256-address-payable-contract-IERC20-
- :Crowdsale-fallback: pass:normal[xref:crowdsale.adoc#Crowdsale-fallback--[`Crowdsale.fallback`]]
- :xref-Crowdsale-fallback: xref:crowdsale.adoc#Crowdsale-fallback--
- :Crowdsale-token: pass:normal[xref:crowdsale.adoc#Crowdsale-token--[`Crowdsale.token`]]
- :xref-Crowdsale-token: xref:crowdsale.adoc#Crowdsale-token--
- :Crowdsale-wallet: pass:normal[xref:crowdsale.adoc#Crowdsale-wallet--[`Crowdsale.wallet`]]
- :xref-Crowdsale-wallet: xref:crowdsale.adoc#Crowdsale-wallet--
- :Crowdsale-rate: pass:normal[xref:crowdsale.adoc#Crowdsale-rate--[`Crowdsale.rate`]]
- :xref-Crowdsale-rate: xref:crowdsale.adoc#Crowdsale-rate--
- :Crowdsale-weiRaised: pass:normal[xref:crowdsale.adoc#Crowdsale-weiRaised--[`Crowdsale.weiRaised`]]
- :xref-Crowdsale-weiRaised: xref:crowdsale.adoc#Crowdsale-weiRaised--
- :Crowdsale-buyTokens: pass:normal[xref:crowdsale.adoc#Crowdsale-buyTokens-address-[`Crowdsale.buyTokens`]]
- :xref-Crowdsale-buyTokens: xref:crowdsale.adoc#Crowdsale-buyTokens-address-
- :Crowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#Crowdsale-_preValidatePurchase-address-uint256-[`Crowdsale._preValidatePurchase`]]
- :xref-Crowdsale-_preValidatePurchase: xref:crowdsale.adoc#Crowdsale-_preValidatePurchase-address-uint256-
- :Crowdsale-_postValidatePurchase: pass:normal[xref:crowdsale.adoc#Crowdsale-_postValidatePurchase-address-uint256-[`Crowdsale._postValidatePurchase`]]
- :xref-Crowdsale-_postValidatePurchase: xref:crowdsale.adoc#Crowdsale-_postValidatePurchase-address-uint256-
- :Crowdsale-_deliverTokens: pass:normal[xref:crowdsale.adoc#Crowdsale-_deliverTokens-address-uint256-[`Crowdsale._deliverTokens`]]
- :xref-Crowdsale-_deliverTokens: xref:crowdsale.adoc#Crowdsale-_deliverTokens-address-uint256-
- :Crowdsale-_processPurchase: pass:normal[xref:crowdsale.adoc#Crowdsale-_processPurchase-address-uint256-[`Crowdsale._processPurchase`]]
- :xref-Crowdsale-_processPurchase: xref:crowdsale.adoc#Crowdsale-_processPurchase-address-uint256-
- :Crowdsale-_updatePurchasingState: pass:normal[xref:crowdsale.adoc#Crowdsale-_updatePurchasingState-address-uint256-[`Crowdsale._updatePurchasingState`]]
- :xref-Crowdsale-_updatePurchasingState: xref:crowdsale.adoc#Crowdsale-_updatePurchasingState-address-uint256-
- :Crowdsale-_getTokenAmount: pass:normal[xref:crowdsale.adoc#Crowdsale-_getTokenAmount-uint256-[`Crowdsale._getTokenAmount`]]
- :xref-Crowdsale-_getTokenAmount: xref:crowdsale.adoc#Crowdsale-_getTokenAmount-uint256-
- :Crowdsale-_forwardFunds: pass:normal[xref:crowdsale.adoc#Crowdsale-_forwardFunds--[`Crowdsale._forwardFunds`]]
- :xref-Crowdsale-_forwardFunds: xref:crowdsale.adoc#Crowdsale-_forwardFunds--
- :Crowdsale-TokensPurchased: pass:normal[xref:crowdsale.adoc#Crowdsale-TokensPurchased-address-address-uint256-uint256-[`Crowdsale.TokensPurchased`]]
- :xref-Crowdsale-TokensPurchased: xref:crowdsale.adoc#Crowdsale-TokensPurchased-address-address-uint256-uint256-
- :FinalizableCrowdsale: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale[`FinalizableCrowdsale`]]
- :xref-FinalizableCrowdsale: xref:crowdsale.adoc#FinalizableCrowdsale
- :FinalizableCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale-constructor--[`FinalizableCrowdsale.constructor`]]
- :xref-FinalizableCrowdsale-constructor: xref:crowdsale.adoc#FinalizableCrowdsale-constructor--
- :FinalizableCrowdsale-finalized: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale-finalized--[`FinalizableCrowdsale.finalized`]]
- :xref-FinalizableCrowdsale-finalized: xref:crowdsale.adoc#FinalizableCrowdsale-finalized--
- :FinalizableCrowdsale-finalize: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale-finalize--[`FinalizableCrowdsale.finalize`]]
- :xref-FinalizableCrowdsale-finalize: xref:crowdsale.adoc#FinalizableCrowdsale-finalize--
- :FinalizableCrowdsale-_finalization: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale-_finalization--[`FinalizableCrowdsale._finalization`]]
- :xref-FinalizableCrowdsale-_finalization: xref:crowdsale.adoc#FinalizableCrowdsale-_finalization--
- :FinalizableCrowdsale-CrowdsaleFinalized: pass:normal[xref:crowdsale.adoc#FinalizableCrowdsale-CrowdsaleFinalized--[`FinalizableCrowdsale.CrowdsaleFinalized`]]
- :xref-FinalizableCrowdsale-CrowdsaleFinalized: xref:crowdsale.adoc#FinalizableCrowdsale-CrowdsaleFinalized--
- :PostDeliveryCrowdsale: pass:normal[xref:crowdsale.adoc#PostDeliveryCrowdsale[`PostDeliveryCrowdsale`]]
- :xref-PostDeliveryCrowdsale: xref:crowdsale.adoc#PostDeliveryCrowdsale
- :PostDeliveryCrowdsale-withdrawTokens: pass:normal[xref:crowdsale.adoc#PostDeliveryCrowdsale-withdrawTokens-address-[`PostDeliveryCrowdsale.withdrawTokens`]]
- :xref-PostDeliveryCrowdsale-withdrawTokens: xref:crowdsale.adoc#PostDeliveryCrowdsale-withdrawTokens-address-
- :PostDeliveryCrowdsale-balanceOf: pass:normal[xref:crowdsale.adoc#PostDeliveryCrowdsale-balanceOf-address-[`PostDeliveryCrowdsale.balanceOf`]]
- :xref-PostDeliveryCrowdsale-balanceOf: xref:crowdsale.adoc#PostDeliveryCrowdsale-balanceOf-address-
- :PostDeliveryCrowdsale-_processPurchase: pass:normal[xref:crowdsale.adoc#PostDeliveryCrowdsale-_processPurchase-address-uint256-[`PostDeliveryCrowdsale._processPurchase`]]
- :xref-PostDeliveryCrowdsale-_processPurchase: xref:crowdsale.adoc#PostDeliveryCrowdsale-_processPurchase-address-uint256-
- :__unstable__TokenVault: pass:normal[xref:crowdsale.adoc#__unstable__TokenVault[`__unstable__TokenVault`]]
- :xref-__unstable__TokenVault: xref:crowdsale.adoc#__unstable__TokenVault
- :__unstable__TokenVault-transfer: pass:normal[xref:crowdsale.adoc#__unstable__TokenVault-transfer-contract-IERC20-address-uint256-[`__unstable__TokenVault.transfer`]]
- :xref-__unstable__TokenVault-transfer: xref:crowdsale.adoc#__unstable__TokenVault-transfer-contract-IERC20-address-uint256-
- :RefundableCrowdsale: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale[`RefundableCrowdsale`]]
- :xref-RefundableCrowdsale: xref:crowdsale.adoc#RefundableCrowdsale
- :RefundableCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-constructor-uint256-[`RefundableCrowdsale.constructor`]]
- :xref-RefundableCrowdsale-constructor: xref:crowdsale.adoc#RefundableCrowdsale-constructor-uint256-
- :RefundableCrowdsale-goal: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-goal--[`RefundableCrowdsale.goal`]]
- :xref-RefundableCrowdsale-goal: xref:crowdsale.adoc#RefundableCrowdsale-goal--
- :RefundableCrowdsale-claimRefund: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-claimRefund-address-payable-[`RefundableCrowdsale.claimRefund`]]
- :xref-RefundableCrowdsale-claimRefund: xref:crowdsale.adoc#RefundableCrowdsale-claimRefund-address-payable-
- :RefundableCrowdsale-goalReached: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-goalReached--[`RefundableCrowdsale.goalReached`]]
- :xref-RefundableCrowdsale-goalReached: xref:crowdsale.adoc#RefundableCrowdsale-goalReached--
- :RefundableCrowdsale-_finalization: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-_finalization--[`RefundableCrowdsale._finalization`]]
- :xref-RefundableCrowdsale-_finalization: xref:crowdsale.adoc#RefundableCrowdsale-_finalization--
- :RefundableCrowdsale-_forwardFunds: pass:normal[xref:crowdsale.adoc#RefundableCrowdsale-_forwardFunds--[`RefundableCrowdsale._forwardFunds`]]
- :xref-RefundableCrowdsale-_forwardFunds: xref:crowdsale.adoc#RefundableCrowdsale-_forwardFunds--
- :RefundablePostDeliveryCrowdsale: pass:normal[xref:crowdsale.adoc#RefundablePostDeliveryCrowdsale[`RefundablePostDeliveryCrowdsale`]]
- :xref-RefundablePostDeliveryCrowdsale: xref:crowdsale.adoc#RefundablePostDeliveryCrowdsale
- :RefundablePostDeliveryCrowdsale-withdrawTokens: pass:normal[xref:crowdsale.adoc#RefundablePostDeliveryCrowdsale-withdrawTokens-address-[`RefundablePostDeliveryCrowdsale.withdrawTokens`]]
- :xref-RefundablePostDeliveryCrowdsale-withdrawTokens: xref:crowdsale.adoc#RefundablePostDeliveryCrowdsale-withdrawTokens-address-
- :AllowanceCrowdsale: pass:normal[xref:crowdsale.adoc#AllowanceCrowdsale[`AllowanceCrowdsale`]]
- :xref-AllowanceCrowdsale: xref:crowdsale.adoc#AllowanceCrowdsale
- :AllowanceCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#AllowanceCrowdsale-constructor-address-[`AllowanceCrowdsale.constructor`]]
- :xref-AllowanceCrowdsale-constructor: xref:crowdsale.adoc#AllowanceCrowdsale-constructor-address-
- :AllowanceCrowdsale-tokenWallet: pass:normal[xref:crowdsale.adoc#AllowanceCrowdsale-tokenWallet--[`AllowanceCrowdsale.tokenWallet`]]
- :xref-AllowanceCrowdsale-tokenWallet: xref:crowdsale.adoc#AllowanceCrowdsale-tokenWallet--
- :AllowanceCrowdsale-remainingTokens: pass:normal[xref:crowdsale.adoc#AllowanceCrowdsale-remainingTokens--[`AllowanceCrowdsale.remainingTokens`]]
- :xref-AllowanceCrowdsale-remainingTokens: xref:crowdsale.adoc#AllowanceCrowdsale-remainingTokens--
- :AllowanceCrowdsale-_deliverTokens: pass:normal[xref:crowdsale.adoc#AllowanceCrowdsale-_deliverTokens-address-uint256-[`AllowanceCrowdsale._deliverTokens`]]
- :xref-AllowanceCrowdsale-_deliverTokens: xref:crowdsale.adoc#AllowanceCrowdsale-_deliverTokens-address-uint256-
- :MintedCrowdsale: pass:normal[xref:crowdsale.adoc#MintedCrowdsale[`MintedCrowdsale`]]
- :xref-MintedCrowdsale: xref:crowdsale.adoc#MintedCrowdsale
- :MintedCrowdsale-_deliverTokens: pass:normal[xref:crowdsale.adoc#MintedCrowdsale-_deliverTokens-address-uint256-[`MintedCrowdsale._deliverTokens`]]
- :xref-MintedCrowdsale-_deliverTokens: xref:crowdsale.adoc#MintedCrowdsale-_deliverTokens-address-uint256-
- :IncreasingPriceCrowdsale: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale[`IncreasingPriceCrowdsale`]]
- :xref-IncreasingPriceCrowdsale: xref:crowdsale.adoc#IncreasingPriceCrowdsale
- :IncreasingPriceCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-constructor-uint256-uint256-[`IncreasingPriceCrowdsale.constructor`]]
- :xref-IncreasingPriceCrowdsale-constructor: xref:crowdsale.adoc#IncreasingPriceCrowdsale-constructor-uint256-uint256-
- :IncreasingPriceCrowdsale-rate: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-rate--[`IncreasingPriceCrowdsale.rate`]]
- :xref-IncreasingPriceCrowdsale-rate: xref:crowdsale.adoc#IncreasingPriceCrowdsale-rate--
- :IncreasingPriceCrowdsale-initialRate: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-initialRate--[`IncreasingPriceCrowdsale.initialRate`]]
- :xref-IncreasingPriceCrowdsale-initialRate: xref:crowdsale.adoc#IncreasingPriceCrowdsale-initialRate--
- :IncreasingPriceCrowdsale-finalRate: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-finalRate--[`IncreasingPriceCrowdsale.finalRate`]]
- :xref-IncreasingPriceCrowdsale-finalRate: xref:crowdsale.adoc#IncreasingPriceCrowdsale-finalRate--
- :IncreasingPriceCrowdsale-getCurrentRate: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-getCurrentRate--[`IncreasingPriceCrowdsale.getCurrentRate`]]
- :xref-IncreasingPriceCrowdsale-getCurrentRate: xref:crowdsale.adoc#IncreasingPriceCrowdsale-getCurrentRate--
- :IncreasingPriceCrowdsale-_getTokenAmount: pass:normal[xref:crowdsale.adoc#IncreasingPriceCrowdsale-_getTokenAmount-uint256-[`IncreasingPriceCrowdsale._getTokenAmount`]]
- :xref-IncreasingPriceCrowdsale-_getTokenAmount: xref:crowdsale.adoc#IncreasingPriceCrowdsale-_getTokenAmount-uint256-
- :CappedCrowdsale: pass:normal[xref:crowdsale.adoc#CappedCrowdsale[`CappedCrowdsale`]]
- :xref-CappedCrowdsale: xref:crowdsale.adoc#CappedCrowdsale
- :CappedCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#CappedCrowdsale-constructor-uint256-[`CappedCrowdsale.constructor`]]
- :xref-CappedCrowdsale-constructor: xref:crowdsale.adoc#CappedCrowdsale-constructor-uint256-
- :CappedCrowdsale-cap: pass:normal[xref:crowdsale.adoc#CappedCrowdsale-cap--[`CappedCrowdsale.cap`]]
- :xref-CappedCrowdsale-cap: xref:crowdsale.adoc#CappedCrowdsale-cap--
- :CappedCrowdsale-capReached: pass:normal[xref:crowdsale.adoc#CappedCrowdsale-capReached--[`CappedCrowdsale.capReached`]]
- :xref-CappedCrowdsale-capReached: xref:crowdsale.adoc#CappedCrowdsale-capReached--
- :CappedCrowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#CappedCrowdsale-_preValidatePurchase-address-uint256-[`CappedCrowdsale._preValidatePurchase`]]
- :xref-CappedCrowdsale-_preValidatePurchase: xref:crowdsale.adoc#CappedCrowdsale-_preValidatePurchase-address-uint256-
- :IndividuallyCappedCrowdsale: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale[`IndividuallyCappedCrowdsale`]]
- :xref-IndividuallyCappedCrowdsale: xref:crowdsale.adoc#IndividuallyCappedCrowdsale
- :IndividuallyCappedCrowdsale-setCap: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale-setCap-address-uint256-[`IndividuallyCappedCrowdsale.setCap`]]
- :xref-IndividuallyCappedCrowdsale-setCap: xref:crowdsale.adoc#IndividuallyCappedCrowdsale-setCap-address-uint256-
- :IndividuallyCappedCrowdsale-getCap: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale-getCap-address-[`IndividuallyCappedCrowdsale.getCap`]]
- :xref-IndividuallyCappedCrowdsale-getCap: xref:crowdsale.adoc#IndividuallyCappedCrowdsale-getCap-address-
- :IndividuallyCappedCrowdsale-getContribution: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale-getContribution-address-[`IndividuallyCappedCrowdsale.getContribution`]]
- :xref-IndividuallyCappedCrowdsale-getContribution: xref:crowdsale.adoc#IndividuallyCappedCrowdsale-getContribution-address-
- :IndividuallyCappedCrowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale-_preValidatePurchase-address-uint256-[`IndividuallyCappedCrowdsale._preValidatePurchase`]]
- :xref-IndividuallyCappedCrowdsale-_preValidatePurchase: xref:crowdsale.adoc#IndividuallyCappedCrowdsale-_preValidatePurchase-address-uint256-
- :IndividuallyCappedCrowdsale-_updatePurchasingState: pass:normal[xref:crowdsale.adoc#IndividuallyCappedCrowdsale-_updatePurchasingState-address-uint256-[`IndividuallyCappedCrowdsale._updatePurchasingState`]]
- :xref-IndividuallyCappedCrowdsale-_updatePurchasingState: xref:crowdsale.adoc#IndividuallyCappedCrowdsale-_updatePurchasingState-address-uint256-
- :PausableCrowdsale: pass:normal[xref:crowdsale.adoc#PausableCrowdsale[`PausableCrowdsale`]]
- :xref-PausableCrowdsale: xref:crowdsale.adoc#PausableCrowdsale
- :PausableCrowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#PausableCrowdsale-_preValidatePurchase-address-uint256-[`PausableCrowdsale._preValidatePurchase`]]
- :xref-PausableCrowdsale-_preValidatePurchase: xref:crowdsale.adoc#PausableCrowdsale-_preValidatePurchase-address-uint256-
- :TimedCrowdsale: pass:normal[xref:crowdsale.adoc#TimedCrowdsale[`TimedCrowdsale`]]
- :xref-TimedCrowdsale: xref:crowdsale.adoc#TimedCrowdsale
- :TimedCrowdsale-onlyWhileOpen: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-onlyWhileOpen--[`TimedCrowdsale.onlyWhileOpen`]]
- :xref-TimedCrowdsale-onlyWhileOpen: xref:crowdsale.adoc#TimedCrowdsale-onlyWhileOpen--
- :TimedCrowdsale-constructor: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-constructor-uint256-uint256-[`TimedCrowdsale.constructor`]]
- :xref-TimedCrowdsale-constructor: xref:crowdsale.adoc#TimedCrowdsale-constructor-uint256-uint256-
- :TimedCrowdsale-openingTime: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-openingTime--[`TimedCrowdsale.openingTime`]]
- :xref-TimedCrowdsale-openingTime: xref:crowdsale.adoc#TimedCrowdsale-openingTime--
- :TimedCrowdsale-closingTime: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-closingTime--[`TimedCrowdsale.closingTime`]]
- :xref-TimedCrowdsale-closingTime: xref:crowdsale.adoc#TimedCrowdsale-closingTime--
- :TimedCrowdsale-isOpen: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-isOpen--[`TimedCrowdsale.isOpen`]]
- :xref-TimedCrowdsale-isOpen: xref:crowdsale.adoc#TimedCrowdsale-isOpen--
- :TimedCrowdsale-hasClosed: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-hasClosed--[`TimedCrowdsale.hasClosed`]]
- :xref-TimedCrowdsale-hasClosed: xref:crowdsale.adoc#TimedCrowdsale-hasClosed--
- :TimedCrowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-_preValidatePurchase-address-uint256-[`TimedCrowdsale._preValidatePurchase`]]
- :xref-TimedCrowdsale-_preValidatePurchase: xref:crowdsale.adoc#TimedCrowdsale-_preValidatePurchase-address-uint256-
- :TimedCrowdsale-_extendTime: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-_extendTime-uint256-[`TimedCrowdsale._extendTime`]]
- :xref-TimedCrowdsale-_extendTime: xref:crowdsale.adoc#TimedCrowdsale-_extendTime-uint256-
- :TimedCrowdsale-TimedCrowdsaleExtended: pass:normal[xref:crowdsale.adoc#TimedCrowdsale-TimedCrowdsaleExtended-uint256-uint256-[`TimedCrowdsale.TimedCrowdsaleExtended`]]
- :xref-TimedCrowdsale-TimedCrowdsaleExtended: xref:crowdsale.adoc#TimedCrowdsale-TimedCrowdsaleExtended-uint256-uint256-
- :WhitelistCrowdsale: pass:normal[xref:crowdsale.adoc#WhitelistCrowdsale[`WhitelistCrowdsale`]]
- :xref-WhitelistCrowdsale: xref:crowdsale.adoc#WhitelistCrowdsale
- :WhitelistCrowdsale-_preValidatePurchase: pass:normal[xref:crowdsale.adoc#WhitelistCrowdsale-_preValidatePurchase-address-uint256-[`WhitelistCrowdsale._preValidatePurchase`]]
- :xref-WhitelistCrowdsale-_preValidatePurchase: xref:crowdsale.adoc#WhitelistCrowdsale-_preValidatePurchase-address-uint256-
- :Counters: pass:normal[xref:drafts.adoc#Counters[`Counters`]]
- :xref-Counters: xref:drafts.adoc#Counters
- :Counters-current: pass:normal[xref:drafts.adoc#Counters-current-struct-Counters-Counter-[`Counters.current`]]
- :xref-Counters-current: xref:drafts.adoc#Counters-current-struct-Counters-Counter-
- :Counters-increment: pass:normal[xref:drafts.adoc#Counters-increment-struct-Counters-Counter-[`Counters.increment`]]
- :xref-Counters-increment: xref:drafts.adoc#Counters-increment-struct-Counters-Counter-
- :Counters-decrement: pass:normal[xref:drafts.adoc#Counters-decrement-struct-Counters-Counter-[`Counters.decrement`]]
- :xref-Counters-decrement: xref:drafts.adoc#Counters-decrement-struct-Counters-Counter-
- :ERC20Metadata: pass:normal[xref:drafts.adoc#ERC20Metadata[`ERC20Metadata`]]
- :xref-ERC20Metadata: xref:drafts.adoc#ERC20Metadata
- :ERC20Metadata-constructor: pass:normal[xref:drafts.adoc#ERC20Metadata-constructor-string-[`ERC20Metadata.constructor`]]
- :xref-ERC20Metadata-constructor: xref:drafts.adoc#ERC20Metadata-constructor-string-
- :ERC20Metadata-tokenURI: pass:normal[xref:drafts.adoc#ERC20Metadata-tokenURI--[`ERC20Metadata.tokenURI`]]
- :xref-ERC20Metadata-tokenURI: xref:drafts.adoc#ERC20Metadata-tokenURI--
- :ERC20Metadata-_setTokenURI: pass:normal[xref:drafts.adoc#ERC20Metadata-_setTokenURI-string-[`ERC20Metadata._setTokenURI`]]
- :xref-ERC20Metadata-_setTokenURI: xref:drafts.adoc#ERC20Metadata-_setTokenURI-string-
- :ERC20Migrator: pass:normal[xref:drafts.adoc#ERC20Migrator[`ERC20Migrator`]]
- :xref-ERC20Migrator: xref:drafts.adoc#ERC20Migrator
- :ERC20Migrator-constructor: pass:normal[xref:drafts.adoc#ERC20Migrator-constructor-contract-IERC20-[`ERC20Migrator.constructor`]]
- :xref-ERC20Migrator-constructor: xref:drafts.adoc#ERC20Migrator-constructor-contract-IERC20-
- :ERC20Migrator-legacyToken: pass:normal[xref:drafts.adoc#ERC20Migrator-legacyToken--[`ERC20Migrator.legacyToken`]]
- :xref-ERC20Migrator-legacyToken: xref:drafts.adoc#ERC20Migrator-legacyToken--
- :ERC20Migrator-newToken: pass:normal[xref:drafts.adoc#ERC20Migrator-newToken--[`ERC20Migrator.newToken`]]
- :xref-ERC20Migrator-newToken: xref:drafts.adoc#ERC20Migrator-newToken--
- :ERC20Migrator-beginMigration: pass:normal[xref:drafts.adoc#ERC20Migrator-beginMigration-contract-ERC20Mintable-[`ERC20Migrator.beginMigration`]]
- :xref-ERC20Migrator-beginMigration: xref:drafts.adoc#ERC20Migrator-beginMigration-contract-ERC20Mintable-
- :ERC20Migrator-migrate: pass:normal[xref:drafts.adoc#ERC20Migrator-migrate-address-uint256-[`ERC20Migrator.migrate`]]
- :xref-ERC20Migrator-migrate: xref:drafts.adoc#ERC20Migrator-migrate-address-uint256-
- :ERC20Migrator-migrateAll: pass:normal[xref:drafts.adoc#ERC20Migrator-migrateAll-address-[`ERC20Migrator.migrateAll`]]
- :xref-ERC20Migrator-migrateAll: xref:drafts.adoc#ERC20Migrator-migrateAll-address-
- :ERC20Snapshot: pass:normal[xref:drafts.adoc#ERC20Snapshot[`ERC20Snapshot`]]
- :xref-ERC20Snapshot: xref:drafts.adoc#ERC20Snapshot
- :ERC20Snapshot-snapshot: pass:normal[xref:drafts.adoc#ERC20Snapshot-snapshot--[`ERC20Snapshot.snapshot`]]
- :xref-ERC20Snapshot-snapshot: xref:drafts.adoc#ERC20Snapshot-snapshot--
- :ERC20Snapshot-balanceOfAt: pass:normal[xref:drafts.adoc#ERC20Snapshot-balanceOfAt-address-uint256-[`ERC20Snapshot.balanceOfAt`]]
- :xref-ERC20Snapshot-balanceOfAt: xref:drafts.adoc#ERC20Snapshot-balanceOfAt-address-uint256-
- :ERC20Snapshot-totalSupplyAt: pass:normal[xref:drafts.adoc#ERC20Snapshot-totalSupplyAt-uint256-[`ERC20Snapshot.totalSupplyAt`]]
- :xref-ERC20Snapshot-totalSupplyAt: xref:drafts.adoc#ERC20Snapshot-totalSupplyAt-uint256-
- :ERC20Snapshot-_transfer: pass:normal[xref:drafts.adoc#ERC20Snapshot-_transfer-address-address-uint256-[`ERC20Snapshot._transfer`]]
- :xref-ERC20Snapshot-_transfer: xref:drafts.adoc#ERC20Snapshot-_transfer-address-address-uint256-
- :ERC20Snapshot-_mint: pass:normal[xref:drafts.adoc#ERC20Snapshot-_mint-address-uint256-[`ERC20Snapshot._mint`]]
- :xref-ERC20Snapshot-_mint: xref:drafts.adoc#ERC20Snapshot-_mint-address-uint256-
- :ERC20Snapshot-_burn: pass:normal[xref:drafts.adoc#ERC20Snapshot-_burn-address-uint256-[`ERC20Snapshot._burn`]]
- :xref-ERC20Snapshot-_burn: xref:drafts.adoc#ERC20Snapshot-_burn-address-uint256-
- :ERC20Snapshot-Snapshot: pass:normal[xref:drafts.adoc#ERC20Snapshot-Snapshot-uint256-[`ERC20Snapshot.Snapshot`]]
- :xref-ERC20Snapshot-Snapshot: xref:drafts.adoc#ERC20Snapshot-Snapshot-uint256-
- :SignedSafeMath: pass:normal[xref:drafts.adoc#SignedSafeMath[`SignedSafeMath`]]
- :xref-SignedSafeMath: xref:drafts.adoc#SignedSafeMath
- :SignedSafeMath-mul: pass:normal[xref:drafts.adoc#SignedSafeMath-mul-int256-int256-[`SignedSafeMath.mul`]]
- :xref-SignedSafeMath-mul: xref:drafts.adoc#SignedSafeMath-mul-int256-int256-
- :SignedSafeMath-div: pass:normal[xref:drafts.adoc#SignedSafeMath-div-int256-int256-[`SignedSafeMath.div`]]
- :xref-SignedSafeMath-div: xref:drafts.adoc#SignedSafeMath-div-int256-int256-
- :SignedSafeMath-sub: pass:normal[xref:drafts.adoc#SignedSafeMath-sub-int256-int256-[`SignedSafeMath.sub`]]
- :xref-SignedSafeMath-sub: xref:drafts.adoc#SignedSafeMath-sub-int256-int256-
- :SignedSafeMath-add: pass:normal[xref:drafts.adoc#SignedSafeMath-add-int256-int256-[`SignedSafeMath.add`]]
- :xref-SignedSafeMath-add: xref:drafts.adoc#SignedSafeMath-add-int256-int256-
- :Strings: pass:normal[xref:drafts.adoc#Strings[`Strings`]]
- :xref-Strings: xref:drafts.adoc#Strings
- :Strings-fromUint256: pass:normal[xref:drafts.adoc#Strings-fromUint256-uint256-[`Strings.fromUint256`]]
- :xref-Strings-fromUint256: xref:drafts.adoc#Strings-fromUint256-uint256-
- :TokenVesting: pass:normal[xref:drafts.adoc#TokenVesting[`TokenVesting`]]
- :xref-TokenVesting: xref:drafts.adoc#TokenVesting
- :TokenVesting-constructor: pass:normal[xref:drafts.adoc#TokenVesting-constructor-address-uint256-uint256-uint256-bool-[`TokenVesting.constructor`]]
- :xref-TokenVesting-constructor: xref:drafts.adoc#TokenVesting-constructor-address-uint256-uint256-uint256-bool-
- :TokenVesting-beneficiary: pass:normal[xref:drafts.adoc#TokenVesting-beneficiary--[`TokenVesting.beneficiary`]]
- :xref-TokenVesting-beneficiary: xref:drafts.adoc#TokenVesting-beneficiary--
- :TokenVesting-cliff: pass:normal[xref:drafts.adoc#TokenVesting-cliff--[`TokenVesting.cliff`]]
- :xref-TokenVesting-cliff: xref:drafts.adoc#TokenVesting-cliff--
- :TokenVesting-start: pass:normal[xref:drafts.adoc#TokenVesting-start--[`TokenVesting.start`]]
- :xref-TokenVesting-start: xref:drafts.adoc#TokenVesting-start--
- :TokenVesting-duration: pass:normal[xref:drafts.adoc#TokenVesting-duration--[`TokenVesting.duration`]]
- :xref-TokenVesting-duration: xref:drafts.adoc#TokenVesting-duration--
- :TokenVesting-revocable: pass:normal[xref:drafts.adoc#TokenVesting-revocable--[`TokenVesting.revocable`]]
- :xref-TokenVesting-revocable: xref:drafts.adoc#TokenVesting-revocable--
- :TokenVesting-released: pass:normal[xref:drafts.adoc#TokenVesting-released-address-[`TokenVesting.released`]]
- :xref-TokenVesting-released: xref:drafts.adoc#TokenVesting-released-address-
- :TokenVesting-revoked: pass:normal[xref:drafts.adoc#TokenVesting-revoked-address-[`TokenVesting.revoked`]]
- :xref-TokenVesting-revoked: xref:drafts.adoc#TokenVesting-revoked-address-
- :TokenVesting-release: pass:normal[xref:drafts.adoc#TokenVesting-release-contract-IERC20-[`TokenVesting.release`]]
- :xref-TokenVesting-release: xref:drafts.adoc#TokenVesting-release-contract-IERC20-
- :TokenVesting-revoke: pass:normal[xref:drafts.adoc#TokenVesting-revoke-contract-IERC20-[`TokenVesting.revoke`]]
- :xref-TokenVesting-revoke: xref:drafts.adoc#TokenVesting-revoke-contract-IERC20-
- :TokenVesting-TokensReleased: pass:normal[xref:drafts.adoc#TokenVesting-TokensReleased-address-uint256-[`TokenVesting.TokensReleased`]]
- :xref-TokenVesting-TokensReleased: xref:drafts.adoc#TokenVesting-TokensReleased-address-uint256-
- :TokenVesting-TokenVestingRevoked: pass:normal[xref:drafts.adoc#TokenVesting-TokenVestingRevoked-address-[`TokenVesting.TokenVestingRevoked`]]
- :xref-TokenVesting-TokenVestingRevoked: xref:drafts.adoc#TokenVesting-TokenVestingRevoked-address-
- :Roles: pass:normal[xref:access.adoc#Roles[`Roles`]]
- :xref-Roles: xref:access.adoc#Roles
- :Roles-add: pass:normal[xref:access.adoc#Roles-add-struct-Roles-Role-address-[`Roles.add`]]
- :xref-Roles-add: xref:access.adoc#Roles-add-struct-Roles-Role-address-
- :Roles-remove: pass:normal[xref:access.adoc#Roles-remove-struct-Roles-Role-address-[`Roles.remove`]]
- :xref-Roles-remove: xref:access.adoc#Roles-remove-struct-Roles-Role-address-
- :Roles-has: pass:normal[xref:access.adoc#Roles-has-struct-Roles-Role-address-[`Roles.has`]]
- :xref-Roles-has: xref:access.adoc#Roles-has-struct-Roles-Role-address-
- :CapperRole: pass:normal[xref:access.adoc#CapperRole[`CapperRole`]]
- :xref-CapperRole: xref:access.adoc#CapperRole
- :CapperRole-onlyCapper: pass:normal[xref:access.adoc#CapperRole-onlyCapper--[`CapperRole.onlyCapper`]]
- :xref-CapperRole-onlyCapper: xref:access.adoc#CapperRole-onlyCapper--
- :CapperRole-constructor: pass:normal[xref:access.adoc#CapperRole-constructor--[`CapperRole.constructor`]]
- :xref-CapperRole-constructor: xref:access.adoc#CapperRole-constructor--
- :CapperRole-isCapper: pass:normal[xref:access.adoc#CapperRole-isCapper-address-[`CapperRole.isCapper`]]
- :xref-CapperRole-isCapper: xref:access.adoc#CapperRole-isCapper-address-
- :CapperRole-addCapper: pass:normal[xref:access.adoc#CapperRole-addCapper-address-[`CapperRole.addCapper`]]
- :xref-CapperRole-addCapper: xref:access.adoc#CapperRole-addCapper-address-
- :CapperRole-renounceCapper: pass:normal[xref:access.adoc#CapperRole-renounceCapper--[`CapperRole.renounceCapper`]]
- :xref-CapperRole-renounceCapper: xref:access.adoc#CapperRole-renounceCapper--
- :CapperRole-_addCapper: pass:normal[xref:access.adoc#CapperRole-_addCapper-address-[`CapperRole._addCapper`]]
- :xref-CapperRole-_addCapper: xref:access.adoc#CapperRole-_addCapper-address-
- :CapperRole-_removeCapper: pass:normal[xref:access.adoc#CapperRole-_removeCapper-address-[`CapperRole._removeCapper`]]
- :xref-CapperRole-_removeCapper: xref:access.adoc#CapperRole-_removeCapper-address-
- :CapperRole-CapperAdded: pass:normal[xref:access.adoc#CapperRole-CapperAdded-address-[`CapperRole.CapperAdded`]]
- :xref-CapperRole-CapperAdded: xref:access.adoc#CapperRole-CapperAdded-address-
- :CapperRole-CapperRemoved: pass:normal[xref:access.adoc#CapperRole-CapperRemoved-address-[`CapperRole.CapperRemoved`]]
- :xref-CapperRole-CapperRemoved: xref:access.adoc#CapperRole-CapperRemoved-address-
- :MinterRole: pass:normal[xref:access.adoc#MinterRole[`MinterRole`]]
- :xref-MinterRole: xref:access.adoc#MinterRole
- :MinterRole-onlyMinter: pass:normal[xref:access.adoc#MinterRole-onlyMinter--[`MinterRole.onlyMinter`]]
- :xref-MinterRole-onlyMinter: xref:access.adoc#MinterRole-onlyMinter--
- :MinterRole-constructor: pass:normal[xref:access.adoc#MinterRole-constructor--[`MinterRole.constructor`]]
- :xref-MinterRole-constructor: xref:access.adoc#MinterRole-constructor--
- :MinterRole-isMinter: pass:normal[xref:access.adoc#MinterRole-isMinter-address-[`MinterRole.isMinter`]]
- :xref-MinterRole-isMinter: xref:access.adoc#MinterRole-isMinter-address-
- :MinterRole-addMinter: pass:normal[xref:access.adoc#MinterRole-addMinter-address-[`MinterRole.addMinter`]]
- :xref-MinterRole-addMinter: xref:access.adoc#MinterRole-addMinter-address-
- :MinterRole-renounceMinter: pass:normal[xref:access.adoc#MinterRole-renounceMinter--[`MinterRole.renounceMinter`]]
- :xref-MinterRole-renounceMinter: xref:access.adoc#MinterRole-renounceMinter--
- :MinterRole-_addMinter: pass:normal[xref:access.adoc#MinterRole-_addMinter-address-[`MinterRole._addMinter`]]
- :xref-MinterRole-_addMinter: xref:access.adoc#MinterRole-_addMinter-address-
- :MinterRole-_removeMinter: pass:normal[xref:access.adoc#MinterRole-_removeMinter-address-[`MinterRole._removeMinter`]]
- :xref-MinterRole-_removeMinter: xref:access.adoc#MinterRole-_removeMinter-address-
- :MinterRole-MinterAdded: pass:normal[xref:access.adoc#MinterRole-MinterAdded-address-[`MinterRole.MinterAdded`]]
- :xref-MinterRole-MinterAdded: xref:access.adoc#MinterRole-MinterAdded-address-
- :MinterRole-MinterRemoved: pass:normal[xref:access.adoc#MinterRole-MinterRemoved-address-[`MinterRole.MinterRemoved`]]
- :xref-MinterRole-MinterRemoved: xref:access.adoc#MinterRole-MinterRemoved-address-
- :PauserRole: pass:normal[xref:access.adoc#PauserRole[`PauserRole`]]
- :xref-PauserRole: xref:access.adoc#PauserRole
- :PauserRole-onlyPauser: pass:normal[xref:access.adoc#PauserRole-onlyPauser--[`PauserRole.onlyPauser`]]
- :xref-PauserRole-onlyPauser: xref:access.adoc#PauserRole-onlyPauser--
- :PauserRole-constructor: pass:normal[xref:access.adoc#PauserRole-constructor--[`PauserRole.constructor`]]
- :xref-PauserRole-constructor: xref:access.adoc#PauserRole-constructor--
- :PauserRole-isPauser: pass:normal[xref:access.adoc#PauserRole-isPauser-address-[`PauserRole.isPauser`]]
- :xref-PauserRole-isPauser: xref:access.adoc#PauserRole-isPauser-address-
- :PauserRole-addPauser: pass:normal[xref:access.adoc#PauserRole-addPauser-address-[`PauserRole.addPauser`]]
- :xref-PauserRole-addPauser: xref:access.adoc#PauserRole-addPauser-address-
- :PauserRole-renouncePauser: pass:normal[xref:access.adoc#PauserRole-renouncePauser--[`PauserRole.renouncePauser`]]
- :xref-PauserRole-renouncePauser: xref:access.adoc#PauserRole-renouncePauser--
- :PauserRole-_addPauser: pass:normal[xref:access.adoc#PauserRole-_addPauser-address-[`PauserRole._addPauser`]]
- :xref-PauserRole-_addPauser: xref:access.adoc#PauserRole-_addPauser-address-
- :PauserRole-_removePauser: pass:normal[xref:access.adoc#PauserRole-_removePauser-address-[`PauserRole._removePauser`]]
- :xref-PauserRole-_removePauser: xref:access.adoc#PauserRole-_removePauser-address-
- :PauserRole-PauserAdded: pass:normal[xref:access.adoc#PauserRole-PauserAdded-address-[`PauserRole.PauserAdded`]]
- :xref-PauserRole-PauserAdded: xref:access.adoc#PauserRole-PauserAdded-address-
- :PauserRole-PauserRemoved: pass:normal[xref:access.adoc#PauserRole-PauserRemoved-address-[`PauserRole.PauserRemoved`]]
- :xref-PauserRole-PauserRemoved: xref:access.adoc#PauserRole-PauserRemoved-address-
- :SignerRole: pass:normal[xref:access.adoc#SignerRole[`SignerRole`]]
- :xref-SignerRole: xref:access.adoc#SignerRole
- :SignerRole-onlySigner: pass:normal[xref:access.adoc#SignerRole-onlySigner--[`SignerRole.onlySigner`]]
- :xref-SignerRole-onlySigner: xref:access.adoc#SignerRole-onlySigner--
- :SignerRole-constructor: pass:normal[xref:access.adoc#SignerRole-constructor--[`SignerRole.constructor`]]
- :xref-SignerRole-constructor: xref:access.adoc#SignerRole-constructor--
- :SignerRole-isSigner: pass:normal[xref:access.adoc#SignerRole-isSigner-address-[`SignerRole.isSigner`]]
- :xref-SignerRole-isSigner: xref:access.adoc#SignerRole-isSigner-address-
- :SignerRole-addSigner: pass:normal[xref:access.adoc#SignerRole-addSigner-address-[`SignerRole.addSigner`]]
- :xref-SignerRole-addSigner: xref:access.adoc#SignerRole-addSigner-address-
- :SignerRole-renounceSigner: pass:normal[xref:access.adoc#SignerRole-renounceSigner--[`SignerRole.renounceSigner`]]
- :xref-SignerRole-renounceSigner: xref:access.adoc#SignerRole-renounceSigner--
- :SignerRole-_addSigner: pass:normal[xref:access.adoc#SignerRole-_addSigner-address-[`SignerRole._addSigner`]]
- :xref-SignerRole-_addSigner: xref:access.adoc#SignerRole-_addSigner-address-
- :SignerRole-_removeSigner: pass:normal[xref:access.adoc#SignerRole-_removeSigner-address-[`SignerRole._removeSigner`]]
- :xref-SignerRole-_removeSigner: xref:access.adoc#SignerRole-_removeSigner-address-
- :SignerRole-SignerAdded: pass:normal[xref:access.adoc#SignerRole-SignerAdded-address-[`SignerRole.SignerAdded`]]
- :xref-SignerRole-SignerAdded: xref:access.adoc#SignerRole-SignerAdded-address-
- :SignerRole-SignerRemoved: pass:normal[xref:access.adoc#SignerRole-SignerRemoved-address-[`SignerRole.SignerRemoved`]]
- :xref-SignerRole-SignerRemoved: xref:access.adoc#SignerRole-SignerRemoved-address-
- :WhitelistAdminRole: pass:normal[xref:access.adoc#WhitelistAdminRole[`WhitelistAdminRole`]]
- :xref-WhitelistAdminRole: xref:access.adoc#WhitelistAdminRole
- :WhitelistAdminRole-onlyWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-onlyWhitelistAdmin--[`WhitelistAdminRole.onlyWhitelistAdmin`]]
- :xref-WhitelistAdminRole-onlyWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-onlyWhitelistAdmin--
- :WhitelistAdminRole-constructor: pass:normal[xref:access.adoc#WhitelistAdminRole-constructor--[`WhitelistAdminRole.constructor`]]
- :xref-WhitelistAdminRole-constructor: xref:access.adoc#WhitelistAdminRole-constructor--
- :WhitelistAdminRole-isWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-isWhitelistAdmin-address-[`WhitelistAdminRole.isWhitelistAdmin`]]
- :xref-WhitelistAdminRole-isWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-isWhitelistAdmin-address-
- :WhitelistAdminRole-addWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-addWhitelistAdmin-address-[`WhitelistAdminRole.addWhitelistAdmin`]]
- :xref-WhitelistAdminRole-addWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-addWhitelistAdmin-address-
- :WhitelistAdminRole-renounceWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-renounceWhitelistAdmin--[`WhitelistAdminRole.renounceWhitelistAdmin`]]
- :xref-WhitelistAdminRole-renounceWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-renounceWhitelistAdmin--
- :WhitelistAdminRole-_addWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-_addWhitelistAdmin-address-[`WhitelistAdminRole._addWhitelistAdmin`]]
- :xref-WhitelistAdminRole-_addWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-_addWhitelistAdmin-address-
- :WhitelistAdminRole-_removeWhitelistAdmin: pass:normal[xref:access.adoc#WhitelistAdminRole-_removeWhitelistAdmin-address-[`WhitelistAdminRole._removeWhitelistAdmin`]]
- :xref-WhitelistAdminRole-_removeWhitelistAdmin: xref:access.adoc#WhitelistAdminRole-_removeWhitelistAdmin-address-
- :WhitelistAdminRole-WhitelistAdminAdded: pass:normal[xref:access.adoc#WhitelistAdminRole-WhitelistAdminAdded-address-[`WhitelistAdminRole.WhitelistAdminAdded`]]
- :xref-WhitelistAdminRole-WhitelistAdminAdded: xref:access.adoc#WhitelistAdminRole-WhitelistAdminAdded-address-
- :WhitelistAdminRole-WhitelistAdminRemoved: pass:normal[xref:access.adoc#WhitelistAdminRole-WhitelistAdminRemoved-address-[`WhitelistAdminRole.WhitelistAdminRemoved`]]
- :xref-WhitelistAdminRole-WhitelistAdminRemoved: xref:access.adoc#WhitelistAdminRole-WhitelistAdminRemoved-address-
- :WhitelistedRole: pass:normal[xref:access.adoc#WhitelistedRole[`WhitelistedRole`]]
- :xref-WhitelistedRole: xref:access.adoc#WhitelistedRole
- :WhitelistedRole-onlyWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-onlyWhitelisted--[`WhitelistedRole.onlyWhitelisted`]]
- :xref-WhitelistedRole-onlyWhitelisted: xref:access.adoc#WhitelistedRole-onlyWhitelisted--
- :WhitelistedRole-isWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-isWhitelisted-address-[`WhitelistedRole.isWhitelisted`]]
- :xref-WhitelistedRole-isWhitelisted: xref:access.adoc#WhitelistedRole-isWhitelisted-address-
- :WhitelistedRole-addWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-addWhitelisted-address-[`WhitelistedRole.addWhitelisted`]]
- :xref-WhitelistedRole-addWhitelisted: xref:access.adoc#WhitelistedRole-addWhitelisted-address-
- :WhitelistedRole-removeWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-removeWhitelisted-address-[`WhitelistedRole.removeWhitelisted`]]
- :xref-WhitelistedRole-removeWhitelisted: xref:access.adoc#WhitelistedRole-removeWhitelisted-address-
- :WhitelistedRole-renounceWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-renounceWhitelisted--[`WhitelistedRole.renounceWhitelisted`]]
- :xref-WhitelistedRole-renounceWhitelisted: xref:access.adoc#WhitelistedRole-renounceWhitelisted--
- :WhitelistedRole-_addWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-_addWhitelisted-address-[`WhitelistedRole._addWhitelisted`]]
- :xref-WhitelistedRole-_addWhitelisted: xref:access.adoc#WhitelistedRole-_addWhitelisted-address-
- :WhitelistedRole-_removeWhitelisted: pass:normal[xref:access.adoc#WhitelistedRole-_removeWhitelisted-address-[`WhitelistedRole._removeWhitelisted`]]
- :xref-WhitelistedRole-_removeWhitelisted: xref:access.adoc#WhitelistedRole-_removeWhitelisted-address-
- :WhitelistedRole-WhitelistedAdded: pass:normal[xref:access.adoc#WhitelistedRole-WhitelistedAdded-address-[`WhitelistedRole.WhitelistedAdded`]]
- :xref-WhitelistedRole-WhitelistedAdded: xref:access.adoc#WhitelistedRole-WhitelistedAdded-address-
- :WhitelistedRole-WhitelistedRemoved: pass:normal[xref:access.adoc#WhitelistedRole-WhitelistedRemoved-address-[`WhitelistedRole.WhitelistedRemoved`]]
- :xref-WhitelistedRole-WhitelistedRemoved: xref:access.adoc#WhitelistedRole-WhitelistedRemoved-address-
- :ECDSA: pass:normal[xref:cryptography.adoc#ECDSA[`ECDSA`]]
- :xref-ECDSA: xref:cryptography.adoc#ECDSA
- :ECDSA-recover: pass:normal[xref:cryptography.adoc#ECDSA-recover-bytes32-bytes-[`ECDSA.recover`]]
- :xref-ECDSA-recover: xref:cryptography.adoc#ECDSA-recover-bytes32-bytes-
- :ECDSA-toEthSignedMessageHash: pass:normal[xref:cryptography.adoc#ECDSA-toEthSignedMessageHash-bytes32-[`ECDSA.toEthSignedMessageHash`]]
- :xref-ECDSA-toEthSignedMessageHash: xref:cryptography.adoc#ECDSA-toEthSignedMessageHash-bytes32-
- :MerkleProof: pass:normal[xref:cryptography.adoc#MerkleProof[`MerkleProof`]]
- :xref-MerkleProof: xref:cryptography.adoc#MerkleProof
- :MerkleProof-verify: pass:normal[xref:cryptography.adoc#MerkleProof-verify-bytes32---bytes32-bytes32-[`MerkleProof.verify`]]
- :xref-MerkleProof-verify: xref:cryptography.adoc#MerkleProof-verify-bytes32---bytes32-bytes32-
- :ERC165: pass:normal[xref:introspection.adoc#ERC165[`ERC165`]]
- :xref-ERC165: xref:introspection.adoc#ERC165
- :ERC165-constructor: pass:normal[xref:introspection.adoc#ERC165-constructor--[`ERC165.constructor`]]
- :xref-ERC165-constructor: xref:introspection.adoc#ERC165-constructor--
- :ERC165-supportsInterface: pass:normal[xref:introspection.adoc#ERC165-supportsInterface-bytes4-[`ERC165.supportsInterface`]]
- :xref-ERC165-supportsInterface: xref:introspection.adoc#ERC165-supportsInterface-bytes4-
- :ERC165-_registerInterface: pass:normal[xref:introspection.adoc#ERC165-_registerInterface-bytes4-[`ERC165._registerInterface`]]
- :xref-ERC165-_registerInterface: xref:introspection.adoc#ERC165-_registerInterface-bytes4-
- :ERC165Checker: pass:normal[xref:introspection.adoc#ERC165Checker[`ERC165Checker`]]
- :xref-ERC165Checker: xref:introspection.adoc#ERC165Checker
- :ERC165Checker-_supportsERC165: pass:normal[xref:introspection.adoc#ERC165Checker-_supportsERC165-address-[`ERC165Checker._supportsERC165`]]
- :xref-ERC165Checker-_supportsERC165: xref:introspection.adoc#ERC165Checker-_supportsERC165-address-
- :ERC165Checker-_supportsInterface: pass:normal[xref:introspection.adoc#ERC165Checker-_supportsInterface-address-bytes4-[`ERC165Checker._supportsInterface`]]
- :xref-ERC165Checker-_supportsInterface: xref:introspection.adoc#ERC165Checker-_supportsInterface-address-bytes4-
- :ERC165Checker-_supportsAllInterfaces: pass:normal[xref:introspection.adoc#ERC165Checker-_supportsAllInterfaces-address-bytes4---[`ERC165Checker._supportsAllInterfaces`]]
- :xref-ERC165Checker-_supportsAllInterfaces: xref:introspection.adoc#ERC165Checker-_supportsAllInterfaces-address-bytes4---
- :ERC1820Implementer: pass:normal[xref:introspection.adoc#ERC1820Implementer[`ERC1820Implementer`]]
- :xref-ERC1820Implementer: xref:introspection.adoc#ERC1820Implementer
- :ERC1820Implementer-canImplementInterfaceForAddress: pass:normal[xref:introspection.adoc#ERC1820Implementer-canImplementInterfaceForAddress-bytes32-address-[`ERC1820Implementer.canImplementInterfaceForAddress`]]
- :xref-ERC1820Implementer-canImplementInterfaceForAddress: xref:introspection.adoc#ERC1820Implementer-canImplementInterfaceForAddress-bytes32-address-
- :ERC1820Implementer-_registerInterfaceForAddress: pass:normal[xref:introspection.adoc#ERC1820Implementer-_registerInterfaceForAddress-bytes32-address-[`ERC1820Implementer._registerInterfaceForAddress`]]
- :xref-ERC1820Implementer-_registerInterfaceForAddress: xref:introspection.adoc#ERC1820Implementer-_registerInterfaceForAddress-bytes32-address-
- :IERC165: pass:normal[xref:introspection.adoc#IERC165[`IERC165`]]
- :xref-IERC165: xref:introspection.adoc#IERC165
- :IERC165-supportsInterface: pass:normal[xref:introspection.adoc#IERC165-supportsInterface-bytes4-[`IERC165.supportsInterface`]]
- :xref-IERC165-supportsInterface: xref:introspection.adoc#IERC165-supportsInterface-bytes4-
- :IERC1820Implementer: pass:normal[xref:introspection.adoc#IERC1820Implementer[`IERC1820Implementer`]]
- :xref-IERC1820Implementer: xref:introspection.adoc#IERC1820Implementer
- :IERC1820Implementer-canImplementInterfaceForAddress: pass:normal[xref:introspection.adoc#IERC1820Implementer-canImplementInterfaceForAddress-bytes32-address-[`IERC1820Implementer.canImplementInterfaceForAddress`]]
- :xref-IERC1820Implementer-canImplementInterfaceForAddress: xref:introspection.adoc#IERC1820Implementer-canImplementInterfaceForAddress-bytes32-address-
- :IERC1820Registry: pass:normal[xref:introspection.adoc#IERC1820Registry[`IERC1820Registry`]]
- :xref-IERC1820Registry: xref:introspection.adoc#IERC1820Registry
- :IERC1820Registry-setManager: pass:normal[xref:introspection.adoc#IERC1820Registry-setManager-address-address-[`IERC1820Registry.setManager`]]
- :xref-IERC1820Registry-setManager: xref:introspection.adoc#IERC1820Registry-setManager-address-address-
- :IERC1820Registry-getManager: pass:normal[xref:introspection.adoc#IERC1820Registry-getManager-address-[`IERC1820Registry.getManager`]]
- :xref-IERC1820Registry-getManager: xref:introspection.adoc#IERC1820Registry-getManager-address-
- :IERC1820Registry-setInterfaceImplementer: pass:normal[xref:introspection.adoc#IERC1820Registry-setInterfaceImplementer-address-bytes32-address-[`IERC1820Registry.setInterfaceImplementer`]]
- :xref-IERC1820Registry-setInterfaceImplementer: xref:introspection.adoc#IERC1820Registry-setInterfaceImplementer-address-bytes32-address-
- :IERC1820Registry-getInterfaceImplementer: pass:normal[xref:introspection.adoc#IERC1820Registry-getInterfaceImplementer-address-bytes32-[`IERC1820Registry.getInterfaceImplementer`]]
- :xref-IERC1820Registry-getInterfaceImplementer: xref:introspection.adoc#IERC1820Registry-getInterfaceImplementer-address-bytes32-
- :IERC1820Registry-interfaceHash: pass:normal[xref:introspection.adoc#IERC1820Registry-interfaceHash-string-[`IERC1820Registry.interfaceHash`]]
- :xref-IERC1820Registry-interfaceHash: xref:introspection.adoc#IERC1820Registry-interfaceHash-string-
- :IERC1820Registry-updateERC165Cache: pass:normal[xref:introspection.adoc#IERC1820Registry-updateERC165Cache-address-bytes4-[`IERC1820Registry.updateERC165Cache`]]
- :xref-IERC1820Registry-updateERC165Cache: xref:introspection.adoc#IERC1820Registry-updateERC165Cache-address-bytes4-
- :IERC1820Registry-implementsERC165Interface: pass:normal[xref:introspection.adoc#IERC1820Registry-implementsERC165Interface-address-bytes4-[`IERC1820Registry.implementsERC165Interface`]]
- :xref-IERC1820Registry-implementsERC165Interface: xref:introspection.adoc#IERC1820Registry-implementsERC165Interface-address-bytes4-
- :IERC1820Registry-implementsERC165InterfaceNoCache: pass:normal[xref:introspection.adoc#IERC1820Registry-implementsERC165InterfaceNoCache-address-bytes4-[`IERC1820Registry.implementsERC165InterfaceNoCache`]]
- :xref-IERC1820Registry-implementsERC165InterfaceNoCache: xref:introspection.adoc#IERC1820Registry-implementsERC165InterfaceNoCache-address-bytes4-
- :IERC1820Registry-InterfaceImplementerSet: pass:normal[xref:introspection.adoc#IERC1820Registry-InterfaceImplementerSet-address-bytes32-address-[`IERC1820Registry.InterfaceImplementerSet`]]
- :xref-IERC1820Registry-InterfaceImplementerSet: xref:introspection.adoc#IERC1820Registry-InterfaceImplementerSet-address-bytes32-address-
- :IERC1820Registry-ManagerChanged: pass:normal[xref:introspection.adoc#IERC1820Registry-ManagerChanged-address-address-[`IERC1820Registry.ManagerChanged`]]
- :xref-IERC1820Registry-ManagerChanged: xref:introspection.adoc#IERC1820Registry-ManagerChanged-address-address-
- :Pausable: pass:normal[xref:lifecycle.adoc#Pausable[`Pausable`]]
- :xref-Pausable: xref:lifecycle.adoc#Pausable
- :Pausable-whenNotPaused: pass:normal[xref:lifecycle.adoc#Pausable-whenNotPaused--[`Pausable.whenNotPaused`]]
- :xref-Pausable-whenNotPaused: xref:lifecycle.adoc#Pausable-whenNotPaused--
- :Pausable-whenPaused: pass:normal[xref:lifecycle.adoc#Pausable-whenPaused--[`Pausable.whenPaused`]]
- :xref-Pausable-whenPaused: xref:lifecycle.adoc#Pausable-whenPaused--
- :Pausable-constructor: pass:normal[xref:lifecycle.adoc#Pausable-constructor--[`Pausable.constructor`]]
- :xref-Pausable-constructor: xref:lifecycle.adoc#Pausable-constructor--
- :Pausable-paused: pass:normal[xref:lifecycle.adoc#Pausable-paused--[`Pausable.paused`]]
- :xref-Pausable-paused: xref:lifecycle.adoc#Pausable-paused--
- :Pausable-pause: pass:normal[xref:lifecycle.adoc#Pausable-pause--[`Pausable.pause`]]
- :xref-Pausable-pause: xref:lifecycle.adoc#Pausable-pause--
- :Pausable-unpause: pass:normal[xref:lifecycle.adoc#Pausable-unpause--[`Pausable.unpause`]]
- :xref-Pausable-unpause: xref:lifecycle.adoc#Pausable-unpause--
- :Pausable-Paused: pass:normal[xref:lifecycle.adoc#Pausable-Paused-address-[`Pausable.Paused`]]
- :xref-Pausable-Paused: xref:lifecycle.adoc#Pausable-Paused-address-
- :Pausable-Unpaused: pass:normal[xref:lifecycle.adoc#Pausable-Unpaused-address-[`Pausable.Unpaused`]]
- :xref-Pausable-Unpaused: xref:lifecycle.adoc#Pausable-Unpaused-address-
- :Ownable: pass:normal[xref:ownership.adoc#Ownable[`Ownable`]]
- :xref-Ownable: xref:ownership.adoc#Ownable
- :Ownable-onlyOwner: pass:normal[xref:ownership.adoc#Ownable-onlyOwner--[`Ownable.onlyOwner`]]
- :xref-Ownable-onlyOwner: xref:ownership.adoc#Ownable-onlyOwner--
- :Ownable-constructor: pass:normal[xref:ownership.adoc#Ownable-constructor--[`Ownable.constructor`]]
- :xref-Ownable-constructor: xref:ownership.adoc#Ownable-constructor--
- :Ownable-owner: pass:normal[xref:ownership.adoc#Ownable-owner--[`Ownable.owner`]]
- :xref-Ownable-owner: xref:ownership.adoc#Ownable-owner--
- :Ownable-isOwner: pass:normal[xref:ownership.adoc#Ownable-isOwner--[`Ownable.isOwner`]]
- :xref-Ownable-isOwner: xref:ownership.adoc#Ownable-isOwner--
- :Ownable-renounceOwnership: pass:normal[xref:ownership.adoc#Ownable-renounceOwnership--[`Ownable.renounceOwnership`]]
- :xref-Ownable-renounceOwnership: xref:ownership.adoc#Ownable-renounceOwnership--
- :Ownable-transferOwnership: pass:normal[xref:ownership.adoc#Ownable-transferOwnership-address-[`Ownable.transferOwnership`]]
- :xref-Ownable-transferOwnership: xref:ownership.adoc#Ownable-transferOwnership-address-
- :Ownable-_transferOwnership: pass:normal[xref:ownership.adoc#Ownable-_transferOwnership-address-[`Ownable._transferOwnership`]]
- :xref-Ownable-_transferOwnership: xref:ownership.adoc#Ownable-_transferOwnership-address-
- :Ownable-OwnershipTransferred: pass:normal[xref:ownership.adoc#Ownable-OwnershipTransferred-address-address-[`Ownable.OwnershipTransferred`]]
- :xref-Ownable-OwnershipTransferred: xref:ownership.adoc#Ownable-OwnershipTransferred-address-address-
- :Secondary: pass:normal[xref:ownership.adoc#Secondary[`Secondary`]]
- :xref-Secondary: xref:ownership.adoc#Secondary
- :Secondary-onlyPrimary: pass:normal[xref:ownership.adoc#Secondary-onlyPrimary--[`Secondary.onlyPrimary`]]
- :xref-Secondary-onlyPrimary: xref:ownership.adoc#Secondary-onlyPrimary--
- :Secondary-constructor: pass:normal[xref:ownership.adoc#Secondary-constructor--[`Secondary.constructor`]]
- :xref-Secondary-constructor: xref:ownership.adoc#Secondary-constructor--
- :Secondary-primary: pass:normal[xref:ownership.adoc#Secondary-primary--[`Secondary.primary`]]
- :xref-Secondary-primary: xref:ownership.adoc#Secondary-primary--
- :Secondary-transferPrimary: pass:normal[xref:ownership.adoc#Secondary-transferPrimary-address-[`Secondary.transferPrimary`]]
- :xref-Secondary-transferPrimary: xref:ownership.adoc#Secondary-transferPrimary-address-
- :Secondary-PrimaryTransferred: pass:normal[xref:ownership.adoc#Secondary-PrimaryTransferred-address-[`Secondary.PrimaryTransferred`]]
- :xref-Secondary-PrimaryTransferred: xref:ownership.adoc#Secondary-PrimaryTransferred-address-
- :Math: pass:normal[xref:math.adoc#Math[`Math`]]
- :xref-Math: xref:math.adoc#Math
- :Math-max: pass:normal[xref:math.adoc#Math-max-uint256-uint256-[`Math.max`]]
- :xref-Math-max: xref:math.adoc#Math-max-uint256-uint256-
- :Math-min: pass:normal[xref:math.adoc#Math-min-uint256-uint256-[`Math.min`]]
- :xref-Math-min: xref:math.adoc#Math-min-uint256-uint256-
- :Math-average: pass:normal[xref:math.adoc#Math-average-uint256-uint256-[`Math.average`]]
- :xref-Math-average: xref:math.adoc#Math-average-uint256-uint256-
- :SafeMath: pass:normal[xref:math.adoc#SafeMath[`SafeMath`]]
- :xref-SafeMath: xref:math.adoc#SafeMath
- :SafeMath-add: pass:normal[xref:math.adoc#SafeMath-add-uint256-uint256-[`SafeMath.add`]]
- :xref-SafeMath-add: xref:math.adoc#SafeMath-add-uint256-uint256-
- :SafeMath-sub: pass:normal[xref:math.adoc#SafeMath-sub-uint256-uint256-[`SafeMath.sub`]]
- :xref-SafeMath-sub: xref:math.adoc#SafeMath-sub-uint256-uint256-
- :SafeMath-sub: pass:normal[xref:math.adoc#SafeMath-sub-uint256-uint256-string-[`SafeMath.sub`]]
- :xref-SafeMath-sub: xref:math.adoc#SafeMath-sub-uint256-uint256-string-
- :SafeMath-mul: pass:normal[xref:math.adoc#SafeMath-mul-uint256-uint256-[`SafeMath.mul`]]
- :xref-SafeMath-mul: xref:math.adoc#SafeMath-mul-uint256-uint256-
- :SafeMath-div: pass:normal[xref:math.adoc#SafeMath-div-uint256-uint256-[`SafeMath.div`]]
- :xref-SafeMath-div: xref:math.adoc#SafeMath-div-uint256-uint256-
- :SafeMath-div: pass:normal[xref:math.adoc#SafeMath-div-uint256-uint256-string-[`SafeMath.div`]]
- :xref-SafeMath-div: xref:math.adoc#SafeMath-div-uint256-uint256-string-
- :SafeMath-mod: pass:normal[xref:math.adoc#SafeMath-mod-uint256-uint256-[`SafeMath.mod`]]
- :xref-SafeMath-mod: xref:math.adoc#SafeMath-mod-uint256-uint256-
- :SafeMath-mod: pass:normal[xref:math.adoc#SafeMath-mod-uint256-uint256-string-[`SafeMath.mod`]]
- :xref-SafeMath-mod: xref:math.adoc#SafeMath-mod-uint256-uint256-string-
- :PaymentSplitter: pass:normal[xref:payment.adoc#PaymentSplitter[`PaymentSplitter`]]
- :xref-PaymentSplitter: xref:payment.adoc#PaymentSplitter
- :PaymentSplitter-constructor: pass:normal[xref:payment.adoc#PaymentSplitter-constructor-address---uint256---[`PaymentSplitter.constructor`]]
- :xref-PaymentSplitter-constructor: xref:payment.adoc#PaymentSplitter-constructor-address---uint256---
- :PaymentSplitter-fallback: pass:normal[xref:payment.adoc#PaymentSplitter-fallback--[`PaymentSplitter.fallback`]]
- :xref-PaymentSplitter-fallback: xref:payment.adoc#PaymentSplitter-fallback--
- :PaymentSplitter-totalShares: pass:normal[xref:payment.adoc#PaymentSplitter-totalShares--[`PaymentSplitter.totalShares`]]
- :xref-PaymentSplitter-totalShares: xref:payment.adoc#PaymentSplitter-totalShares--
- :PaymentSplitter-totalReleased: pass:normal[xref:payment.adoc#PaymentSplitter-totalReleased--[`PaymentSplitter.totalReleased`]]
- :xref-PaymentSplitter-totalReleased: xref:payment.adoc#PaymentSplitter-totalReleased--
- :PaymentSplitter-shares: pass:normal[xref:payment.adoc#PaymentSplitter-shares-address-[`PaymentSplitter.shares`]]
- :xref-PaymentSplitter-shares: xref:payment.adoc#PaymentSplitter-shares-address-
- :PaymentSplitter-released: pass:normal[xref:payment.adoc#PaymentSplitter-released-address-[`PaymentSplitter.released`]]
- :xref-PaymentSplitter-released: xref:payment.adoc#PaymentSplitter-released-address-
- :PaymentSplitter-payee: pass:normal[xref:payment.adoc#PaymentSplitter-payee-uint256-[`PaymentSplitter.payee`]]
- :xref-PaymentSplitter-payee: xref:payment.adoc#PaymentSplitter-payee-uint256-
- :PaymentSplitter-release: pass:normal[xref:payment.adoc#PaymentSplitter-release-address-payable-[`PaymentSplitter.release`]]
- :xref-PaymentSplitter-release: xref:payment.adoc#PaymentSplitter-release-address-payable-
- :PaymentSplitter-PayeeAdded: pass:normal[xref:payment.adoc#PaymentSplitter-PayeeAdded-address-uint256-[`PaymentSplitter.PayeeAdded`]]
- :xref-PaymentSplitter-PayeeAdded: xref:payment.adoc#PaymentSplitter-PayeeAdded-address-uint256-
- :PaymentSplitter-PaymentReleased: pass:normal[xref:payment.adoc#PaymentSplitter-PaymentReleased-address-uint256-[`PaymentSplitter.PaymentReleased`]]
- :xref-PaymentSplitter-PaymentReleased: xref:payment.adoc#PaymentSplitter-PaymentReleased-address-uint256-
- :PaymentSplitter-PaymentReceived: pass:normal[xref:payment.adoc#PaymentSplitter-PaymentReceived-address-uint256-[`PaymentSplitter.PaymentReceived`]]
- :xref-PaymentSplitter-PaymentReceived: xref:payment.adoc#PaymentSplitter-PaymentReceived-address-uint256-
- :PullPayment: pass:normal[xref:payment.adoc#PullPayment[`PullPayment`]]
- :xref-PullPayment: xref:payment.adoc#PullPayment
- :PullPayment-constructor: pass:normal[xref:payment.adoc#PullPayment-constructor--[`PullPayment.constructor`]]
- :xref-PullPayment-constructor: xref:payment.adoc#PullPayment-constructor--
- :PullPayment-withdrawPayments: pass:normal[xref:payment.adoc#PullPayment-withdrawPayments-address-payable-[`PullPayment.withdrawPayments`]]
- :xref-PullPayment-withdrawPayments: xref:payment.adoc#PullPayment-withdrawPayments-address-payable-
- :PullPayment-withdrawPaymentsWithGas: pass:normal[xref:payment.adoc#PullPayment-withdrawPaymentsWithGas-address-payable-[`PullPayment.withdrawPaymentsWithGas`]]
- :xref-PullPayment-withdrawPaymentsWithGas: xref:payment.adoc#PullPayment-withdrawPaymentsWithGas-address-payable-
- :PullPayment-payments: pass:normal[xref:payment.adoc#PullPayment-payments-address-[`PullPayment.payments`]]
- :xref-PullPayment-payments: xref:payment.adoc#PullPayment-payments-address-
- :PullPayment-_asyncTransfer: pass:normal[xref:payment.adoc#PullPayment-_asyncTransfer-address-uint256-[`PullPayment._asyncTransfer`]]
- :xref-PullPayment-_asyncTransfer: xref:payment.adoc#PullPayment-_asyncTransfer-address-uint256-
- :ConditionalEscrow: pass:normal[xref:payment.adoc#ConditionalEscrow[`ConditionalEscrow`]]
- :xref-ConditionalEscrow: xref:payment.adoc#ConditionalEscrow
- :ConditionalEscrow-withdrawalAllowed: pass:normal[xref:payment.adoc#ConditionalEscrow-withdrawalAllowed-address-[`ConditionalEscrow.withdrawalAllowed`]]
- :xref-ConditionalEscrow-withdrawalAllowed: xref:payment.adoc#ConditionalEscrow-withdrawalAllowed-address-
- :ConditionalEscrow-withdraw: pass:normal[xref:payment.adoc#ConditionalEscrow-withdraw-address-payable-[`ConditionalEscrow.withdraw`]]
- :xref-ConditionalEscrow-withdraw: xref:payment.adoc#ConditionalEscrow-withdraw-address-payable-
- :Escrow: pass:normal[xref:payment.adoc#Escrow[`Escrow`]]
- :xref-Escrow: xref:payment.adoc#Escrow
- :Escrow-depositsOf: pass:normal[xref:payment.adoc#Escrow-depositsOf-address-[`Escrow.depositsOf`]]
- :xref-Escrow-depositsOf: xref:payment.adoc#Escrow-depositsOf-address-
- :Escrow-deposit: pass:normal[xref:payment.adoc#Escrow-deposit-address-[`Escrow.deposit`]]
- :xref-Escrow-deposit: xref:payment.adoc#Escrow-deposit-address-
- :Escrow-withdraw: pass:normal[xref:payment.adoc#Escrow-withdraw-address-payable-[`Escrow.withdraw`]]
- :xref-Escrow-withdraw: xref:payment.adoc#Escrow-withdraw-address-payable-
- :Escrow-withdrawWithGas: pass:normal[xref:payment.adoc#Escrow-withdrawWithGas-address-payable-[`Escrow.withdrawWithGas`]]
- :xref-Escrow-withdrawWithGas: xref:payment.adoc#Escrow-withdrawWithGas-address-payable-
- :Escrow-Deposited: pass:normal[xref:payment.adoc#Escrow-Deposited-address-uint256-[`Escrow.Deposited`]]
- :xref-Escrow-Deposited: xref:payment.adoc#Escrow-Deposited-address-uint256-
- :Escrow-Withdrawn: pass:normal[xref:payment.adoc#Escrow-Withdrawn-address-uint256-[`Escrow.Withdrawn`]]
- :xref-Escrow-Withdrawn: xref:payment.adoc#Escrow-Withdrawn-address-uint256-
- :RefundEscrow: pass:normal[xref:payment.adoc#RefundEscrow[`RefundEscrow`]]
- :xref-RefundEscrow: xref:payment.adoc#RefundEscrow
- :RefundEscrow-constructor: pass:normal[xref:payment.adoc#RefundEscrow-constructor-address-payable-[`RefundEscrow.constructor`]]
- :xref-RefundEscrow-constructor: xref:payment.adoc#RefundEscrow-constructor-address-payable-
- :RefundEscrow-state: pass:normal[xref:payment.adoc#RefundEscrow-state--[`RefundEscrow.state`]]
- :xref-RefundEscrow-state: xref:payment.adoc#RefundEscrow-state--
- :RefundEscrow-beneficiary: pass:normal[xref:payment.adoc#RefundEscrow-beneficiary--[`RefundEscrow.beneficiary`]]
- :xref-RefundEscrow-beneficiary: xref:payment.adoc#RefundEscrow-beneficiary--
- :RefundEscrow-deposit: pass:normal[xref:payment.adoc#RefundEscrow-deposit-address-[`RefundEscrow.deposit`]]
- :xref-RefundEscrow-deposit: xref:payment.adoc#RefundEscrow-deposit-address-
- :RefundEscrow-close: pass:normal[xref:payment.adoc#RefundEscrow-close--[`RefundEscrow.close`]]
- :xref-RefundEscrow-close: xref:payment.adoc#RefundEscrow-close--
- :RefundEscrow-enableRefunds: pass:normal[xref:payment.adoc#RefundEscrow-enableRefunds--[`RefundEscrow.enableRefunds`]]
- :xref-RefundEscrow-enableRefunds: xref:payment.adoc#RefundEscrow-enableRefunds--
- :RefundEscrow-beneficiaryWithdraw: pass:normal[xref:payment.adoc#RefundEscrow-beneficiaryWithdraw--[`RefundEscrow.beneficiaryWithdraw`]]
- :xref-RefundEscrow-beneficiaryWithdraw: xref:payment.adoc#RefundEscrow-beneficiaryWithdraw--
- :RefundEscrow-withdrawalAllowed: pass:normal[xref:payment.adoc#RefundEscrow-withdrawalAllowed-address-[`RefundEscrow.withdrawalAllowed`]]
- :xref-RefundEscrow-withdrawalAllowed: xref:payment.adoc#RefundEscrow-withdrawalAllowed-address-
- :RefundEscrow-RefundsClosed: pass:normal[xref:payment.adoc#RefundEscrow-RefundsClosed--[`RefundEscrow.RefundsClosed`]]
- :xref-RefundEscrow-RefundsClosed: xref:payment.adoc#RefundEscrow-RefundsClosed--
- :RefundEscrow-RefundsEnabled: pass:normal[xref:payment.adoc#RefundEscrow-RefundsEnabled--[`RefundEscrow.RefundsEnabled`]]
- :xref-RefundEscrow-RefundsEnabled: xref:payment.adoc#RefundEscrow-RefundsEnabled--
- :Address: pass:normal[xref:utils.adoc#Address[`Address`]]
- :xref-Address: xref:utils.adoc#Address
- :Address-isContract: pass:normal[xref:utils.adoc#Address-isContract-address-[`Address.isContract`]]
- :xref-Address-isContract: xref:utils.adoc#Address-isContract-address-
- :Address-toPayable: pass:normal[xref:utils.adoc#Address-toPayable-address-[`Address.toPayable`]]
- :xref-Address-toPayable: xref:utils.adoc#Address-toPayable-address-
- :Address-sendValue: pass:normal[xref:utils.adoc#Address-sendValue-address-payable-uint256-[`Address.sendValue`]]
- :xref-Address-sendValue: xref:utils.adoc#Address-sendValue-address-payable-uint256-
- :Arrays: pass:normal[xref:utils.adoc#Arrays[`Arrays`]]
- :xref-Arrays: xref:utils.adoc#Arrays
- :Arrays-findUpperBound: pass:normal[xref:utils.adoc#Arrays-findUpperBound-uint256---uint256-[`Arrays.findUpperBound`]]
- :xref-Arrays-findUpperBound: xref:utils.adoc#Arrays-findUpperBound-uint256---uint256-
- :Create2: pass:normal[xref:utils.adoc#Create2[`Create2`]]
- :xref-Create2: xref:utils.adoc#Create2
- :Create2-deploy: pass:normal[xref:utils.adoc#Create2-deploy-bytes32-bytes-[`Create2.deploy`]]
- :xref-Create2-deploy: xref:utils.adoc#Create2-deploy-bytes32-bytes-
- :Create2-computeAddress: pass:normal[xref:utils.adoc#Create2-computeAddress-bytes32-bytes-[`Create2.computeAddress`]]
- :xref-Create2-computeAddress: xref:utils.adoc#Create2-computeAddress-bytes32-bytes-
- :Create2-computeAddress: pass:normal[xref:utils.adoc#Create2-computeAddress-bytes32-bytes-address-[`Create2.computeAddress`]]
- :xref-Create2-computeAddress: xref:utils.adoc#Create2-computeAddress-bytes32-bytes-address-
- :EnumerableSet: pass:normal[xref:utils.adoc#EnumerableSet[`EnumerableSet`]]
- :xref-EnumerableSet: xref:utils.adoc#EnumerableSet
- :EnumerableSet-add: pass:normal[xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-AddressSet-address-[`EnumerableSet.add`]]
- :xref-EnumerableSet-add: xref:utils.adoc#EnumerableSet-add-struct-EnumerableSet-AddressSet-address-
- :EnumerableSet-remove: pass:normal[xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-[`EnumerableSet.remove`]]
- :xref-EnumerableSet-remove: xref:utils.adoc#EnumerableSet-remove-struct-EnumerableSet-AddressSet-address-
- :EnumerableSet-contains: pass:normal[xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-[`EnumerableSet.contains`]]
- :xref-EnumerableSet-contains: xref:utils.adoc#EnumerableSet-contains-struct-EnumerableSet-AddressSet-address-
- :EnumerableSet-enumerate: pass:normal[xref:utils.adoc#EnumerableSet-enumerate-struct-EnumerableSet-AddressSet-[`EnumerableSet.enumerate`]]
- :xref-EnumerableSet-enumerate: xref:utils.adoc#EnumerableSet-enumerate-struct-EnumerableSet-AddressSet-
- :EnumerableSet-length: pass:normal[xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-AddressSet-[`EnumerableSet.length`]]
- :xref-EnumerableSet-length: xref:utils.adoc#EnumerableSet-length-struct-EnumerableSet-AddressSet-
- :EnumerableSet-get: pass:normal[xref:utils.adoc#EnumerableSet-get-struct-EnumerableSet-AddressSet-uint256-[`EnumerableSet.get`]]
- :xref-EnumerableSet-get: xref:utils.adoc#EnumerableSet-get-struct-EnumerableSet-AddressSet-uint256-
- :ReentrancyGuard: pass:normal[xref:utils.adoc#ReentrancyGuard[`ReentrancyGuard`]]
- :xref-ReentrancyGuard: xref:utils.adoc#ReentrancyGuard
- :ReentrancyGuard-nonReentrant: pass:normal[xref:utils.adoc#ReentrancyGuard-nonReentrant--[`ReentrancyGuard.nonReentrant`]]
- :xref-ReentrancyGuard-nonReentrant: xref:utils.adoc#ReentrancyGuard-nonReentrant--
- :ReentrancyGuard-constructor: pass:normal[xref:utils.adoc#ReentrancyGuard-constructor--[`ReentrancyGuard.constructor`]]
- :xref-ReentrancyGuard-constructor: xref:utils.adoc#ReentrancyGuard-constructor--
- :SafeCast: pass:normal[xref:utils.adoc#SafeCast[`SafeCast`]]
- :xref-SafeCast: xref:utils.adoc#SafeCast
- :SafeCast-toUint128: pass:normal[xref:utils.adoc#SafeCast-toUint128-uint256-[`SafeCast.toUint128`]]
- :xref-SafeCast-toUint128: xref:utils.adoc#SafeCast-toUint128-uint256-
- :SafeCast-toUint64: pass:normal[xref:utils.adoc#SafeCast-toUint64-uint256-[`SafeCast.toUint64`]]
- :xref-SafeCast-toUint64: xref:utils.adoc#SafeCast-toUint64-uint256-
- :SafeCast-toUint32: pass:normal[xref:utils.adoc#SafeCast-toUint32-uint256-[`SafeCast.toUint32`]]
- :xref-SafeCast-toUint32: xref:utils.adoc#SafeCast-toUint32-uint256-
- :SafeCast-toUint16: pass:normal[xref:utils.adoc#SafeCast-toUint16-uint256-[`SafeCast.toUint16`]]
- :xref-SafeCast-toUint16: xref:utils.adoc#SafeCast-toUint16-uint256-
- :SafeCast-toUint8: pass:normal[xref:utils.adoc#SafeCast-toUint8-uint256-[`SafeCast.toUint8`]]
- :xref-SafeCast-toUint8: xref:utils.adoc#SafeCast-toUint8-uint256-
- :ERC721: pass:normal[xref:token/ERC721.adoc#ERC721[`ERC721`]]
- :xref-ERC721: xref:token/ERC721.adoc#ERC721
- :ERC721-balanceOf: pass:normal[xref:token/ERC721.adoc#ERC721-balanceOf-address-[`ERC721.balanceOf`]]
- :xref-ERC721-balanceOf: xref:token/ERC721.adoc#ERC721-balanceOf-address-
- :ERC721-ownerOf: pass:normal[xref:token/ERC721.adoc#ERC721-ownerOf-uint256-[`ERC721.ownerOf`]]
- :xref-ERC721-ownerOf: xref:token/ERC721.adoc#ERC721-ownerOf-uint256-
- :ERC721-approve: pass:normal[xref:token/ERC721.adoc#ERC721-approve-address-uint256-[`ERC721.approve`]]
- :xref-ERC721-approve: xref:token/ERC721.adoc#ERC721-approve-address-uint256-
- :ERC721-getApproved: pass:normal[xref:token/ERC721.adoc#ERC721-getApproved-uint256-[`ERC721.getApproved`]]
- :xref-ERC721-getApproved: xref:token/ERC721.adoc#ERC721-getApproved-uint256-
- :ERC721-setApprovalForAll: pass:normal[xref:token/ERC721.adoc#ERC721-setApprovalForAll-address-bool-[`ERC721.setApprovalForAll`]]
- :xref-ERC721-setApprovalForAll: xref:token/ERC721.adoc#ERC721-setApprovalForAll-address-bool-
- :ERC721-isApprovedForAll: pass:normal[xref:token/ERC721.adoc#ERC721-isApprovedForAll-address-address-[`ERC721.isApprovedForAll`]]
- :xref-ERC721-isApprovedForAll: xref:token/ERC721.adoc#ERC721-isApprovedForAll-address-address-
- :ERC721-transferFrom: pass:normal[xref:token/ERC721.adoc#ERC721-transferFrom-address-address-uint256-[`ERC721.transferFrom`]]
- :xref-ERC721-transferFrom: xref:token/ERC721.adoc#ERC721-transferFrom-address-address-uint256-
- :ERC721-safeTransferFrom: pass:normal[xref:token/ERC721.adoc#ERC721-safeTransferFrom-address-address-uint256-[`ERC721.safeTransferFrom`]]
- :xref-ERC721-safeTransferFrom: xref:token/ERC721.adoc#ERC721-safeTransferFrom-address-address-uint256-
- :ERC721-safeTransferFrom: pass:normal[xref:token/ERC721.adoc#ERC721-safeTransferFrom-address-address-uint256-bytes-[`ERC721.safeTransferFrom`]]
- :xref-ERC721-safeTransferFrom: xref:token/ERC721.adoc#ERC721-safeTransferFrom-address-address-uint256-bytes-
- :ERC721-_safeTransferFrom: pass:normal[xref:token/ERC721.adoc#ERC721-_safeTransferFrom-address-address-uint256-bytes-[`ERC721._safeTransferFrom`]]
- :xref-ERC721-_safeTransferFrom: xref:token/ERC721.adoc#ERC721-_safeTransferFrom-address-address-uint256-bytes-
- :ERC721-_exists: pass:normal[xref:token/ERC721.adoc#ERC721-_exists-uint256-[`ERC721._exists`]]
- :xref-ERC721-_exists: xref:token/ERC721.adoc#ERC721-_exists-uint256-
- :ERC721-_isApprovedOrOwner: pass:normal[xref:token/ERC721.adoc#ERC721-_isApprovedOrOwner-address-uint256-[`ERC721._isApprovedOrOwner`]]
- :xref-ERC721-_isApprovedOrOwner: xref:token/ERC721.adoc#ERC721-_isApprovedOrOwner-address-uint256-
- :ERC721-_safeMint: pass:normal[xref:token/ERC721.adoc#ERC721-_safeMint-address-uint256-[`ERC721._safeMint`]]
- :xref-ERC721-_safeMint: xref:token/ERC721.adoc#ERC721-_safeMint-address-uint256-
- :ERC721-_safeMint: pass:normal[xref:token/ERC721.adoc#ERC721-_safeMint-address-uint256-bytes-[`ERC721._safeMint`]]
- :xref-ERC721-_safeMint: xref:token/ERC721.adoc#ERC721-_safeMint-address-uint256-bytes-
- :ERC721-_mint: pass:normal[xref:token/ERC721.adoc#ERC721-_mint-address-uint256-[`ERC721._mint`]]
- :xref-ERC721-_mint: xref:token/ERC721.adoc#ERC721-_mint-address-uint256-
- :ERC721-_burn: pass:normal[xref:token/ERC721.adoc#ERC721-_burn-address-uint256-[`ERC721._burn`]]
- :xref-ERC721-_burn: xref:token/ERC721.adoc#ERC721-_burn-address-uint256-
- :ERC721-_burn: pass:normal[xref:token/ERC721.adoc#ERC721-_burn-uint256-[`ERC721._burn`]]
- :xref-ERC721-_burn: xref:token/ERC721.adoc#ERC721-_burn-uint256-
- :ERC721-_transferFrom: pass:normal[xref:token/ERC721.adoc#ERC721-_transferFrom-address-address-uint256-[`ERC721._transferFrom`]]
- :xref-ERC721-_transferFrom: xref:token/ERC721.adoc#ERC721-_transferFrom-address-address-uint256-
- :ERC721-_checkOnERC721Received: pass:normal[xref:token/ERC721.adoc#ERC721-_checkOnERC721Received-address-address-uint256-bytes-[`ERC721._checkOnERC721Received`]]
- :xref-ERC721-_checkOnERC721Received: xref:token/ERC721.adoc#ERC721-_checkOnERC721Received-address-address-uint256-bytes-
- :ERC721Burnable: pass:normal[xref:token/ERC721.adoc#ERC721Burnable[`ERC721Burnable`]]
- :xref-ERC721Burnable: xref:token/ERC721.adoc#ERC721Burnable
- :ERC721Burnable-burn: pass:normal[xref:token/ERC721.adoc#ERC721Burnable-burn-uint256-[`ERC721Burnable.burn`]]
- :xref-ERC721Burnable-burn: xref:token/ERC721.adoc#ERC721Burnable-burn-uint256-
- :ERC721Enumerable: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable[`ERC721Enumerable`]]
- :xref-ERC721Enumerable: xref:token/ERC721.adoc#ERC721Enumerable
- :ERC721Enumerable-constructor: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-constructor--[`ERC721Enumerable.constructor`]]
- :xref-ERC721Enumerable-constructor: xref:token/ERC721.adoc#ERC721Enumerable-constructor--
- :ERC721Enumerable-tokenOfOwnerByIndex: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-tokenOfOwnerByIndex-address-uint256-[`ERC721Enumerable.tokenOfOwnerByIndex`]]
- :xref-ERC721Enumerable-tokenOfOwnerByIndex: xref:token/ERC721.adoc#ERC721Enumerable-tokenOfOwnerByIndex-address-uint256-
- :ERC721Enumerable-totalSupply: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-totalSupply--[`ERC721Enumerable.totalSupply`]]
- :xref-ERC721Enumerable-totalSupply: xref:token/ERC721.adoc#ERC721Enumerable-totalSupply--
- :ERC721Enumerable-tokenByIndex: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-tokenByIndex-uint256-[`ERC721Enumerable.tokenByIndex`]]
- :xref-ERC721Enumerable-tokenByIndex: xref:token/ERC721.adoc#ERC721Enumerable-tokenByIndex-uint256-
- :ERC721Enumerable-_transferFrom: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-_transferFrom-address-address-uint256-[`ERC721Enumerable._transferFrom`]]
- :xref-ERC721Enumerable-_transferFrom: xref:token/ERC721.adoc#ERC721Enumerable-_transferFrom-address-address-uint256-
- :ERC721Enumerable-_mint: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-_mint-address-uint256-[`ERC721Enumerable._mint`]]
- :xref-ERC721Enumerable-_mint: xref:token/ERC721.adoc#ERC721Enumerable-_mint-address-uint256-
- :ERC721Enumerable-_burn: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-_burn-address-uint256-[`ERC721Enumerable._burn`]]
- :xref-ERC721Enumerable-_burn: xref:token/ERC721.adoc#ERC721Enumerable-_burn-address-uint256-
- :ERC721Enumerable-_tokensOfOwner: pass:normal[xref:token/ERC721.adoc#ERC721Enumerable-_tokensOfOwner-address-[`ERC721Enumerable._tokensOfOwner`]]
- :xref-ERC721Enumerable-_tokensOfOwner: xref:token/ERC721.adoc#ERC721Enumerable-_tokensOfOwner-address-
- :ERC721Full: pass:normal[xref:token/ERC721.adoc#ERC721Full[`ERC721Full`]]
- :xref-ERC721Full: xref:token/ERC721.adoc#ERC721Full
- :ERC721Full-constructor: pass:normal[xref:token/ERC721.adoc#ERC721Full-constructor-string-string-[`ERC721Full.constructor`]]
- :xref-ERC721Full-constructor: xref:token/ERC721.adoc#ERC721Full-constructor-string-string-
- :ERC721Holder: pass:normal[xref:token/ERC721.adoc#ERC721Holder[`ERC721Holder`]]
- :xref-ERC721Holder: xref:token/ERC721.adoc#ERC721Holder
- :ERC721Holder-onERC721Received: pass:normal[xref:token/ERC721.adoc#ERC721Holder-onERC721Received-address-address-uint256-bytes-[`ERC721Holder.onERC721Received`]]
- :xref-ERC721Holder-onERC721Received: xref:token/ERC721.adoc#ERC721Holder-onERC721Received-address-address-uint256-bytes-
- :ERC721Metadata: pass:normal[xref:token/ERC721.adoc#ERC721Metadata[`ERC721Metadata`]]
- :xref-ERC721Metadata: xref:token/ERC721.adoc#ERC721Metadata
- :ERC721Metadata-constructor: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-constructor-string-string-[`ERC721Metadata.constructor`]]
- :xref-ERC721Metadata-constructor: xref:token/ERC721.adoc#ERC721Metadata-constructor-string-string-
- :ERC721Metadata-name: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-name--[`ERC721Metadata.name`]]
- :xref-ERC721Metadata-name: xref:token/ERC721.adoc#ERC721Metadata-name--
- :ERC721Metadata-symbol: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-symbol--[`ERC721Metadata.symbol`]]
- :xref-ERC721Metadata-symbol: xref:token/ERC721.adoc#ERC721Metadata-symbol--
- :ERC721Metadata-tokenURI: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-tokenURI-uint256-[`ERC721Metadata.tokenURI`]]
- :xref-ERC721Metadata-tokenURI: xref:token/ERC721.adoc#ERC721Metadata-tokenURI-uint256-
- :ERC721Metadata-_setTokenURI: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-_setTokenURI-uint256-string-[`ERC721Metadata._setTokenURI`]]
- :xref-ERC721Metadata-_setTokenURI: xref:token/ERC721.adoc#ERC721Metadata-_setTokenURI-uint256-string-
- :ERC721Metadata-_setBaseURI: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-_setBaseURI-string-[`ERC721Metadata._setBaseURI`]]
- :xref-ERC721Metadata-_setBaseURI: xref:token/ERC721.adoc#ERC721Metadata-_setBaseURI-string-
- :ERC721Metadata-baseURI: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-baseURI--[`ERC721Metadata.baseURI`]]
- :xref-ERC721Metadata-baseURI: xref:token/ERC721.adoc#ERC721Metadata-baseURI--
- :ERC721Metadata-_burn: pass:normal[xref:token/ERC721.adoc#ERC721Metadata-_burn-address-uint256-[`ERC721Metadata._burn`]]
- :xref-ERC721Metadata-_burn: xref:token/ERC721.adoc#ERC721Metadata-_burn-address-uint256-
- :ERC721MetadataMintable: pass:normal[xref:token/ERC721.adoc#ERC721MetadataMintable[`ERC721MetadataMintable`]]
- :xref-ERC721MetadataMintable: xref:token/ERC721.adoc#ERC721MetadataMintable
- :ERC721MetadataMintable-mintWithTokenURI: pass:normal[xref:token/ERC721.adoc#ERC721MetadataMintable-mintWithTokenURI-address-uint256-string-[`ERC721MetadataMintable.mintWithTokenURI`]]
- :xref-ERC721MetadataMintable-mintWithTokenURI: xref:token/ERC721.adoc#ERC721MetadataMintable-mintWithTokenURI-address-uint256-string-
- :ERC721Mintable: pass:normal[xref:token/ERC721.adoc#ERC721Mintable[`ERC721Mintable`]]
- :xref-ERC721Mintable: xref:token/ERC721.adoc#ERC721Mintable
- :ERC721Mintable-mint: pass:normal[xref:token/ERC721.adoc#ERC721Mintable-mint-address-uint256-[`ERC721Mintable.mint`]]
- :xref-ERC721Mintable-mint: xref:token/ERC721.adoc#ERC721Mintable-mint-address-uint256-
- :ERC721Mintable-safeMint: pass:normal[xref:token/ERC721.adoc#ERC721Mintable-safeMint-address-uint256-[`ERC721Mintable.safeMint`]]
- :xref-ERC721Mintable-safeMint: xref:token/ERC721.adoc#ERC721Mintable-safeMint-address-uint256-
- :ERC721Mintable-safeMint: pass:normal[xref:token/ERC721.adoc#ERC721Mintable-safeMint-address-uint256-bytes-[`ERC721Mintable.safeMint`]]
- :xref-ERC721Mintable-safeMint: xref:token/ERC721.adoc#ERC721Mintable-safeMint-address-uint256-bytes-
- :ERC721Pausable: pass:normal[xref:token/ERC721.adoc#ERC721Pausable[`ERC721Pausable`]]
- :xref-ERC721Pausable: xref:token/ERC721.adoc#ERC721Pausable
- :ERC721Pausable-approve: pass:normal[xref:token/ERC721.adoc#ERC721Pausable-approve-address-uint256-[`ERC721Pausable.approve`]]
- :xref-ERC721Pausable-approve: xref:token/ERC721.adoc#ERC721Pausable-approve-address-uint256-
- :ERC721Pausable-setApprovalForAll: pass:normal[xref:token/ERC721.adoc#ERC721Pausable-setApprovalForAll-address-bool-[`ERC721Pausable.setApprovalForAll`]]
- :xref-ERC721Pausable-setApprovalForAll: xref:token/ERC721.adoc#ERC721Pausable-setApprovalForAll-address-bool-
- :ERC721Pausable-_transferFrom: pass:normal[xref:token/ERC721.adoc#ERC721Pausable-_transferFrom-address-address-uint256-[`ERC721Pausable._transferFrom`]]
- :xref-ERC721Pausable-_transferFrom: xref:token/ERC721.adoc#ERC721Pausable-_transferFrom-address-address-uint256-
- :IERC721: pass:normal[xref:token/ERC721.adoc#IERC721[`IERC721`]]
- :xref-IERC721: xref:token/ERC721.adoc#IERC721
- :IERC721-balanceOf: pass:normal[xref:token/ERC721.adoc#IERC721-balanceOf-address-[`IERC721.balanceOf`]]
- :xref-IERC721-balanceOf: xref:token/ERC721.adoc#IERC721-balanceOf-address-
- :IERC721-ownerOf: pass:normal[xref:token/ERC721.adoc#IERC721-ownerOf-uint256-[`IERC721.ownerOf`]]
- :xref-IERC721-ownerOf: xref:token/ERC721.adoc#IERC721-ownerOf-uint256-
- :IERC721-safeTransferFrom: pass:normal[xref:token/ERC721.adoc#IERC721-safeTransferFrom-address-address-uint256-[`IERC721.safeTransferFrom`]]
- :xref-IERC721-safeTransferFrom: xref:token/ERC721.adoc#IERC721-safeTransferFrom-address-address-uint256-
- :IERC721-transferFrom: pass:normal[xref:token/ERC721.adoc#IERC721-transferFrom-address-address-uint256-[`IERC721.transferFrom`]]
- :xref-IERC721-transferFrom: xref:token/ERC721.adoc#IERC721-transferFrom-address-address-uint256-
- :IERC721-approve: pass:normal[xref:token/ERC721.adoc#IERC721-approve-address-uint256-[`IERC721.approve`]]
- :xref-IERC721-approve: xref:token/ERC721.adoc#IERC721-approve-address-uint256-
- :IERC721-getApproved: pass:normal[xref:token/ERC721.adoc#IERC721-getApproved-uint256-[`IERC721.getApproved`]]
- :xref-IERC721-getApproved: xref:token/ERC721.adoc#IERC721-getApproved-uint256-
- :IERC721-setApprovalForAll: pass:normal[xref:token/ERC721.adoc#IERC721-setApprovalForAll-address-bool-[`IERC721.setApprovalForAll`]]
- :xref-IERC721-setApprovalForAll: xref:token/ERC721.adoc#IERC721-setApprovalForAll-address-bool-
- :IERC721-isApprovedForAll: pass:normal[xref:token/ERC721.adoc#IERC721-isApprovedForAll-address-address-[`IERC721.isApprovedForAll`]]
- :xref-IERC721-isApprovedForAll: xref:token/ERC721.adoc#IERC721-isApprovedForAll-address-address-
- :IERC721-safeTransferFrom: pass:normal[xref:token/ERC721.adoc#IERC721-safeTransferFrom-address-address-uint256-bytes-[`IERC721.safeTransferFrom`]]
- :xref-IERC721-safeTransferFrom: xref:token/ERC721.adoc#IERC721-safeTransferFrom-address-address-uint256-bytes-
- :IERC721-Transfer: pass:normal[xref:token/ERC721.adoc#IERC721-Transfer-address-address-uint256-[`IERC721.Transfer`]]
- :xref-IERC721-Transfer: xref:token/ERC721.adoc#IERC721-Transfer-address-address-uint256-
- :IERC721-Approval: pass:normal[xref:token/ERC721.adoc#IERC721-Approval-address-address-uint256-[`IERC721.Approval`]]
- :xref-IERC721-Approval: xref:token/ERC721.adoc#IERC721-Approval-address-address-uint256-
- :IERC721-ApprovalForAll: pass:normal[xref:token/ERC721.adoc#IERC721-ApprovalForAll-address-address-bool-[`IERC721.ApprovalForAll`]]
- :xref-IERC721-ApprovalForAll: xref:token/ERC721.adoc#IERC721-ApprovalForAll-address-address-bool-
- :IERC721Enumerable: pass:normal[xref:token/ERC721.adoc#IERC721Enumerable[`IERC721Enumerable`]]
- :xref-IERC721Enumerable: xref:token/ERC721.adoc#IERC721Enumerable
- :IERC721Enumerable-totalSupply: pass:normal[xref:token/ERC721.adoc#IERC721Enumerable-totalSupply--[`IERC721Enumerable.totalSupply`]]
- :xref-IERC721Enumerable-totalSupply: xref:token/ERC721.adoc#IERC721Enumerable-totalSupply--
- :IERC721Enumerable-tokenOfOwnerByIndex: pass:normal[xref:token/ERC721.adoc#IERC721Enumerable-tokenOfOwnerByIndex-address-uint256-[`IERC721Enumerable.tokenOfOwnerByIndex`]]
- :xref-IERC721Enumerable-tokenOfOwnerByIndex: xref:token/ERC721.adoc#IERC721Enumerable-tokenOfOwnerByIndex-address-uint256-
- :IERC721Enumerable-tokenByIndex: pass:normal[xref:token/ERC721.adoc#IERC721Enumerable-tokenByIndex-uint256-[`IERC721Enumerable.tokenByIndex`]]
- :xref-IERC721Enumerable-tokenByIndex: xref:token/ERC721.adoc#IERC721Enumerable-tokenByIndex-uint256-
- :IERC721Full: pass:normal[xref:token/ERC721.adoc#IERC721Full[`IERC721Full`]]
- :xref-IERC721Full: xref:token/ERC721.adoc#IERC721Full
- :IERC721Metadata: pass:normal[xref:token/ERC721.adoc#IERC721Metadata[`IERC721Metadata`]]
- :xref-IERC721Metadata: xref:token/ERC721.adoc#IERC721Metadata
- :IERC721Metadata-name: pass:normal[xref:token/ERC721.adoc#IERC721Metadata-name--[`IERC721Metadata.name`]]
- :xref-IERC721Metadata-name: xref:token/ERC721.adoc#IERC721Metadata-name--
- :IERC721Metadata-symbol: pass:normal[xref:token/ERC721.adoc#IERC721Metadata-symbol--[`IERC721Metadata.symbol`]]
- :xref-IERC721Metadata-symbol: xref:token/ERC721.adoc#IERC721Metadata-symbol--
- :IERC721Metadata-tokenURI: pass:normal[xref:token/ERC721.adoc#IERC721Metadata-tokenURI-uint256-[`IERC721Metadata.tokenURI`]]
- :xref-IERC721Metadata-tokenURI: xref:token/ERC721.adoc#IERC721Metadata-tokenURI-uint256-
- :IERC721Receiver: pass:normal[xref:token/ERC721.adoc#IERC721Receiver[`IERC721Receiver`]]
- :xref-IERC721Receiver: xref:token/ERC721.adoc#IERC721Receiver
- :IERC721Receiver-onERC721Received: pass:normal[xref:token/ERC721.adoc#IERC721Receiver-onERC721Received-address-address-uint256-bytes-[`IERC721Receiver.onERC721Received`]]
- :xref-IERC721Receiver-onERC721Received: xref:token/ERC721.adoc#IERC721Receiver-onERC721Received-address-address-uint256-bytes-
- :ERC20: pass:normal[xref:token/ERC20.adoc#ERC20[`ERC20`]]
- :xref-ERC20: xref:token/ERC20.adoc#ERC20
- :ERC20-totalSupply: pass:normal[xref:token/ERC20.adoc#ERC20-totalSupply--[`ERC20.totalSupply`]]
- :xref-ERC20-totalSupply: xref:token/ERC20.adoc#ERC20-totalSupply--
- :ERC20-balanceOf: pass:normal[xref:token/ERC20.adoc#ERC20-balanceOf-address-[`ERC20.balanceOf`]]
- :xref-ERC20-balanceOf: xref:token/ERC20.adoc#ERC20-balanceOf-address-
- :ERC20-transfer: pass:normal[xref:token/ERC20.adoc#ERC20-transfer-address-uint256-[`ERC20.transfer`]]
- :xref-ERC20-transfer: xref:token/ERC20.adoc#ERC20-transfer-address-uint256-
- :ERC20-allowance: pass:normal[xref:token/ERC20.adoc#ERC20-allowance-address-address-[`ERC20.allowance`]]
- :xref-ERC20-allowance: xref:token/ERC20.adoc#ERC20-allowance-address-address-
- :ERC20-approve: pass:normal[xref:token/ERC20.adoc#ERC20-approve-address-uint256-[`ERC20.approve`]]
- :xref-ERC20-approve: xref:token/ERC20.adoc#ERC20-approve-address-uint256-
- :ERC20-transferFrom: pass:normal[xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-[`ERC20.transferFrom`]]
- :xref-ERC20-transferFrom: xref:token/ERC20.adoc#ERC20-transferFrom-address-address-uint256-
- :ERC20-increaseAllowance: pass:normal[xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-[`ERC20.increaseAllowance`]]
- :xref-ERC20-increaseAllowance: xref:token/ERC20.adoc#ERC20-increaseAllowance-address-uint256-
- :ERC20-decreaseAllowance: pass:normal[xref:token/ERC20.adoc#ERC20-decreaseAllowance-address-uint256-[`ERC20.decreaseAllowance`]]
- :xref-ERC20-decreaseAllowance: xref:token/ERC20.adoc#ERC20-decreaseAllowance-address-uint256-
- :ERC20-_transfer: pass:normal[xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-[`ERC20._transfer`]]
- :xref-ERC20-_transfer: xref:token/ERC20.adoc#ERC20-_transfer-address-address-uint256-
- :ERC20-_mint: pass:normal[xref:token/ERC20.adoc#ERC20-_mint-address-uint256-[`ERC20._mint`]]
- :xref-ERC20-_mint: xref:token/ERC20.adoc#ERC20-_mint-address-uint256-
- :ERC20-_burn: pass:normal[xref:token/ERC20.adoc#ERC20-_burn-address-uint256-[`ERC20._burn`]]
- :xref-ERC20-_burn: xref:token/ERC20.adoc#ERC20-_burn-address-uint256-
- :ERC20-_approve: pass:normal[xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-[`ERC20._approve`]]
- :xref-ERC20-_approve: xref:token/ERC20.adoc#ERC20-_approve-address-address-uint256-
- :ERC20-_burnFrom: pass:normal[xref:token/ERC20.adoc#ERC20-_burnFrom-address-uint256-[`ERC20._burnFrom`]]
- :xref-ERC20-_burnFrom: xref:token/ERC20.adoc#ERC20-_burnFrom-address-uint256-
- :ERC20Burnable: pass:normal[xref:token/ERC20.adoc#ERC20Burnable[`ERC20Burnable`]]
- :xref-ERC20Burnable: xref:token/ERC20.adoc#ERC20Burnable
- :ERC20Burnable-burn: pass:normal[xref:token/ERC20.adoc#ERC20Burnable-burn-uint256-[`ERC20Burnable.burn`]]
- :xref-ERC20Burnable-burn: xref:token/ERC20.adoc#ERC20Burnable-burn-uint256-
- :ERC20Burnable-burnFrom: pass:normal[xref:token/ERC20.adoc#ERC20Burnable-burnFrom-address-uint256-[`ERC20Burnable.burnFrom`]]
- :xref-ERC20Burnable-burnFrom: xref:token/ERC20.adoc#ERC20Burnable-burnFrom-address-uint256-
- :ERC20Capped: pass:normal[xref:token/ERC20.adoc#ERC20Capped[`ERC20Capped`]]
- :xref-ERC20Capped: xref:token/ERC20.adoc#ERC20Capped
- :ERC20Capped-constructor: pass:normal[xref:token/ERC20.adoc#ERC20Capped-constructor-uint256-[`ERC20Capped.constructor`]]
- :xref-ERC20Capped-constructor: xref:token/ERC20.adoc#ERC20Capped-constructor-uint256-
- :ERC20Capped-cap: pass:normal[xref:token/ERC20.adoc#ERC20Capped-cap--[`ERC20Capped.cap`]]
- :xref-ERC20Capped-cap: xref:token/ERC20.adoc#ERC20Capped-cap--
- :ERC20Capped-_mint: pass:normal[xref:token/ERC20.adoc#ERC20Capped-_mint-address-uint256-[`ERC20Capped._mint`]]
- :xref-ERC20Capped-_mint: xref:token/ERC20.adoc#ERC20Capped-_mint-address-uint256-
- :ERC20Detailed: pass:normal[xref:token/ERC20.adoc#ERC20Detailed[`ERC20Detailed`]]
- :xref-ERC20Detailed: xref:token/ERC20.adoc#ERC20Detailed
- :ERC20Detailed-constructor: pass:normal[xref:token/ERC20.adoc#ERC20Detailed-constructor-string-string-uint8-[`ERC20Detailed.constructor`]]
- :xref-ERC20Detailed-constructor: xref:token/ERC20.adoc#ERC20Detailed-constructor-string-string-uint8-
- :ERC20Detailed-name: pass:normal[xref:token/ERC20.adoc#ERC20Detailed-name--[`ERC20Detailed.name`]]
- :xref-ERC20Detailed-name: xref:token/ERC20.adoc#ERC20Detailed-name--
- :ERC20Detailed-symbol: pass:normal[xref:token/ERC20.adoc#ERC20Detailed-symbol--[`ERC20Detailed.symbol`]]
- :xref-ERC20Detailed-symbol: xref:token/ERC20.adoc#ERC20Detailed-symbol--
- :ERC20Detailed-decimals: pass:normal[xref:token/ERC20.adoc#ERC20Detailed-decimals--[`ERC20Detailed.decimals`]]
- :xref-ERC20Detailed-decimals: xref:token/ERC20.adoc#ERC20Detailed-decimals--
- :ERC20Mintable: pass:normal[xref:token/ERC20.adoc#ERC20Mintable[`ERC20Mintable`]]
- :xref-ERC20Mintable: xref:token/ERC20.adoc#ERC20Mintable
- :ERC20Mintable-mint: pass:normal[xref:token/ERC20.adoc#ERC20Mintable-mint-address-uint256-[`ERC20Mintable.mint`]]
- :xref-ERC20Mintable-mint: xref:token/ERC20.adoc#ERC20Mintable-mint-address-uint256-
- :ERC20Pausable: pass:normal[xref:token/ERC20.adoc#ERC20Pausable[`ERC20Pausable`]]
- :xref-ERC20Pausable: xref:token/ERC20.adoc#ERC20Pausable
- :ERC20Pausable-transfer: pass:normal[xref:token/ERC20.adoc#ERC20Pausable-transfer-address-uint256-[`ERC20Pausable.transfer`]]
- :xref-ERC20Pausable-transfer: xref:token/ERC20.adoc#ERC20Pausable-transfer-address-uint256-
- :ERC20Pausable-transferFrom: pass:normal[xref:token/ERC20.adoc#ERC20Pausable-transferFrom-address-address-uint256-[`ERC20Pausable.transferFrom`]]
- :xref-ERC20Pausable-transferFrom: xref:token/ERC20.adoc#ERC20Pausable-transferFrom-address-address-uint256-
- :ERC20Pausable-approve: pass:normal[xref:token/ERC20.adoc#ERC20Pausable-approve-address-uint256-[`ERC20Pausable.approve`]]
- :xref-ERC20Pausable-approve: xref:token/ERC20.adoc#ERC20Pausable-approve-address-uint256-
- :ERC20Pausable-increaseAllowance: pass:normal[xref:token/ERC20.adoc#ERC20Pausable-increaseAllowance-address-uint256-[`ERC20Pausable.increaseAllowance`]]
- :xref-ERC20Pausable-increaseAllowance: xref:token/ERC20.adoc#ERC20Pausable-increaseAllowance-address-uint256-
- :ERC20Pausable-decreaseAllowance: pass:normal[xref:token/ERC20.adoc#ERC20Pausable-decreaseAllowance-address-uint256-[`ERC20Pausable.decreaseAllowance`]]
- :xref-ERC20Pausable-decreaseAllowance: xref:token/ERC20.adoc#ERC20Pausable-decreaseAllowance-address-uint256-
- :IERC20: pass:normal[xref:token/ERC20.adoc#IERC20[`IERC20`]]
- :xref-IERC20: xref:token/ERC20.adoc#IERC20
- :IERC20-totalSupply: pass:normal[xref:token/ERC20.adoc#IERC20-totalSupply--[`IERC20.totalSupply`]]
- :xref-IERC20-totalSupply: xref:token/ERC20.adoc#IERC20-totalSupply--
- :IERC20-balanceOf: pass:normal[xref:token/ERC20.adoc#IERC20-balanceOf-address-[`IERC20.balanceOf`]]
- :xref-IERC20-balanceOf: xref:token/ERC20.adoc#IERC20-balanceOf-address-
- :IERC20-transfer: pass:normal[xref:token/ERC20.adoc#IERC20-transfer-address-uint256-[`IERC20.transfer`]]
- :xref-IERC20-transfer: xref:token/ERC20.adoc#IERC20-transfer-address-uint256-
- :IERC20-allowance: pass:normal[xref:token/ERC20.adoc#IERC20-allowance-address-address-[`IERC20.allowance`]]
- :xref-IERC20-allowance: xref:token/ERC20.adoc#IERC20-allowance-address-address-
- :IERC20-approve: pass:normal[xref:token/ERC20.adoc#IERC20-approve-address-uint256-[`IERC20.approve`]]
- :xref-IERC20-approve: xref:token/ERC20.adoc#IERC20-approve-address-uint256-
- :IERC20-transferFrom: pass:normal[xref:token/ERC20.adoc#IERC20-transferFrom-address-address-uint256-[`IERC20.transferFrom`]]
- :xref-IERC20-transferFrom: xref:token/ERC20.adoc#IERC20-transferFrom-address-address-uint256-
- :IERC20-Transfer: pass:normal[xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-[`IERC20.Transfer`]]
- :xref-IERC20-Transfer: xref:token/ERC20.adoc#IERC20-Transfer-address-address-uint256-
- :IERC20-Approval: pass:normal[xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-[`IERC20.Approval`]]
- :xref-IERC20-Approval: xref:token/ERC20.adoc#IERC20-Approval-address-address-uint256-
- :SafeERC20: pass:normal[xref:token/ERC20.adoc#SafeERC20[`SafeERC20`]]
- :xref-SafeERC20: xref:token/ERC20.adoc#SafeERC20
- :SafeERC20-safeTransfer: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeTransfer-contract-IERC20-address-uint256-[`SafeERC20.safeTransfer`]]
- :xref-SafeERC20-safeTransfer: xref:token/ERC20.adoc#SafeERC20-safeTransfer-contract-IERC20-address-uint256-
- :SafeERC20-safeTransferFrom: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-[`SafeERC20.safeTransferFrom`]]
- :xref-SafeERC20-safeTransferFrom: xref:token/ERC20.adoc#SafeERC20-safeTransferFrom-contract-IERC20-address-address-uint256-
- :SafeERC20-safeApprove: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeApprove-contract-IERC20-address-uint256-[`SafeERC20.safeApprove`]]
- :xref-SafeERC20-safeApprove: xref:token/ERC20.adoc#SafeERC20-safeApprove-contract-IERC20-address-uint256-
- :SafeERC20-safeIncreaseAllowance: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-[`SafeERC20.safeIncreaseAllowance`]]
- :xref-SafeERC20-safeIncreaseAllowance: xref:token/ERC20.adoc#SafeERC20-safeIncreaseAllowance-contract-IERC20-address-uint256-
- :SafeERC20-safeDecreaseAllowance: pass:normal[xref:token/ERC20.adoc#SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-[`SafeERC20.safeDecreaseAllowance`]]
- :xref-SafeERC20-safeDecreaseAllowance: xref:token/ERC20.adoc#SafeERC20-safeDecreaseAllowance-contract-IERC20-address-uint256-
- :TokenTimelock: pass:normal[xref:token/ERC20.adoc#TokenTimelock[`TokenTimelock`]]
- :xref-TokenTimelock: xref:token/ERC20.adoc#TokenTimelock
- :TokenTimelock-constructor: pass:normal[xref:token/ERC20.adoc#TokenTimelock-constructor-contract-IERC20-address-uint256-[`TokenTimelock.constructor`]]
- :xref-TokenTimelock-constructor: xref:token/ERC20.adoc#TokenTimelock-constructor-contract-IERC20-address-uint256-
- :TokenTimelock-token: pass:normal[xref:token/ERC20.adoc#TokenTimelock-token--[`TokenTimelock.token`]]
- :xref-TokenTimelock-token: xref:token/ERC20.adoc#TokenTimelock-token--
- :TokenTimelock-beneficiary: pass:normal[xref:token/ERC20.adoc#TokenTimelock-beneficiary--[`TokenTimelock.beneficiary`]]
- :xref-TokenTimelock-beneficiary: xref:token/ERC20.adoc#TokenTimelock-beneficiary--
- :TokenTimelock-releaseTime: pass:normal[xref:token/ERC20.adoc#TokenTimelock-releaseTime--[`TokenTimelock.releaseTime`]]
- :xref-TokenTimelock-releaseTime: xref:token/ERC20.adoc#TokenTimelock-releaseTime--
- :TokenTimelock-release: pass:normal[xref:token/ERC20.adoc#TokenTimelock-release--[`TokenTimelock.release`]]
- :xref-TokenTimelock-release: xref:token/ERC20.adoc#TokenTimelock-release--
- :ERC777: pass:normal[xref:token/ERC777.adoc#ERC777[`ERC777`]]
- :xref-ERC777: xref:token/ERC777.adoc#ERC777
- :ERC777-ERC1820_REGISTRY: pass:normal[xref:token/ERC777.adoc#ERC777-ERC1820_REGISTRY-contract-IERC1820Registry[`ERC777.ERC1820_REGISTRY`]]
- :xref-ERC777-ERC1820_REGISTRY: xref:token/ERC777.adoc#ERC777-ERC1820_REGISTRY-contract-IERC1820Registry
- :ERC777-constructor: pass:normal[xref:token/ERC777.adoc#ERC777-constructor-string-string-address---[`ERC777.constructor`]]
- :xref-ERC777-constructor: xref:token/ERC777.adoc#ERC777-constructor-string-string-address---
- :ERC777-name: pass:normal[xref:token/ERC777.adoc#ERC777-name--[`ERC777.name`]]
- :xref-ERC777-name: xref:token/ERC777.adoc#ERC777-name--
- :ERC777-symbol: pass:normal[xref:token/ERC777.adoc#ERC777-symbol--[`ERC777.symbol`]]
- :xref-ERC777-symbol: xref:token/ERC777.adoc#ERC777-symbol--
- :ERC777-decimals: pass:normal[xref:token/ERC777.adoc#ERC777-decimals--[`ERC777.decimals`]]
- :xref-ERC777-decimals: xref:token/ERC777.adoc#ERC777-decimals--
- :ERC777-granularity: pass:normal[xref:token/ERC777.adoc#ERC777-granularity--[`ERC777.granularity`]]
- :xref-ERC777-granularity: xref:token/ERC777.adoc#ERC777-granularity--
- :ERC777-totalSupply: pass:normal[xref:token/ERC777.adoc#ERC777-totalSupply--[`ERC777.totalSupply`]]
- :xref-ERC777-totalSupply: xref:token/ERC777.adoc#ERC777-totalSupply--
- :ERC777-balanceOf: pass:normal[xref:token/ERC777.adoc#ERC777-balanceOf-address-[`ERC777.balanceOf`]]
- :xref-ERC777-balanceOf: xref:token/ERC777.adoc#ERC777-balanceOf-address-
- :ERC777-send: pass:normal[xref:token/ERC777.adoc#ERC777-send-address-uint256-bytes-[`ERC777.send`]]
- :xref-ERC777-send: xref:token/ERC777.adoc#ERC777-send-address-uint256-bytes-
- :ERC777-transfer: pass:normal[xref:token/ERC777.adoc#ERC777-transfer-address-uint256-[`ERC777.transfer`]]
- :xref-ERC777-transfer: xref:token/ERC777.adoc#ERC777-transfer-address-uint256-
- :ERC777-burn: pass:normal[xref:token/ERC777.adoc#ERC777-burn-uint256-bytes-[`ERC777.burn`]]
- :xref-ERC777-burn: xref:token/ERC777.adoc#ERC777-burn-uint256-bytes-
- :ERC777-isOperatorFor: pass:normal[xref:token/ERC777.adoc#ERC777-isOperatorFor-address-address-[`ERC777.isOperatorFor`]]
- :xref-ERC777-isOperatorFor: xref:token/ERC777.adoc#ERC777-isOperatorFor-address-address-
- :ERC777-authorizeOperator: pass:normal[xref:token/ERC777.adoc#ERC777-authorizeOperator-address-[`ERC777.authorizeOperator`]]
- :xref-ERC777-authorizeOperator: xref:token/ERC777.adoc#ERC777-authorizeOperator-address-
- :ERC777-revokeOperator: pass:normal[xref:token/ERC777.adoc#ERC777-revokeOperator-address-[`ERC777.revokeOperator`]]
- :xref-ERC777-revokeOperator: xref:token/ERC777.adoc#ERC777-revokeOperator-address-
- :ERC777-defaultOperators: pass:normal[xref:token/ERC777.adoc#ERC777-defaultOperators--[`ERC777.defaultOperators`]]
- :xref-ERC777-defaultOperators: xref:token/ERC777.adoc#ERC777-defaultOperators--
- :ERC777-operatorSend: pass:normal[xref:token/ERC777.adoc#ERC777-operatorSend-address-address-uint256-bytes-bytes-[`ERC777.operatorSend`]]
- :xref-ERC777-operatorSend: xref:token/ERC777.adoc#ERC777-operatorSend-address-address-uint256-bytes-bytes-
- :ERC777-operatorBurn: pass:normal[xref:token/ERC777.adoc#ERC777-operatorBurn-address-uint256-bytes-bytes-[`ERC777.operatorBurn`]]
- :xref-ERC777-operatorBurn: xref:token/ERC777.adoc#ERC777-operatorBurn-address-uint256-bytes-bytes-
- :ERC777-allowance: pass:normal[xref:token/ERC777.adoc#ERC777-allowance-address-address-[`ERC777.allowance`]]
- :xref-ERC777-allowance: xref:token/ERC777.adoc#ERC777-allowance-address-address-
- :ERC777-approve: pass:normal[xref:token/ERC777.adoc#ERC777-approve-address-uint256-[`ERC777.approve`]]
- :xref-ERC777-approve: xref:token/ERC777.adoc#ERC777-approve-address-uint256-
- :ERC777-transferFrom: pass:normal[xref:token/ERC777.adoc#ERC777-transferFrom-address-address-uint256-[`ERC777.transferFrom`]]
- :xref-ERC777-transferFrom: xref:token/ERC777.adoc#ERC777-transferFrom-address-address-uint256-
- :ERC777-_mint: pass:normal[xref:token/ERC777.adoc#ERC777-_mint-address-address-uint256-bytes-bytes-[`ERC777._mint`]]
- :xref-ERC777-_mint: xref:token/ERC777.adoc#ERC777-_mint-address-address-uint256-bytes-bytes-
- :ERC777-_send: pass:normal[xref:token/ERC777.adoc#ERC777-_send-address-address-address-uint256-bytes-bytes-bool-[`ERC777._send`]]
- :xref-ERC777-_send: xref:token/ERC777.adoc#ERC777-_send-address-address-address-uint256-bytes-bytes-bool-
- :ERC777-_burn: pass:normal[xref:token/ERC777.adoc#ERC777-_burn-address-address-uint256-bytes-bytes-[`ERC777._burn`]]
- :xref-ERC777-_burn: xref:token/ERC777.adoc#ERC777-_burn-address-address-uint256-bytes-bytes-
- :ERC777-_approve: pass:normal[xref:token/ERC777.adoc#ERC777-_approve-address-address-uint256-[`ERC777._approve`]]
- :xref-ERC777-_approve: xref:token/ERC777.adoc#ERC777-_approve-address-address-uint256-
- :ERC777-_callTokensToSend: pass:normal[xref:token/ERC777.adoc#ERC777-_callTokensToSend-address-address-address-uint256-bytes-bytes-[`ERC777._callTokensToSend`]]
- :xref-ERC777-_callTokensToSend: xref:token/ERC777.adoc#ERC777-_callTokensToSend-address-address-address-uint256-bytes-bytes-
- :ERC777-_callTokensReceived: pass:normal[xref:token/ERC777.adoc#ERC777-_callTokensReceived-address-address-address-uint256-bytes-bytes-bool-[`ERC777._callTokensReceived`]]
- :xref-ERC777-_callTokensReceived: xref:token/ERC777.adoc#ERC777-_callTokensReceived-address-address-address-uint256-bytes-bytes-bool-
- :IERC777: pass:normal[xref:token/ERC777.adoc#IERC777[`IERC777`]]
- :xref-IERC777: xref:token/ERC777.adoc#IERC777
- :IERC777-name: pass:normal[xref:token/ERC777.adoc#IERC777-name--[`IERC777.name`]]
- :xref-IERC777-name: xref:token/ERC777.adoc#IERC777-name--
- :IERC777-symbol: pass:normal[xref:token/ERC777.adoc#IERC777-symbol--[`IERC777.symbol`]]
- :xref-IERC777-symbol: xref:token/ERC777.adoc#IERC777-symbol--
- :IERC777-granularity: pass:normal[xref:token/ERC777.adoc#IERC777-granularity--[`IERC777.granularity`]]
- :xref-IERC777-granularity: xref:token/ERC777.adoc#IERC777-granularity--
- :IERC777-totalSupply: pass:normal[xref:token/ERC777.adoc#IERC777-totalSupply--[`IERC777.totalSupply`]]
- :xref-IERC777-totalSupply: xref:token/ERC777.adoc#IERC777-totalSupply--
- :IERC777-balanceOf: pass:normal[xref:token/ERC777.adoc#IERC777-balanceOf-address-[`IERC777.balanceOf`]]
- :xref-IERC777-balanceOf: xref:token/ERC777.adoc#IERC777-balanceOf-address-
- :IERC777-send: pass:normal[xref:token/ERC777.adoc#IERC777-send-address-uint256-bytes-[`IERC777.send`]]
- :xref-IERC777-send: xref:token/ERC777.adoc#IERC777-send-address-uint256-bytes-
- :IERC777-burn: pass:normal[xref:token/ERC777.adoc#IERC777-burn-uint256-bytes-[`IERC777.burn`]]
- :xref-IERC777-burn: xref:token/ERC777.adoc#IERC777-burn-uint256-bytes-
- :IERC777-isOperatorFor: pass:normal[xref:token/ERC777.adoc#IERC777-isOperatorFor-address-address-[`IERC777.isOperatorFor`]]
- :xref-IERC777-isOperatorFor: xref:token/ERC777.adoc#IERC777-isOperatorFor-address-address-
- :IERC777-authorizeOperator: pass:normal[xref:token/ERC777.adoc#IERC777-authorizeOperator-address-[`IERC777.authorizeOperator`]]
- :xref-IERC777-authorizeOperator: xref:token/ERC777.adoc#IERC777-authorizeOperator-address-
- :IERC777-revokeOperator: pass:normal[xref:token/ERC777.adoc#IERC777-revokeOperator-address-[`IERC777.revokeOperator`]]
- :xref-IERC777-revokeOperator: xref:token/ERC777.adoc#IERC777-revokeOperator-address-
- :IERC777-defaultOperators: pass:normal[xref:token/ERC777.adoc#IERC777-defaultOperators--[`IERC777.defaultOperators`]]
- :xref-IERC777-defaultOperators: xref:token/ERC777.adoc#IERC777-defaultOperators--
- :IERC777-operatorSend: pass:normal[xref:token/ERC777.adoc#IERC777-operatorSend-address-address-uint256-bytes-bytes-[`IERC777.operatorSend`]]
- :xref-IERC777-operatorSend: xref:token/ERC777.adoc#IERC777-operatorSend-address-address-uint256-bytes-bytes-
- :IERC777-operatorBurn: pass:normal[xref:token/ERC777.adoc#IERC777-operatorBurn-address-uint256-bytes-bytes-[`IERC777.operatorBurn`]]
- :xref-IERC777-operatorBurn: xref:token/ERC777.adoc#IERC777-operatorBurn-address-uint256-bytes-bytes-
- :IERC777-Sent: pass:normal[xref:token/ERC777.adoc#IERC777-Sent-address-address-address-uint256-bytes-bytes-[`IERC777.Sent`]]
- :xref-IERC777-Sent: xref:token/ERC777.adoc#IERC777-Sent-address-address-address-uint256-bytes-bytes-
- :IERC777-Minted: pass:normal[xref:token/ERC777.adoc#IERC777-Minted-address-address-uint256-bytes-bytes-[`IERC777.Minted`]]
- :xref-IERC777-Minted: xref:token/ERC777.adoc#IERC777-Minted-address-address-uint256-bytes-bytes-
- :IERC777-Burned: pass:normal[xref:token/ERC777.adoc#IERC777-Burned-address-address-uint256-bytes-bytes-[`IERC777.Burned`]]
- :xref-IERC777-Burned: xref:token/ERC777.adoc#IERC777-Burned-address-address-uint256-bytes-bytes-
- :IERC777-AuthorizedOperator: pass:normal[xref:token/ERC777.adoc#IERC777-AuthorizedOperator-address-address-[`IERC777.AuthorizedOperator`]]
- :xref-IERC777-AuthorizedOperator: xref:token/ERC777.adoc#IERC777-AuthorizedOperator-address-address-
- :IERC777-RevokedOperator: pass:normal[xref:token/ERC777.adoc#IERC777-RevokedOperator-address-address-[`IERC777.RevokedOperator`]]
- :xref-IERC777-RevokedOperator: xref:token/ERC777.adoc#IERC777-RevokedOperator-address-address-
- :IERC777Recipient: pass:normal[xref:token/ERC777.adoc#IERC777Recipient[`IERC777Recipient`]]
- :xref-IERC777Recipient: xref:token/ERC777.adoc#IERC777Recipient
- :IERC777Recipient-tokensReceived: pass:normal[xref:token/ERC777.adoc#IERC777Recipient-tokensReceived-address-address-address-uint256-bytes-bytes-[`IERC777Recipient.tokensReceived`]]
- :xref-IERC777Recipient-tokensReceived: xref:token/ERC777.adoc#IERC777Recipient-tokensReceived-address-address-address-uint256-bytes-bytes-
- :IERC777Sender: pass:normal[xref:token/ERC777.adoc#IERC777Sender[`IERC777Sender`]]
- :xref-IERC777Sender: xref:token/ERC777.adoc#IERC777Sender
- :IERC777Sender-tokensToSend: pass:normal[xref:token/ERC777.adoc#IERC777Sender-tokensToSend-address-address-address-uint256-bytes-bytes-[`IERC777Sender.tokensToSend`]]
- :xref-IERC777Sender-tokensToSend: xref:token/ERC777.adoc#IERC777Sender-tokensToSend-address-address-address-uint256-bytes-bytes-
- = Gas Station Network (GSN)
- _Available since v2.4.0._
- This set of contracts provide all the tools required to make a contract callable via the https://gsn.openzeppelin.com[Gas Station Network].
- TIP: If you're new to the GSN, head over to our xref:learn::sending-gasless-transactions.adoc[overview of the system] and basic guide to xref:ROOT:gsn.adoc[creating a GSN-capable contract].
- The core contract a recipient must inherit from is {GSNRecipient}: it includes all necessary interfaces, as well as some helper methods to make interacting with the GSN easier.
- Utilities to make writing xref:ROOT:gsn-strategies.adoc[GSN strategies] easy are available in {GSNRecipient}, or you can simply use one of our pre-made strategies:
- * {GSNRecipientERC20Fee} charges the end user for gas costs in an application-specific xref:ROOT:tokens.adoc#ERC20[ERC20 token]
- * {GSNRecipientSignature} accepts all relayed calls that have been signed by a trusted third party (e.g. a private key in a backend)
- You can also take a look at the two contract interfaces that make up the GSN protocol: {IRelayRecipient} and {IRelayHub}, but you won't need to use those directly.
- == Recipient
- :GSNRecipient: pass:normal[xref:#GSNRecipient[`GSNRecipient`]]
- :POST_RELAYED_CALL_MAX_GAS: pass:normal[xref:#GSNRecipient-POST_RELAYED_CALL_MAX_GAS-uint256[`POST_RELAYED_CALL_MAX_GAS`]]
- :getHubAddr: pass:normal[xref:#GSNRecipient-getHubAddr--[`getHubAddr`]]
- :_upgradeRelayHub: pass:normal[xref:#GSNRecipient-_upgradeRelayHub-address-[`_upgradeRelayHub`]]
- :relayHubVersion: pass:normal[xref:#GSNRecipient-relayHubVersion--[`relayHubVersion`]]
- :_withdrawDeposits: pass:normal[xref:#GSNRecipient-_withdrawDeposits-uint256-address-payable-[`_withdrawDeposits`]]
- :_msgSender: pass:normal[xref:#GSNRecipient-_msgSender--[`_msgSender`]]
- :_msgData: pass:normal[xref:#GSNRecipient-_msgData--[`_msgData`]]
- :preRelayedCall: pass:normal[xref:#GSNRecipient-preRelayedCall-bytes-[`preRelayedCall`]]
- :_preRelayedCall: pass:normal[xref:#GSNRecipient-_preRelayedCall-bytes-[`_preRelayedCall`]]
- :postRelayedCall: pass:normal[xref:#GSNRecipient-postRelayedCall-bytes-bool-uint256-bytes32-[`postRelayedCall`]]
- :_postRelayedCall: pass:normal[xref:#GSNRecipient-_postRelayedCall-bytes-bool-uint256-bytes32-[`_postRelayedCall`]]
- :_approveRelayedCall: pass:normal[xref:#GSNRecipient-_approveRelayedCall--[`_approveRelayedCall`]]
- :_approveRelayedCall: pass:normal[xref:#GSNRecipient-_approveRelayedCall-bytes-[`_approveRelayedCall`]]
- :_rejectRelayedCall: pass:normal[xref:#GSNRecipient-_rejectRelayedCall-uint256-[`_rejectRelayedCall`]]
- :_computeCharge: pass:normal[xref:#GSNRecipient-_computeCharge-uint256-uint256-uint256-[`_computeCharge`]]
- :RelayHubChanged: pass:normal[xref:#GSNRecipient-RelayHubChanged-address-address-[`RelayHubChanged`]]
- [.contract]
- [[GSNRecipient]]
- === `GSNRecipient`
- Base GSN recipient contract: includes the {IRelayRecipient} interface
- and enables GSN support on all contracts in the inheritance tree.
- TIP: This contract is abstract. The functions {IRelayRecipient-acceptRelayedCall},
- {_preRelayedCall}, and {_postRelayedCall} are not implemented and must be
- provided by derived contracts. See the
- xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategies] for more
- information on how to use the pre-built {GSNRecipientSignature} and
- {GSNRecipientERC20Fee}, or how to write your own.
- [.contract-index]
- .Functions
- --
- * {xref-GSNRecipient-getHubAddr}[`getHubAddr()`]
- * {xref-GSNRecipient-_upgradeRelayHub}[`_upgradeRelayHub(newRelayHub)`]
- * {xref-GSNRecipient-relayHubVersion}[`relayHubVersion()`]
- * {xref-GSNRecipient-_withdrawDeposits}[`_withdrawDeposits(amount, payee)`]
- * {xref-GSNRecipient-_msgSender}[`_msgSender()`]
- * {xref-GSNRecipient-_msgData}[`_msgData()`]
- * {xref-GSNRecipient-preRelayedCall}[`preRelayedCall(context)`]
- * {xref-GSNRecipient-_preRelayedCall}[`_preRelayedCall(context)`]
- * {xref-GSNRecipient-postRelayedCall}[`postRelayedCall(context, success, actualCharge, preRetVal)`]
- * {xref-GSNRecipient-_postRelayedCall}[`_postRelayedCall(context, success, actualCharge, preRetVal)`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall()`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall(context)`]
- * {xref-GSNRecipient-_rejectRelayedCall}[`_rejectRelayedCall(errorCode)`]
- * {xref-GSNRecipient-_computeCharge}[`_computeCharge(gas, gasPrice, serviceFee)`]
- [.contract-subindex-inherited]
- .Context
- * {xref-Context-constructor}[`constructor()`]
- [.contract-subindex-inherited]
- .IRelayRecipient
- * {xref-IRelayRecipient-acceptRelayedCall}[`acceptRelayedCall(relay, from, encodedFunction, transactionFee, gasPrice, gasLimit, nonce, approvalData, maxPossibleCharge)`]
- --
- [.contract-index]
- .Events
- --
- * {xref-GSNRecipient-RelayHubChanged}[`RelayHubChanged(oldRelayHub, newRelayHub)`]
- [.contract-subindex-inherited]
- .Context
- [.contract-subindex-inherited]
- .IRelayRecipient
- --
- [.contract-item]
- [[GSNRecipient-getHubAddr--]]
- ==== `pass:normal[getHubAddr() → [.var-type\]#address#]` [.item-kind]#public#
- Returns the address of the {IRelayHub} contract for this recipient.
- [.contract-item]
- [[GSNRecipient-_upgradeRelayHub-address-]]
- ==== `pass:normal[_upgradeRelayHub([.var-type\]#address# [.var-name\]#newRelayHub#)]` [.item-kind]#internal#
- Switches to a new {IRelayHub} instance. This method is added for future-proofing: there's no reason to not
- use the default instance.
- IMPORTANT: After upgrading, the {GSNRecipient} will no longer be able to receive relayed calls from the old
- {IRelayHub} instance. Additionally, all funds should be previously withdrawn via {_withdrawDeposits}.
- [.contract-item]
- [[GSNRecipient-relayHubVersion--]]
- ==== `pass:normal[relayHubVersion() → [.var-type\]#string#]` [.item-kind]#public#
- Returns the version string of the {IRelayHub} for which this recipient implementation was built. If
- {_upgradeRelayHub} is used, the new {IRelayHub} instance should be compatible with this version.
- [.contract-item]
- [[GSNRecipient-_withdrawDeposits-uint256-address-payable-]]
- ==== `pass:normal[_withdrawDeposits([.var-type\]#uint256# [.var-name\]#amount#, [.var-type\]#address payable# [.var-name\]#payee#)]` [.item-kind]#internal#
- Withdraws the recipient's deposits in `RelayHub`.
- Derived contracts should expose this in an external interface with proper access control.
- [.contract-item]
- [[GSNRecipient-_msgSender--]]
- ==== `pass:normal[_msgSender() → [.var-type\]#address payable#]` [.item-kind]#internal#
- Replacement for msg.sender. Returns the actual sender of a transaction: msg.sender for regular transactions,
- and the end-user for GSN relayed calls (where msg.sender is actually `RelayHub`).
- IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead.
- [.contract-item]
- [[GSNRecipient-_msgData--]]
- ==== `pass:normal[_msgData() → [.var-type\]#bytes#]` [.item-kind]#internal#
- Replacement for msg.data. Returns the actual calldata of a transaction: msg.data for regular transactions,
- and a reduced version for GSN relayed calls (where msg.data contains additional information).
- IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.data`, and use {_msgData} instead.
- [.contract-item]
- [[GSNRecipient-preRelayedCall-bytes-]]
- ==== `pass:normal[preRelayedCall([.var-type\]#bytes# [.var-name\]#context#) → [.var-type\]#bytes32#]` [.item-kind]#external#
- See `IRelayRecipient.preRelayedCall`.
- This function should not be overriden directly, use `_preRelayedCall` instead.
- * Requirements:
- - the caller must be the `RelayHub` contract.
- [.contract-item]
- [[GSNRecipient-_preRelayedCall-bytes-]]
- ==== `pass:normal[_preRelayedCall([.var-type\]#bytes# [.var-name\]#context#) → [.var-type\]#bytes32#]` [.item-kind]#internal#
- See `IRelayRecipient.preRelayedCall`.
- Called by `GSNRecipient.preRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts
- must implement this function with any relayed-call preprocessing they may wish to do.
- [.contract-item]
- [[GSNRecipient-postRelayedCall-bytes-bool-uint256-bytes32-]]
- ==== `pass:normal[postRelayedCall([.var-type\]#bytes# [.var-name\]#context#, [.var-type\]#bool# [.var-name\]#success#, [.var-type\]#uint256# [.var-name\]#actualCharge#, [.var-type\]#bytes32# [.var-name\]#preRetVal#)]` [.item-kind]#external#
- See `IRelayRecipient.postRelayedCall`.
- This function should not be overriden directly, use `_postRelayedCall` instead.
- * Requirements:
- - the caller must be the `RelayHub` contract.
- [.contract-item]
- [[GSNRecipient-_postRelayedCall-bytes-bool-uint256-bytes32-]]
- ==== `pass:normal[_postRelayedCall([.var-type\]#bytes# [.var-name\]#context#, [.var-type\]#bool# [.var-name\]#success#, [.var-type\]#uint256# [.var-name\]#actualCharge#, [.var-type\]#bytes32# [.var-name\]#preRetVal#)]` [.item-kind]#internal#
- See `IRelayRecipient.postRelayedCall`.
- Called by `GSNRecipient.postRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts
- must implement this function with any relayed-call postprocessing they may wish to do.
- [.contract-item]
- [[GSNRecipient-_approveRelayedCall--]]
- ==== `pass:normal[_approveRelayedCall() → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#internal#
- Return this in acceptRelayedCall to proceed with the execution of a relayed call. Note that this contract
- will be charged a fee by RelayHub
- [.contract-item]
- [[GSNRecipient-_approveRelayedCall-bytes-]]
- ==== `pass:normal[_approveRelayedCall([.var-type\]#bytes# [.var-name\]#context#) → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#internal#
- See `GSNRecipient._approveRelayedCall`.
- This overload forwards `context` to _preRelayedCall and _postRelayedCall.
- [.contract-item]
- [[GSNRecipient-_rejectRelayedCall-uint256-]]
- ==== `pass:normal[_rejectRelayedCall([.var-type\]#uint256# [.var-name\]#errorCode#) → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#internal#
- Return this in acceptRelayedCall to impede execution of a relayed call. No fees will be charged.
- [.contract-item]
- [[GSNRecipient-_computeCharge-uint256-uint256-uint256-]]
- ==== `pass:normal[_computeCharge([.var-type\]#uint256# [.var-name\]#gas#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#serviceFee#) → [.var-type\]#uint256#]` [.item-kind]#internal#
- [.contract-item]
- [[GSNRecipient-RelayHubChanged-address-address-]]
- ==== `pass:normal[RelayHubChanged([.var-type\]#address# [.var-name\]#oldRelayHub#, [.var-type\]#address# [.var-name\]#newRelayHub#)]` [.item-kind]#event#
- Emitted when a contract changes its {IRelayHub} contract to a new one.
- == Strategies
- :GSNRecipientSignature: pass:normal[xref:#GSNRecipientSignature[`GSNRecipientSignature`]]
- :constructor: pass:normal[xref:#GSNRecipientSignature-constructor-address-[`constructor`]]
- :acceptRelayedCall: pass:normal[xref:#GSNRecipientSignature-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`acceptRelayedCall`]]
- :_preRelayedCall: pass:normal[xref:#GSNRecipientSignature-_preRelayedCall-bytes-[`_preRelayedCall`]]
- :_postRelayedCall: pass:normal[xref:#GSNRecipientSignature-_postRelayedCall-bytes-bool-uint256-bytes32-[`_postRelayedCall`]]
- [.contract]
- [[GSNRecipientSignature]]
- === `GSNRecipientSignature`
- A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that allows relayed transactions through when they are
- accompanied by the signature of a trusted signer. The intent is for this signature to be generated by a server that
- performs validations off-chain. Note that nothing is charged to the user in this scheme. Thus, the server should make
- sure to account for this in their economic and threat model.
- [.contract-index]
- .Functions
- --
- * {xref-GSNRecipientSignature-constructor}[`constructor(trustedSigner)`]
- * {xref-GSNRecipientSignature-acceptRelayedCall}[`acceptRelayedCall(relay, from, encodedFunction, transactionFee, gasPrice, gasLimit, nonce, approvalData, _)`]
- * {xref-GSNRecipientSignature-_preRelayedCall}[`_preRelayedCall(_)`]
- * {xref-GSNRecipientSignature-_postRelayedCall}[`_postRelayedCall(_, _, _, _)`]
- [.contract-subindex-inherited]
- .GSNRecipient
- * {xref-GSNRecipient-getHubAddr}[`getHubAddr()`]
- * {xref-GSNRecipient-_upgradeRelayHub}[`_upgradeRelayHub(newRelayHub)`]
- * {xref-GSNRecipient-relayHubVersion}[`relayHubVersion()`]
- * {xref-GSNRecipient-_withdrawDeposits}[`_withdrawDeposits(amount, payee)`]
- * {xref-GSNRecipient-_msgSender}[`_msgSender()`]
- * {xref-GSNRecipient-_msgData}[`_msgData()`]
- * {xref-GSNRecipient-preRelayedCall}[`preRelayedCall(context)`]
- * {xref-GSNRecipient-postRelayedCall}[`postRelayedCall(context, success, actualCharge, preRetVal)`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall()`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall(context)`]
- * {xref-GSNRecipient-_rejectRelayedCall}[`_rejectRelayedCall(errorCode)`]
- * {xref-GSNRecipient-_computeCharge}[`_computeCharge(gas, gasPrice, serviceFee)`]
- [.contract-subindex-inherited]
- .Context
- [.contract-subindex-inherited]
- .IRelayRecipient
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .GSNRecipient
- * {xref-GSNRecipient-RelayHubChanged}[`RelayHubChanged(oldRelayHub, newRelayHub)`]
- [.contract-subindex-inherited]
- .Context
- [.contract-subindex-inherited]
- .IRelayRecipient
- --
- [.contract-item]
- [[GSNRecipientSignature-constructor-address-]]
- ==== `pass:normal[constructor([.var-type\]#address# [.var-name\]#trustedSigner#)]` [.item-kind]#public#
- Sets the trusted signer that is going to be producing signatures to approve relayed calls.
- [.contract-item]
- [[GSNRecipientSignature-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-]]
- ==== `pass:normal[acceptRelayedCall([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#bytes# [.var-name\]#encodedFunction#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#gasLimit#, [.var-type\]#uint256# [.var-name\]#nonce#, [.var-type\]#bytes# [.var-name\]#approvalData#, [.var-type\]#uint256#) → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#external#
- Ensures that only transactions with a trusted signature can be relayed through the GSN.
- [.contract-item]
- [[GSNRecipientSignature-_preRelayedCall-bytes-]]
- ==== `pass:normal[_preRelayedCall([.var-type\]#bytes#) → [.var-type\]#bytes32#]` [.item-kind]#internal#
- [.contract-item]
- [[GSNRecipientSignature-_postRelayedCall-bytes-bool-uint256-bytes32-]]
- ==== `pass:normal[_postRelayedCall([.var-type\]#bytes#, [.var-type\]#bool#, [.var-type\]#uint256#, [.var-type\]#bytes32#)]` [.item-kind]#internal#
- :GSNRecipientERC20Fee: pass:normal[xref:#GSNRecipientERC20Fee[`GSNRecipientERC20Fee`]]
- :constructor: pass:normal[xref:#GSNRecipientERC20Fee-constructor-string-string-[`constructor`]]
- :token: pass:normal[xref:#GSNRecipientERC20Fee-token--[`token`]]
- :_mint: pass:normal[xref:#GSNRecipientERC20Fee-_mint-address-uint256-[`_mint`]]
- :acceptRelayedCall: pass:normal[xref:#GSNRecipientERC20Fee-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`acceptRelayedCall`]]
- :_preRelayedCall: pass:normal[xref:#GSNRecipientERC20Fee-_preRelayedCall-bytes-[`_preRelayedCall`]]
- :_postRelayedCall: pass:normal[xref:#GSNRecipientERC20Fee-_postRelayedCall-bytes-bool-uint256-bytes32-[`_postRelayedCall`]]
- [.contract]
- [[GSNRecipientERC20Fee]]
- === `GSNRecipientERC20Fee`
- A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20
- token, which we refer to as the gas payment token. The amount charged is exactly the amount of Ether charged to the
- recipient. This means that the token is essentially pegged to the value of Ether.
- The distribution strategy of the gas payment token to users is not defined by this contract. It's a mintable token
- whose only minter is the recipient, so the strategy must be implemented in a derived contract, making use of the
- internal {_mint} function.
- [.contract-index]
- .Functions
- --
- * {xref-GSNRecipientERC20Fee-constructor}[`constructor(name, symbol)`]
- * {xref-GSNRecipientERC20Fee-token}[`token()`]
- * {xref-GSNRecipientERC20Fee-_mint}[`_mint(account, amount)`]
- * {xref-GSNRecipientERC20Fee-acceptRelayedCall}[`acceptRelayedCall(_, from, _, transactionFee, gasPrice, _, _, _, maxPossibleCharge)`]
- * {xref-GSNRecipientERC20Fee-_preRelayedCall}[`_preRelayedCall(context)`]
- * {xref-GSNRecipientERC20Fee-_postRelayedCall}[`_postRelayedCall(context, _, actualCharge, _)`]
- [.contract-subindex-inherited]
- .GSNRecipient
- * {xref-GSNRecipient-getHubAddr}[`getHubAddr()`]
- * {xref-GSNRecipient-_upgradeRelayHub}[`_upgradeRelayHub(newRelayHub)`]
- * {xref-GSNRecipient-relayHubVersion}[`relayHubVersion()`]
- * {xref-GSNRecipient-_withdrawDeposits}[`_withdrawDeposits(amount, payee)`]
- * {xref-GSNRecipient-_msgSender}[`_msgSender()`]
- * {xref-GSNRecipient-_msgData}[`_msgData()`]
- * {xref-GSNRecipient-preRelayedCall}[`preRelayedCall(context)`]
- * {xref-GSNRecipient-postRelayedCall}[`postRelayedCall(context, success, actualCharge, preRetVal)`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall()`]
- * {xref-GSNRecipient-_approveRelayedCall}[`_approveRelayedCall(context)`]
- * {xref-GSNRecipient-_rejectRelayedCall}[`_rejectRelayedCall(errorCode)`]
- * {xref-GSNRecipient-_computeCharge}[`_computeCharge(gas, gasPrice, serviceFee)`]
- [.contract-subindex-inherited]
- .Context
- [.contract-subindex-inherited]
- .IRelayRecipient
- --
- [.contract-index]
- .Events
- --
- [.contract-subindex-inherited]
- .GSNRecipient
- * {xref-GSNRecipient-RelayHubChanged}[`RelayHubChanged(oldRelayHub, newRelayHub)`]
- [.contract-subindex-inherited]
- .Context
- [.contract-subindex-inherited]
- .IRelayRecipient
- --
- [.contract-item]
- [[GSNRecipientERC20Fee-constructor-string-string-]]
- ==== `pass:normal[constructor([.var-type\]#string# [.var-name\]#name#, [.var-type\]#string# [.var-name\]#symbol#)]` [.item-kind]#public#
- The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.
- [.contract-item]
- [[GSNRecipientERC20Fee-token--]]
- ==== `pass:normal[token() → [.var-type\]#contract IERC20#]` [.item-kind]#public#
- Returns the gas payment token.
- [.contract-item]
- [[GSNRecipientERC20Fee-_mint-address-uint256-]]
- ==== `pass:normal[_mint([.var-type\]#address# [.var-name\]#account#, [.var-type\]#uint256# [.var-name\]#amount#)]` [.item-kind]#internal#
- Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms.
- [.contract-item]
- [[GSNRecipientERC20Fee-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-]]
- ==== `pass:normal[acceptRelayedCall([.var-type\]#address#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#bytes#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256#, [.var-type\]#uint256#, [.var-type\]#bytes#, [.var-type\]#uint256# [.var-name\]#maxPossibleCharge#) → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#external#
- Ensures that only users with enough gas payment token balance can have transactions relayed through the GSN.
- [.contract-item]
- [[GSNRecipientERC20Fee-_preRelayedCall-bytes-]]
- ==== `pass:normal[_preRelayedCall([.var-type\]#bytes# [.var-name\]#context#) → [.var-type\]#bytes32#]` [.item-kind]#internal#
- Implements the precharge to the user. The maximum possible charge (depending on gas limit, gas price, and
- fee) will be deducted from the user balance of gas payment token. Note that this is an overestimation of the
- actual charge, necessary because we cannot predict how much gas the execution will actually need. The remainder
- is returned to the user in {_postRelayedCall}.
- [.contract-item]
- [[GSNRecipientERC20Fee-_postRelayedCall-bytes-bool-uint256-bytes32-]]
- ==== `pass:normal[_postRelayedCall([.var-type\]#bytes# [.var-name\]#context#, [.var-type\]#bool#, [.var-type\]#uint256# [.var-name\]#actualCharge#, [.var-type\]#bytes32#)]` [.item-kind]#internal#
- Returns to the user the extra amount that was previously charged, once the actual execution cost is known.
- == Protocol
- :IRelayRecipient: pass:normal[xref:#IRelayRecipient[`IRelayRecipient`]]
- :getHubAddr: pass:normal[xref:#IRelayRecipient-getHubAddr--[`getHubAddr`]]
- :acceptRelayedCall: pass:normal[xref:#IRelayRecipient-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-[`acceptRelayedCall`]]
- :preRelayedCall: pass:normal[xref:#IRelayRecipient-preRelayedCall-bytes-[`preRelayedCall`]]
- :postRelayedCall: pass:normal[xref:#IRelayRecipient-postRelayedCall-bytes-bool-uint256-bytes32-[`postRelayedCall`]]
- [.contract]
- [[IRelayRecipient]]
- === `IRelayRecipient`
- Base interface for a contract that will be called via the GSN from {IRelayHub}.
- TIP: You don't need to write an implementation yourself! Inherit from {GSNRecipient} instead.
- [.contract-index]
- .Functions
- --
- * {xref-IRelayRecipient-getHubAddr}[`getHubAddr()`]
- * {xref-IRelayRecipient-acceptRelayedCall}[`acceptRelayedCall(relay, from, encodedFunction, transactionFee, gasPrice, gasLimit, nonce, approvalData, maxPossibleCharge)`]
- * {xref-IRelayRecipient-preRelayedCall}[`preRelayedCall(context)`]
- * {xref-IRelayRecipient-postRelayedCall}[`postRelayedCall(context, success, actualCharge, preRetVal)`]
- --
- [.contract-item]
- [[IRelayRecipient-getHubAddr--]]
- ==== `pass:normal[getHubAddr() → [.var-type\]#address#]` [.item-kind]#external#
- Returns the address of the {IRelayHub} instance this recipient interacts with.
- [.contract-item]
- [[IRelayRecipient-acceptRelayedCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-uint256-]]
- ==== `pass:normal[acceptRelayedCall([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#bytes# [.var-name\]#encodedFunction#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#gasLimit#, [.var-type\]#uint256# [.var-name\]#nonce#, [.var-type\]#bytes# [.var-name\]#approvalData#, [.var-type\]#uint256# [.var-name\]#maxPossibleCharge#) → [.var-type\]#uint256#, [.var-type\]#bytes#]` [.item-kind]#external#
- Called by {IRelayHub} to validate if this recipient accepts being charged for a relayed call. Note that the
- recipient will be charged regardless of the execution result of the relayed call (i.e. if it reverts or not).
- The relay request was originated by `from` and will be served by `relay`. `encodedFunction` is the relayed call
- calldata, so its first four bytes are the function selector. The relayed call will be forwarded `gasLimit` gas,
- and the transaction executed with a gas price of at least `gasPrice`. `relay`'s fee is `transactionFee`, and the
- recipient will be charged at most `maxPossibleCharge` (in wei). `nonce` is the sender's (`from`) nonce for
- replay attack protection in {IRelayHub}, and `approvalData` is a optional parameter that can be used to hold a signature
- over all or some of the previous values.
- Returns a tuple, where the first value is used to indicate approval (0) or rejection (custom non-zero error code,
- values 1 to 10 are reserved) and the second one is data to be passed to the other {IRelayRecipient} functions.
- {acceptRelayedCall} is called with 50k gas: if it runs out during execution, the request will be considered
- rejected. A regular revert will also trigger a rejection.
- [.contract-item]
- [[IRelayRecipient-preRelayedCall-bytes-]]
- ==== `pass:normal[preRelayedCall([.var-type\]#bytes# [.var-name\]#context#) → [.var-type\]#bytes32#]` [.item-kind]#external#
- Called by {IRelayHub} on approved relay call requests, before the relayed call is executed. This allows to e.g.
- pre-charge the sender of the transaction.
- `context` is the second value returned in the tuple by {acceptRelayedCall}.
- Returns a value to be passed to {postRelayedCall}.
- {preRelayedCall} is called with 100k gas: if it runs out during exection or otherwise reverts, the relayed call
- will not be executed, but the recipient will still be charged for the transaction's cost.
- [.contract-item]
- [[IRelayRecipient-postRelayedCall-bytes-bool-uint256-bytes32-]]
- ==== `pass:normal[postRelayedCall([.var-type\]#bytes# [.var-name\]#context#, [.var-type\]#bool# [.var-name\]#success#, [.var-type\]#uint256# [.var-name\]#actualCharge#, [.var-type\]#bytes32# [.var-name\]#preRetVal#)]` [.item-kind]#external#
- Called by {IRelayHub} on approved relay call requests, after the relayed call is executed. This allows to e.g.
- charge the user for the relayed call costs, return any overcharges from {preRelayedCall}, or perform
- contract-specific bookkeeping.
- `context` is the second value returned in the tuple by {acceptRelayedCall}. `success` is the execution status of
- the relayed call. `actualCharge` is an estimate of how much the recipient will be charged for the transaction,
- not including any gas used by {postRelayedCall} itself. `preRetVal` is {preRelayedCall}'s return value.
- {postRelayedCall} is called with 100k gas: if it runs out during execution or otherwise reverts, the relayed call
- and the call to {preRelayedCall} will be reverted retroactively, but the recipient will still be charged for the
- transaction's cost.
- :IRelayHub: pass:normal[xref:#IRelayHub[`IRelayHub`]]
- :stake: pass:normal[xref:#IRelayHub-stake-address-uint256-[`stake`]]
- :registerRelay: pass:normal[xref:#IRelayHub-registerRelay-uint256-string-[`registerRelay`]]
- :removeRelayByOwner: pass:normal[xref:#IRelayHub-removeRelayByOwner-address-[`removeRelayByOwner`]]
- :unstake: pass:normal[xref:#IRelayHub-unstake-address-[`unstake`]]
- :getRelay: pass:normal[xref:#IRelayHub-getRelay-address-[`getRelay`]]
- :depositFor: pass:normal[xref:#IRelayHub-depositFor-address-[`depositFor`]]
- :balanceOf: pass:normal[xref:#IRelayHub-balanceOf-address-[`balanceOf`]]
- :withdraw: pass:normal[xref:#IRelayHub-withdraw-uint256-address-payable-[`withdraw`]]
- :canRelay: pass:normal[xref:#IRelayHub-canRelay-address-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-[`canRelay`]]
- :relayCall: pass:normal[xref:#IRelayHub-relayCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-[`relayCall`]]
- :requiredGas: pass:normal[xref:#IRelayHub-requiredGas-uint256-[`requiredGas`]]
- :maxPossibleCharge: pass:normal[xref:#IRelayHub-maxPossibleCharge-uint256-uint256-uint256-[`maxPossibleCharge`]]
- :penalizeRepeatedNonce: pass:normal[xref:#IRelayHub-penalizeRepeatedNonce-bytes-bytes-bytes-bytes-[`penalizeRepeatedNonce`]]
- :penalizeIllegalTransaction: pass:normal[xref:#IRelayHub-penalizeIllegalTransaction-bytes-bytes-[`penalizeIllegalTransaction`]]
- :getNonce: pass:normal[xref:#IRelayHub-getNonce-address-[`getNonce`]]
- :Staked: pass:normal[xref:#IRelayHub-Staked-address-uint256-uint256-[`Staked`]]
- :RelayAdded: pass:normal[xref:#IRelayHub-RelayAdded-address-address-uint256-uint256-uint256-string-[`RelayAdded`]]
- :RelayRemoved: pass:normal[xref:#IRelayHub-RelayRemoved-address-uint256-[`RelayRemoved`]]
- :Unstaked: pass:normal[xref:#IRelayHub-Unstaked-address-uint256-[`Unstaked`]]
- :Deposited: pass:normal[xref:#IRelayHub-Deposited-address-address-uint256-[`Deposited`]]
- :Withdrawn: pass:normal[xref:#IRelayHub-Withdrawn-address-address-uint256-[`Withdrawn`]]
- :CanRelayFailed: pass:normal[xref:#IRelayHub-CanRelayFailed-address-address-address-bytes4-uint256-[`CanRelayFailed`]]
- :TransactionRelayed: pass:normal[xref:#IRelayHub-TransactionRelayed-address-address-address-bytes4-enum-IRelayHub-RelayCallStatus-uint256-[`TransactionRelayed`]]
- :Penalized: pass:normal[xref:#IRelayHub-Penalized-address-address-uint256-[`Penalized`]]
- [.contract]
- [[IRelayHub]]
- === `IRelayHub`
- Interface for `RelayHub`, the core contract of the GSN. Users should not need to interact with this contract
- directly.
- See the https://github.com/OpenZeppelin/openzeppelin-gsn-helpers[OpenZeppelin GSN helpers] for more information on
- how to deploy an instance of `RelayHub` on your local test network.
- [.contract-index]
- .Functions
- --
- * {xref-IRelayHub-stake}[`stake(relayaddr, unstakeDelay)`]
- * {xref-IRelayHub-registerRelay}[`registerRelay(transactionFee, url)`]
- * {xref-IRelayHub-removeRelayByOwner}[`removeRelayByOwner(relay)`]
- * {xref-IRelayHub-unstake}[`unstake(relay)`]
- * {xref-IRelayHub-getRelay}[`getRelay(relay)`]
- * {xref-IRelayHub-depositFor}[`depositFor(target)`]
- * {xref-IRelayHub-balanceOf}[`balanceOf(target)`]
- * {xref-IRelayHub-withdraw}[`withdraw(amount, dest)`]
- * {xref-IRelayHub-canRelay}[`canRelay(relay, from, to, encodedFunction, transactionFee, gasPrice, gasLimit, nonce, signature, approvalData)`]
- * {xref-IRelayHub-relayCall}[`relayCall(from, to, encodedFunction, transactionFee, gasPrice, gasLimit, nonce, signature, approvalData)`]
- * {xref-IRelayHub-requiredGas}[`requiredGas(relayedCallStipend)`]
- * {xref-IRelayHub-maxPossibleCharge}[`maxPossibleCharge(relayedCallStipend, gasPrice, transactionFee)`]
- * {xref-IRelayHub-penalizeRepeatedNonce}[`penalizeRepeatedNonce(unsignedTx1, signature1, unsignedTx2, signature2)`]
- * {xref-IRelayHub-penalizeIllegalTransaction}[`penalizeIllegalTransaction(unsignedTx, signature)`]
- * {xref-IRelayHub-getNonce}[`getNonce(from)`]
- --
- [.contract-index]
- .Events
- --
- * {xref-IRelayHub-Staked}[`Staked(relay, stake, unstakeDelay)`]
- * {xref-IRelayHub-RelayAdded}[`RelayAdded(relay, owner, transactionFee, stake, unstakeDelay, url)`]
- * {xref-IRelayHub-RelayRemoved}[`RelayRemoved(relay, unstakeTime)`]
- * {xref-IRelayHub-Unstaked}[`Unstaked(relay, stake)`]
- * {xref-IRelayHub-Deposited}[`Deposited(recipient, from, amount)`]
- * {xref-IRelayHub-Withdrawn}[`Withdrawn(account, dest, amount)`]
- * {xref-IRelayHub-CanRelayFailed}[`CanRelayFailed(relay, from, to, selector, reason)`]
- * {xref-IRelayHub-TransactionRelayed}[`TransactionRelayed(relay, from, to, selector, status, charge)`]
- * {xref-IRelayHub-Penalized}[`Penalized(relay, sender, amount)`]
- --
- [.contract-item]
- [[IRelayHub-stake-address-uint256-]]
- ==== `pass:normal[stake([.var-type\]#address# [.var-name\]#relayaddr#, [.var-type\]#uint256# [.var-name\]#unstakeDelay#)]` [.item-kind]#external#
- Adds stake to a relay and sets its `unstakeDelay`. If the relay does not exist, it is created, and the caller
- of this function becomes its owner. If the relay already exists, only the owner can call this function. A relay
- cannot be its own owner.
- All Ether in this function call will be added to the relay's stake.
- Its unstake delay will be assigned to `unstakeDelay`, but the new value must be greater or equal to the current one.
- Emits a {Staked} event.
- [.contract-item]
- [[IRelayHub-registerRelay-uint256-string-]]
- ==== `pass:normal[registerRelay([.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#string# [.var-name\]#url#)]` [.item-kind]#external#
- Registers the caller as a relay.
- The relay must be staked for, and not be a contract (i.e. this function must be called directly from an EOA).
- This function can be called multiple times, emitting new {RelayAdded} events. Note that the received
- `transactionFee` is not enforced by {relayCall}.
- Emits a {RelayAdded} event.
- [.contract-item]
- [[IRelayHub-removeRelayByOwner-address-]]
- ==== `pass:normal[removeRelayByOwner([.var-type\]#address# [.var-name\]#relay#)]` [.item-kind]#external#
- Removes (deregisters) a relay. Unregistered (but staked for) relays can also be removed.
- Can only be called by the owner of the relay. After the relay's `unstakeDelay` has elapsed, {unstake} will be
- callable.
- Emits a {RelayRemoved} event.
- [.contract-item]
- [[IRelayHub-unstake-address-]]
- ==== `pass:normal[unstake([.var-type\]#address# [.var-name\]#relay#)]` [.item-kind]#external#
- [.contract-item]
- [[IRelayHub-getRelay-address-]]
- ==== `pass:normal[getRelay([.var-type\]#address# [.var-name\]#relay#) → [.var-type\]#uint256# [.var-name\]#totalStake#, [.var-type\]#uint256# [.var-name\]#unstakeDelay#, [.var-type\]#uint256# [.var-name\]#unstakeTime#, [.var-type\]#address payable# [.var-name\]#owner#, [.var-type\]#enum IRelayHub.RelayState# [.var-name\]#state#]` [.item-kind]#external#
- Returns a relay's status. Note that relays can be deleted when unstaked or penalized, causing this function
- to return an empty entry.
- [.contract-item]
- [[IRelayHub-depositFor-address-]]
- ==== `pass:normal[depositFor([.var-type\]#address# [.var-name\]#target#)]` [.item-kind]#external#
- Deposits Ether for a contract, so that it can receive (and pay for) relayed transactions.
- Unused balance can only be withdrawn by the contract itself, by calling {withdraw}.
- Emits a {Deposited} event.
- [.contract-item]
- [[IRelayHub-balanceOf-address-]]
- ==== `pass:normal[balanceOf([.var-type\]#address# [.var-name\]#target#) → [.var-type\]#uint256#]` [.item-kind]#external#
- Returns an account's deposits. These can be either a contracts's funds, or a relay owner's revenue.
- [.contract-item]
- [[IRelayHub-withdraw-uint256-address-payable-]]
- ==== `pass:normal[withdraw([.var-type\]#uint256# [.var-name\]#amount#, [.var-type\]#address payable# [.var-name\]#dest#)]` [.item-kind]#external#
- [.contract-item]
- [[IRelayHub-canRelay-address-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-]]
- ==== `pass:normal[canRelay([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#address# [.var-name\]#to#, [.var-type\]#bytes# [.var-name\]#encodedFunction#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#gasLimit#, [.var-type\]#uint256# [.var-name\]#nonce#, [.var-type\]#bytes# [.var-name\]#signature#, [.var-type\]#bytes# [.var-name\]#approvalData#) → [.var-type\]#uint256# [.var-name\]#status#, [.var-type\]#bytes# [.var-name\]#recipientContext#]` [.item-kind]#external#
- Checks if the `RelayHub` will accept a relayed operation.
- Multiple things must be true for this to happen:
- - all arguments must be signed for by the sender (`from`)
- - the sender's nonce must be the current one
- - the recipient must accept this transaction (via {acceptRelayedCall})
- Returns a `PreconditionCheck` value (`OK` when the transaction can be relayed), or a recipient-specific error
- code if it returns one in {acceptRelayedCall}.
- [.contract-item]
- [[IRelayHub-relayCall-address-address-bytes-uint256-uint256-uint256-uint256-bytes-bytes-]]
- ==== `pass:normal[relayCall([.var-type\]#address# [.var-name\]#from#, [.var-type\]#address# [.var-name\]#to#, [.var-type\]#bytes# [.var-name\]#encodedFunction#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#gasLimit#, [.var-type\]#uint256# [.var-name\]#nonce#, [.var-type\]#bytes# [.var-name\]#signature#, [.var-type\]#bytes# [.var-name\]#approvalData#)]` [.item-kind]#external#
- Relays a transaction.
- For this to succeed, multiple conditions must be met:
- - {canRelay} must `return PreconditionCheck.OK`
- - the sender must be a registered relay
- - the transaction's gas price must be larger or equal to the one that was requested by the sender
- - the transaction must have enough gas to not run out of gas if all internal transactions (calls to the
- recipient) use all gas available to them
- - the recipient must have enough balance to pay the relay for the worst-case scenario (i.e. when all gas is
- spent)
- If all conditions are met, the call will be relayed and the recipient charged. {preRelayedCall}, the encoded
- function and {postRelayedCall} will be called in that order.
- Parameters:
- - `from`: the client originating the request
- - `to`: the target {IRelayRecipient} contract
- - `encodedFunction`: the function call to relay, including data
- - `transactionFee`: fee (%) the relay takes over actual gas cost
- - `gasPrice`: gas price the client is willing to pay
- - `gasLimit`: gas to forward when calling the encoded function
- - `nonce`: client's nonce
- - `signature`: client's signature over all previous params, plus the relay and RelayHub addresses
- - `approvalData`: dapp-specific data forwared to {acceptRelayedCall}. This value is *not* verified by the
- `RelayHub`, but it still can be used for e.g. a signature.
- Emits a {TransactionRelayed} event.
- [.contract-item]
- [[IRelayHub-requiredGas-uint256-]]
- ==== `pass:normal[requiredGas([.var-type\]#uint256# [.var-name\]#relayedCallStipend#) → [.var-type\]#uint256#]` [.item-kind]#external#
- Returns how much gas should be forwarded to a call to {relayCall}, in order to relay a transaction that will
- spend up to `relayedCallStipend` gas.
- [.contract-item]
- [[IRelayHub-maxPossibleCharge-uint256-uint256-uint256-]]
- ==== `pass:normal[maxPossibleCharge([.var-type\]#uint256# [.var-name\]#relayedCallStipend#, [.var-type\]#uint256# [.var-name\]#gasPrice#, [.var-type\]#uint256# [.var-name\]#transactionFee#) → [.var-type\]#uint256#]` [.item-kind]#external#
- Returns the maximum recipient charge, given the amount of gas forwarded, gas price and relay fee.
- [.contract-item]
- [[IRelayHub-penalizeRepeatedNonce-bytes-bytes-bytes-bytes-]]
- ==== `pass:normal[penalizeRepeatedNonce([.var-type\]#bytes# [.var-name\]#unsignedTx1#, [.var-type\]#bytes# [.var-name\]#signature1#, [.var-type\]#bytes# [.var-name\]#unsignedTx2#, [.var-type\]#bytes# [.var-name\]#signature2#)]` [.item-kind]#external#
- Penalize a relay that signed two transactions using the same nonce (making only the first one valid) and
- different data (gas price, gas limit, etc. may be different).
- The (unsigned) transaction data and signature for both transactions must be provided.
- [.contract-item]
- [[IRelayHub-penalizeIllegalTransaction-bytes-bytes-]]
- ==== `pass:normal[penalizeIllegalTransaction([.var-type\]#bytes# [.var-name\]#unsignedTx#, [.var-type\]#bytes# [.var-name\]#signature#)]` [.item-kind]#external#
- Penalize a relay that sent a transaction that didn't target `RelayHub`'s {registerRelay} or {relayCall}.
- [.contract-item]
- [[IRelayHub-getNonce-address-]]
- ==== `pass:normal[getNonce([.var-type\]#address# [.var-name\]#from#) → [.var-type\]#uint256#]` [.item-kind]#external#
- Returns an account's nonce in `RelayHub`.
- [.contract-item]
- [[IRelayHub-Staked-address-uint256-uint256-]]
- ==== `pass:normal[Staked([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#uint256# [.var-name\]#stake#, [.var-type\]#uint256# [.var-name\]#unstakeDelay#)]` [.item-kind]#event#
- Emitted when a relay's stake or unstakeDelay are increased
- [.contract-item]
- [[IRelayHub-RelayAdded-address-address-uint256-uint256-uint256-string-]]
- ==== `pass:normal[RelayAdded([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#owner#, [.var-type\]#uint256# [.var-name\]#transactionFee#, [.var-type\]#uint256# [.var-name\]#stake#, [.var-type\]#uint256# [.var-name\]#unstakeDelay#, [.var-type\]#string# [.var-name\]#url#)]` [.item-kind]#event#
- Emitted when a relay is registered or re-registerd. Looking at these events (and filtering out
- {RelayRemoved} events) lets a client discover the list of available relays.
- [.contract-item]
- [[IRelayHub-RelayRemoved-address-uint256-]]
- ==== `pass:normal[RelayRemoved([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#uint256# [.var-name\]#unstakeTime#)]` [.item-kind]#event#
- Emitted when a relay is removed (deregistered). `unstakeTime` is the time when unstake will be callable.
- [.contract-item]
- [[IRelayHub-Unstaked-address-uint256-]]
- ==== `pass:normal[Unstaked([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#uint256# [.var-name\]#stake#)]` [.item-kind]#event#
- Emitted when a relay is unstaked for, including the returned stake.
- [.contract-item]
- [[IRelayHub-Deposited-address-address-uint256-]]
- ==== `pass:normal[Deposited([.var-type\]#address# [.var-name\]#recipient#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#uint256# [.var-name\]#amount#)]` [.item-kind]#event#
- Emitted when {depositFor} is called, including the amount and account that was funded.
- [.contract-item]
- [[IRelayHub-Withdrawn-address-address-uint256-]]
- ==== `pass:normal[Withdrawn([.var-type\]#address# [.var-name\]#account#, [.var-type\]#address# [.var-name\]#dest#, [.var-type\]#uint256# [.var-name\]#amount#)]` [.item-kind]#event#
- Emitted when an account withdraws funds from `RelayHub`.
- [.contract-item]
- [[IRelayHub-CanRelayFailed-address-address-address-bytes4-uint256-]]
- ==== `pass:normal[CanRelayFailed([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#address# [.var-name\]#to#, [.var-type\]#bytes4# [.var-name\]#selector#, [.var-type\]#uint256# [.var-name\]#reason#)]` [.item-kind]#event#
- Emitted when an attempt to relay a call failed.
- This can happen due to incorrect {relayCall} arguments, or the recipient not accepting the relayed call. The
- actual relayed call was not executed, and the recipient not charged.
- The `reason` parameter contains an error code: values 1-10 correspond to `PreconditionCheck` entries, and values
- over 10 are custom recipient error codes returned from {acceptRelayedCall}.
- [.contract-item]
- [[IRelayHub-TransactionRelayed-address-address-address-bytes4-enum-IRelayHub-RelayCallStatus-uint256-]]
- ==== `pass:normal[TransactionRelayed([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#from#, [.var-type\]#address# [.var-name\]#to#, [.var-type\]#bytes4# [.var-name\]#selector#, [.var-type\]#enum IRelayHub.RelayCallStatus# [.var-name\]#status#, [.var-type\]#uint256# [.var-name\]#charge#)]` [.item-kind]#event#
- Emitted when a transaction is relayed.
- Useful when monitoring a relay's operation and relayed calls to a contract
- Note that the actual encoded function might be reverted: this is indicated in the `status` parameter.
- `charge` is the Ether value deducted from the recipient's balance, paid to the relay's owner.
- [.contract-item]
- [[IRelayHub-Penalized-address-address-uint256-]]
- ==== `pass:normal[Penalized([.var-type\]#address# [.var-name\]#relay#, [.var-type\]#address# [.var-name\]#sender#, [.var-type\]#uint256# [.var-name\]#amount#)]` [.item-kind]#event#
- Emitted when a relay is penalized.
|