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