Showing preview only (5,602K chars total). Download the full file or copy to clipboard to get everything.
Repository: OpenZeppelin/openzeppelin-contracts
Branch: master
Commit: 45f032d1bcf1
Files: 847
Total size: 5.2 MB
Directory structure:
gitextract_wqwjgfld/
├── .changeset/
│ ├── better-tires-pull.md
│ ├── blue-jars-lay.md
│ ├── bright-cooks-brush.md
│ ├── chatty-dryers-joke.md
│ ├── config.json
│ ├── curly-pandas-flow.md
│ ├── flat-flies-hear.md
│ ├── floppy-symbols-burn.md
│ ├── fruity-coats-smash.md
│ ├── gentle-apples-dance.md
│ ├── happy-pants-decide.md
│ ├── legal-cameras-sin.md
│ ├── rare-bushes-march.md
│ ├── red-gifts-appear.md
│ ├── silver-falcons-lay.md
│ ├── smooth-cows-notice.md
│ ├── some-dolls-shine.md
│ ├── spicy-seals-bake.md
│ ├── sweet-houses-cheer.md
│ ├── tangy-jokes-begin.md
│ └── tidy-turkeys-build.md
├── .codecov.yml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actions/
│ │ ├── gas-compare/
│ │ │ └── action.yml
│ │ ├── setup/
│ │ │ └── action.yml
│ │ └── storage-layout/
│ │ └── action.yml
│ └── workflows/
│ ├── actionlint.yml
│ ├── changeset.yml
│ ├── checks.yml
│ ├── docs.yml
│ ├── formal-verification.yml
│ ├── release-cycle.yml
│ ├── release-upgradeable.yml
│ └── upgradeable.yml
├── .gitignore
├── .gitmodules
├── .husky/
│ └── pre-commit
├── .mocharc.js
├── .prettierrc
├── .solcover.js
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── FUNDING.json
├── GUIDELINES.md
├── LICENSE
├── README.md
├── RELEASING.md
├── SECURITY.md
├── audits/
│ ├── 2017-03.md
│ └── README.md
├── contracts/
│ ├── access/
│ │ ├── AccessControl.sol
│ │ ├── IAccessControl.sol
│ │ ├── Ownable.sol
│ │ ├── Ownable2Step.sol
│ │ ├── README.adoc
│ │ ├── extensions/
│ │ │ ├── AccessControlDefaultAdminRules.sol
│ │ │ ├── AccessControlEnumerable.sol
│ │ │ ├── IAccessControlDefaultAdminRules.sol
│ │ │ └── IAccessControlEnumerable.sol
│ │ └── manager/
│ │ ├── AccessManaged.sol
│ │ ├── AccessManager.sol
│ │ ├── AuthorityUtils.sol
│ │ ├── IAccessManaged.sol
│ │ ├── IAccessManager.sol
│ │ └── IAuthority.sol
│ ├── account/
│ │ ├── Account.sol
│ │ ├── README.adoc
│ │ ├── extensions/
│ │ │ ├── draft-AccountERC7579.sol
│ │ │ ├── draft-AccountERC7579Hooked.sol
│ │ │ └── draft-ERC7821.sol
│ │ └── utils/
│ │ ├── EIP7702Utils.sol
│ │ ├── draft-ERC4337Utils.sol
│ │ └── draft-ERC7579Utils.sol
│ ├── crosschain/
│ │ ├── CrosschainLinked.sol
│ │ ├── CrosschainRemoteExecutor.sol
│ │ ├── ERC7786Recipient.sol
│ │ ├── README.adoc
│ │ └── bridges/
│ │ ├── BridgeERC1155.sol
│ │ ├── BridgeERC20.sol
│ │ ├── BridgeERC721.sol
│ │ ├── BridgeERC7802.sol
│ │ └── abstract/
│ │ ├── BridgeFungible.sol
│ │ ├── BridgeMultiToken.sol
│ │ └── BridgeNonFungible.sol
│ ├── finance/
│ │ ├── README.adoc
│ │ ├── VestingWallet.sol
│ │ └── VestingWalletCliff.sol
│ ├── governance/
│ │ ├── Governor.sol
│ │ ├── IGovernor.sol
│ │ ├── README.adoc
│ │ ├── TimelockController.sol
│ │ ├── extensions/
│ │ │ ├── GovernorCountingFractional.sol
│ │ │ ├── GovernorCountingOverridable.sol
│ │ │ ├── GovernorCountingSimple.sol
│ │ │ ├── GovernorCrosschain.sol
│ │ │ ├── GovernorNoncesKeyed.sol
│ │ │ ├── GovernorPreventLateQuorum.sol
│ │ │ ├── GovernorProposalGuardian.sol
│ │ │ ├── GovernorSequentialProposalId.sol
│ │ │ ├── GovernorSettings.sol
│ │ │ ├── GovernorStorage.sol
│ │ │ ├── GovernorSuperQuorum.sol
│ │ │ ├── GovernorTimelockAccess.sol
│ │ │ ├── GovernorTimelockCompound.sol
│ │ │ ├── GovernorTimelockControl.sol
│ │ │ ├── GovernorVotes.sol
│ │ │ ├── GovernorVotesQuorumFraction.sol
│ │ │ └── GovernorVotesSuperQuorumFraction.sol
│ │ └── utils/
│ │ ├── IVotes.sol
│ │ ├── Votes.sol
│ │ └── VotesExtended.sol
│ ├── interfaces/
│ │ ├── IERC1155.sol
│ │ ├── IERC1155MetadataURI.sol
│ │ ├── IERC1155Receiver.sol
│ │ ├── IERC1271.sol
│ │ ├── IERC1363.sol
│ │ ├── IERC1363Receiver.sol
│ │ ├── IERC1363Spender.sol
│ │ ├── IERC165.sol
│ │ ├── IERC1820Implementer.sol
│ │ ├── IERC1820Registry.sol
│ │ ├── IERC1967.sol
│ │ ├── IERC20.sol
│ │ ├── IERC20Metadata.sol
│ │ ├── IERC2309.sol
│ │ ├── IERC2612.sol
│ │ ├── IERC2981.sol
│ │ ├── IERC3156.sol
│ │ ├── IERC3156FlashBorrower.sol
│ │ ├── IERC3156FlashLender.sol
│ │ ├── IERC4626.sol
│ │ ├── IERC4906.sol
│ │ ├── IERC5267.sol
│ │ ├── IERC5313.sol
│ │ ├── IERC5805.sol
│ │ ├── IERC6372.sol
│ │ ├── IERC6909.sol
│ │ ├── IERC721.sol
│ │ ├── IERC721Enumerable.sol
│ │ ├── IERC721Metadata.sol
│ │ ├── IERC721Receiver.sol
│ │ ├── IERC7751.sol
│ │ ├── IERC777.sol
│ │ ├── IERC777Recipient.sol
│ │ ├── IERC777Sender.sol
│ │ ├── IERC7913.sol
│ │ ├── README.adoc
│ │ ├── draft-IERC1822.sol
│ │ ├── draft-IERC4337.sol
│ │ ├── draft-IERC6093.sol
│ │ ├── draft-IERC7579.sol
│ │ ├── draft-IERC7674.sol
│ │ ├── draft-IERC7786.sol
│ │ ├── draft-IERC7802.sol
│ │ └── draft-IERC7821.sol
│ ├── metatx/
│ │ ├── ERC2771Context.sol
│ │ ├── ERC2771Forwarder.sol
│ │ └── README.adoc
│ ├── mocks/
│ │ ├── AccessManagedTarget.sol
│ │ ├── AccessManagerMock.sol
│ │ ├── ArraysMock.sol
│ │ ├── AuthorityMock.sol
│ │ ├── Base64Dirty.sol
│ │ ├── BatchCaller.sol
│ │ ├── CallReceiverMock.sol
│ │ ├── ConstructorMock.sol
│ │ ├── ContextMock.sol
│ │ ├── DummyImplementation.sol
│ │ ├── EIP712Verifier.sol
│ │ ├── ERC1271WalletMock.sol
│ │ ├── ERC165Mock.sol
│ │ ├── ERC2771ContextMock.sol
│ │ ├── ERC3156FlashBorrowerMock.sol
│ │ ├── EtherReceiverMock.sol
│ │ ├── InitializableMock.sol
│ │ ├── MerkleProofCustomHashMock.sol
│ │ ├── MerkleTreeMock.sol
│ │ ├── MulticallHelper.sol
│ │ ├── MultipleInheritanceInitializableMocks.sol
│ │ ├── PausableMock.sol
│ │ ├── ReentrancyAttack.sol
│ │ ├── ReentrancyMock.sol
│ │ ├── ReentrancyTransientMock.sol
│ │ ├── RegressionImplementation.sol
│ │ ├── SingleInheritanceInitializableMocks.sol
│ │ ├── Stateless.sol
│ │ ├── StorageSlotMock.sol
│ │ ├── TimelockReentrant.sol
│ │ ├── TransientSlotMock.sol
│ │ ├── UpgradeableBeaconMock.sol
│ │ ├── VotesExtendedMock.sol
│ │ ├── VotesMock.sol
│ │ ├── account/
│ │ │ ├── AccountMock.sol
│ │ │ ├── modules/
│ │ │ │ └── ERC7579Mock.sol
│ │ │ └── utils/
│ │ │ └── ERC7579UtilsMock.sol
│ │ ├── compound/
│ │ │ └── CompTimelock.sol
│ │ ├── crosschain/
│ │ │ ├── ERC7786GatewayMock.sol
│ │ │ └── ERC7786RecipientMock.sol
│ │ ├── docs/
│ │ │ ├── AccessManagerEnumerable.sol
│ │ │ ├── ERC20WithAutoMinerReward.sol
│ │ │ ├── ERC4626Fees.sol
│ │ │ ├── MyNFT.sol
│ │ │ ├── access-control/
│ │ │ │ ├── AccessControlERC20MintBase.sol
│ │ │ │ ├── AccessControlERC20MintMissing.sol
│ │ │ │ ├── AccessControlERC20MintOnlyRole.sol
│ │ │ │ ├── AccessControlModified.sol
│ │ │ │ ├── AccessManagedERC20MintBase.sol
│ │ │ │ └── MyContractOwnable.sol
│ │ │ ├── account/
│ │ │ │ ├── MyAccountEIP7702.sol
│ │ │ │ └── MyFactoryAccount.sol
│ │ │ ├── governance/
│ │ │ │ ├── MyGovernor.sol
│ │ │ │ ├── MyToken.sol
│ │ │ │ ├── MyTokenTimestampBased.sol
│ │ │ │ └── MyTokenWrapped.sol
│ │ │ ├── token/
│ │ │ │ ├── ERC1155/
│ │ │ │ │ ├── GameItems.sol
│ │ │ │ │ └── MyERC115HolderContract.sol
│ │ │ │ ├── ERC20/
│ │ │ │ │ └── GLDToken.sol
│ │ │ │ ├── ERC6909/
│ │ │ │ │ └── ERC6909GameItems.sol
│ │ │ │ └── ERC721/
│ │ │ │ └── GameItem.sol
│ │ │ └── utilities/
│ │ │ ├── Base64NFT.sol
│ │ │ └── Multicall.sol
│ │ ├── governance/
│ │ │ ├── GovernorCountingOverridableMock.sol
│ │ │ ├── GovernorCrosschain.sol
│ │ │ ├── GovernorFractionalMock.sol
│ │ │ ├── GovernorMock.sol
│ │ │ ├── GovernorNoncesKeyedMock.sol
│ │ │ ├── GovernorPreventLateQuorumMock.sol
│ │ │ ├── GovernorProposalGuardianMock.sol
│ │ │ ├── GovernorSequentialProposalIdMock.sol
│ │ │ ├── GovernorStorageMock.sol
│ │ │ ├── GovernorSuperQuorumMock.sol
│ │ │ ├── GovernorTimelockAccessMock.sol
│ │ │ ├── GovernorTimelockCompoundMock.sol
│ │ │ ├── GovernorTimelockControlMock.sol
│ │ │ ├── GovernorVoteMock.sol
│ │ │ ├── GovernorVotesSuperQuorumFractionMock.sol
│ │ │ └── GovernorWithParamsMock.sol
│ │ ├── proxy/
│ │ │ ├── BadBeacon.sol
│ │ │ ├── ClashingImplementation.sol
│ │ │ ├── ERC1967ProxyUnsafe.sol
│ │ │ └── UUPSUpgradeableMock.sol
│ │ ├── token/
│ │ │ ├── ERC1155ReceiverMock.sol
│ │ │ ├── ERC1363ForceApproveMock.sol
│ │ │ ├── ERC1363NoReturnMock.sol
│ │ │ ├── ERC1363ReceiverMock.sol
│ │ │ ├── ERC1363ReturnFalseMock.sol
│ │ │ ├── ERC1363SpenderMock.sol
│ │ │ ├── ERC20ApprovalMock.sol
│ │ │ ├── ERC20BridgeableMock.sol
│ │ │ ├── ERC20DecimalsMock.sol
│ │ │ ├── ERC20ExcessDecimalsMock.sol
│ │ │ ├── ERC20FlashMintMock.sol
│ │ │ ├── ERC20ForceApproveMock.sol
│ │ │ ├── ERC20GetterHelper.sol
│ │ │ ├── ERC20Mock.sol
│ │ │ ├── ERC20MulticallMock.sol
│ │ │ ├── ERC20NoReturnMock.sol
│ │ │ ├── ERC20Reentrant.sol
│ │ │ ├── ERC20ReturnFalseMock.sol
│ │ │ ├── ERC20VotesAdditionalCheckpointsMock.sol
│ │ │ ├── ERC20VotesLegacyMock.sol
│ │ │ ├── ERC20VotesTimestampMock.sol
│ │ │ ├── ERC4626LimitsMock.sol
│ │ │ ├── ERC4626Mock.sol
│ │ │ ├── ERC4626OffsetMock.sol
│ │ │ ├── ERC4646FeesMock.sol
│ │ │ ├── ERC721ConsecutiveEnumerableMock.sol
│ │ │ ├── ERC721ConsecutiveMock.sol
│ │ │ ├── ERC721ReceiverMock.sol
│ │ │ └── ERC721URIStorageMock.sol
│ │ └── utils/
│ │ └── cryptography/
│ │ └── ERC7739Mock.sol
│ ├── package.json
│ ├── proxy/
│ │ ├── Clones.sol
│ │ ├── ERC1967/
│ │ │ ├── ERC1967Proxy.sol
│ │ │ └── ERC1967Utils.sol
│ │ ├── Proxy.sol
│ │ ├── README.adoc
│ │ ├── beacon/
│ │ │ ├── BeaconProxy.sol
│ │ │ ├── IBeacon.sol
│ │ │ └── UpgradeableBeacon.sol
│ │ ├── transparent/
│ │ │ ├── ProxyAdmin.sol
│ │ │ └── TransparentUpgradeableProxy.sol
│ │ └── utils/
│ │ ├── Initializable.sol
│ │ └── UUPSUpgradeable.sol
│ ├── token/
│ │ ├── ERC1155/
│ │ │ ├── ERC1155.sol
│ │ │ ├── IERC1155.sol
│ │ │ ├── IERC1155Receiver.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC1155Burnable.sol
│ │ │ │ ├── ERC1155Crosschain.sol
│ │ │ │ ├── ERC1155Pausable.sol
│ │ │ │ ├── ERC1155Supply.sol
│ │ │ │ ├── ERC1155URIStorage.sol
│ │ │ │ └── IERC1155MetadataURI.sol
│ │ │ └── utils/
│ │ │ ├── ERC1155Holder.sol
│ │ │ └── ERC1155Utils.sol
│ │ ├── ERC20/
│ │ │ ├── ERC20.sol
│ │ │ ├── IERC20.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC1363.sol
│ │ │ │ ├── ERC20Burnable.sol
│ │ │ │ ├── ERC20Capped.sol
│ │ │ │ ├── ERC20Crosschain.sol
│ │ │ │ ├── ERC20FlashMint.sol
│ │ │ │ ├── ERC20Pausable.sol
│ │ │ │ ├── ERC20Permit.sol
│ │ │ │ ├── ERC20Votes.sol
│ │ │ │ ├── ERC20Wrapper.sol
│ │ │ │ ├── ERC4626.sol
│ │ │ │ ├── IERC20Metadata.sol
│ │ │ │ ├── IERC20Permit.sol
│ │ │ │ ├── draft-ERC20Bridgeable.sol
│ │ │ │ └── draft-ERC20TemporaryApproval.sol
│ │ │ └── utils/
│ │ │ ├── ERC1363Utils.sol
│ │ │ └── SafeERC20.sol
│ │ ├── ERC6909/
│ │ │ ├── ERC6909.sol
│ │ │ ├── README.adoc
│ │ │ └── extensions/
│ │ │ ├── ERC6909ContentURI.sol
│ │ │ ├── ERC6909Metadata.sol
│ │ │ └── ERC6909TokenSupply.sol
│ │ ├── ERC721/
│ │ │ ├── ERC721.sol
│ │ │ ├── IERC721.sol
│ │ │ ├── IERC721Receiver.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC721Burnable.sol
│ │ │ │ ├── ERC721Consecutive.sol
│ │ │ │ ├── ERC721Crosschain.sol
│ │ │ │ ├── ERC721Enumerable.sol
│ │ │ │ ├── ERC721Pausable.sol
│ │ │ │ ├── ERC721Royalty.sol
│ │ │ │ ├── ERC721URIStorage.sol
│ │ │ │ ├── ERC721Votes.sol
│ │ │ │ ├── ERC721Wrapper.sol
│ │ │ │ ├── IERC721Enumerable.sol
│ │ │ │ └── IERC721Metadata.sol
│ │ │ └── utils/
│ │ │ ├── ERC721Holder.sol
│ │ │ └── ERC721Utils.sol
│ │ └── common/
│ │ ├── ERC2981.sol
│ │ └── README.adoc
│ ├── utils/
│ │ ├── Address.sol
│ │ ├── Arrays.sol
│ │ ├── Base58.sol
│ │ ├── Base64.sol
│ │ ├── Blockhash.sol
│ │ ├── Bytes.sol
│ │ ├── CAIP10.sol
│ │ ├── CAIP2.sol
│ │ ├── Calldata.sol
│ │ ├── Comparators.sol
│ │ ├── Context.sol
│ │ ├── Create2.sol
│ │ ├── Errors.sol
│ │ ├── LowLevelCall.sol
│ │ ├── Memory.sol
│ │ ├── Multicall.sol
│ │ ├── Nonces.sol
│ │ ├── NoncesKeyed.sol
│ │ ├── Packing.sol
│ │ ├── Panic.sol
│ │ ├── Pausable.sol
│ │ ├── README.adoc
│ │ ├── RLP.sol
│ │ ├── ReentrancyGuard.sol
│ │ ├── ReentrancyGuardTransient.sol
│ │ ├── RelayedCall.sol
│ │ ├── ShortStrings.sol
│ │ ├── SimulateCall.sol
│ │ ├── SlotDerivation.sol
│ │ ├── StorageSlot.sol
│ │ ├── Strings.sol
│ │ ├── TransientSlot.sol
│ │ ├── cryptography/
│ │ │ ├── ECDSA.sol
│ │ │ ├── EIP712.sol
│ │ │ ├── Hashes.sol
│ │ │ ├── MerkleProof.sol
│ │ │ ├── MessageHashUtils.sol
│ │ │ ├── P256.sol
│ │ │ ├── README.adoc
│ │ │ ├── RSA.sol
│ │ │ ├── SignatureChecker.sol
│ │ │ ├── TrieProof.sol
│ │ │ ├── WebAuthn.sol
│ │ │ ├── draft-ERC7739Utils.sol
│ │ │ ├── signers/
│ │ │ │ ├── AbstractSigner.sol
│ │ │ │ ├── MultiSignerERC7913.sol
│ │ │ │ ├── MultiSignerERC7913Weighted.sol
│ │ │ │ ├── SignerECDSA.sol
│ │ │ │ ├── SignerEIP7702.sol
│ │ │ │ ├── SignerERC7913.sol
│ │ │ │ ├── SignerP256.sol
│ │ │ │ ├── SignerRSA.sol
│ │ │ │ ├── SignerWebAuthn.sol
│ │ │ │ └── draft-ERC7739.sol
│ │ │ └── verifiers/
│ │ │ ├── ERC7913P256Verifier.sol
│ │ │ ├── ERC7913RSAVerifier.sol
│ │ │ └── ERC7913WebAuthnVerifier.sol
│ │ ├── draft-InteroperableAddress.sol
│ │ ├── introspection/
│ │ │ ├── ERC165.sol
│ │ │ ├── ERC165Checker.sol
│ │ │ └── IERC165.sol
│ │ ├── math/
│ │ │ ├── Math.sol
│ │ │ ├── SafeCast.sol
│ │ │ └── SignedMath.sol
│ │ ├── structs/
│ │ │ ├── Accumulators.sol
│ │ │ ├── BitMaps.sol
│ │ │ ├── Checkpoints.sol
│ │ │ ├── CircularBuffer.sol
│ │ │ ├── DoubleEndedQueue.sol
│ │ │ ├── EnumerableMap.sol
│ │ │ ├── EnumerableSet.sol
│ │ │ ├── Heap.sol
│ │ │ └── MerkleTree.sol
│ │ └── types/
│ │ └── Time.sol
│ └── vendor/
│ └── compound/
│ ├── ICompoundTimelock.sol
│ └── LICENSE
├── docs/
│ ├── README.md
│ ├── antora.yml
│ ├── config.js
│ ├── modules/
│ │ └── ROOT/
│ │ ├── nav.adoc
│ │ └── pages/
│ │ ├── access-control.adoc
│ │ ├── account-abstraction.adoc
│ │ ├── accounts.adoc
│ │ ├── backwards-compatibility.adoc
│ │ ├── eoa-delegation.adoc
│ │ ├── erc1155.adoc
│ │ ├── erc20-supply.adoc
│ │ ├── erc20.adoc
│ │ ├── erc4626.adoc
│ │ ├── erc6909.adoc
│ │ ├── erc721.adoc
│ │ ├── extending-contracts.adoc
│ │ ├── faq.adoc
│ │ ├── governance.adoc
│ │ ├── index.adoc
│ │ ├── multisig.adoc
│ │ ├── tokens.adoc
│ │ ├── upgradeable.adoc
│ │ ├── utilities.adoc
│ │ └── wizard.adoc
│ └── templates/
│ ├── contract.hbs
│ ├── helpers.js
│ ├── page.hbs
│ └── properties.js
├── eslint.config.mjs
├── foundry.toml
├── fv/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── diff/
│ │ ├── access_manager_AccessManager.sol.patch
│ │ ├── account_extensions_draft-AccountERC7579.sol.patch
│ │ └── token_ERC721_ERC721.sol.patch
│ ├── harnesses/
│ │ ├── AccessControlDefaultAdminRulesHarness.sol
│ │ ├── AccessControlHarness.sol
│ │ ├── AccessManagedHarness.sol
│ │ ├── AccessManagerHarness.sol
│ │ ├── AccountHarness.sol
│ │ ├── DoubleEndedQueueHarness.sol
│ │ ├── ERC20FlashMintHarness.sol
│ │ ├── ERC20PermitHarness.sol
│ │ ├── ERC20WrapperHarness.sol
│ │ ├── ERC3156FlashBorrowerHarness.sol
│ │ ├── ERC721Harness.sol
│ │ ├── ERC721ReceiverHarness.sol
│ │ ├── EnumerableMapHarness.sol
│ │ ├── EnumerableSetHarness.sol
│ │ ├── InitializableHarness.sol
│ │ ├── NoncesHarness.sol
│ │ ├── Ownable2StepHarness.sol
│ │ ├── OwnableHarness.sol
│ │ ├── PausableHarness.sol
│ │ └── TimelockControllerHarness.sol
│ ├── run.js
│ └── specs/
│ ├── AccessControl.conf
│ ├── AccessControl.spec
│ ├── AccessControlDefaultAdminRules.conf
│ ├── AccessControlDefaultAdminRules.spec
│ ├── AccessManaged.conf
│ ├── AccessManaged.spec
│ ├── AccessManager.conf
│ ├── AccessManager.spec
│ ├── Account.conf
│ ├── Account.spec
│ ├── DoubleEndedQueue.conf
│ ├── DoubleEndedQueue.spec
│ ├── ERC20.conf
│ ├── ERC20.spec
│ ├── ERC20FlashMint.conf
│ ├── ERC20FlashMint.spec
│ ├── ERC20Wrapper.conf
│ ├── ERC20Wrapper.spec
│ ├── ERC721.conf
│ ├── ERC721.spec
│ ├── EnumerableMap.conf
│ ├── EnumerableMap.spec
│ ├── EnumerableSet.conf
│ ├── EnumerableSet.spec
│ ├── Initializable.conf
│ ├── Initializable.spec
│ ├── Nonces.conf
│ ├── Nonces.spec
│ ├── Ownable.conf
│ ├── Ownable.spec
│ ├── Ownable2Step.conf
│ ├── Ownable2Step.spec
│ ├── Pausable.conf
│ ├── Pausable.spec
│ ├── TimelockController.conf
│ ├── TimelockController.spec
│ ├── helpers/
│ │ └── helpers.spec
│ └── methods/
│ ├── IAccessControl.spec
│ ├── IAccessControlDefaultAdminRules.spec
│ ├── IAccessManaged.spec
│ ├── IAccessManager.spec
│ ├── IAccount.spec
│ ├── IERC20.spec
│ ├── IERC2612.spec
│ ├── IERC3156FlashBorrower.spec
│ ├── IERC3156FlashLender.spec
│ ├── IERC5313.spec
│ ├── IERC721.spec
│ ├── IERC721Receiver.spec
│ ├── IOwnable.spec
│ └── IOwnable2Step.spec
├── fv-requirements.txt
├── hardhat/
│ ├── async-test-sanity.js
│ ├── env-artifacts.js
│ ├── ignore-unreachable-warnings.js
│ ├── remappings.js
│ ├── skip-foundry-tests.js
│ └── task-test-get-files.js
├── hardhat.config.js
├── netlify.toml
├── package.json
├── remappings.txt
├── renovate.json
├── scripts/
│ ├── checks/
│ │ ├── compare-layout.js
│ │ ├── compareGasReports.js
│ │ ├── coverage.sh
│ │ ├── extract-layout.js
│ │ ├── generation.sh
│ │ ├── inheritance-ordering.js
│ │ └── pragma-validity.js
│ ├── fetch-common-contracts.js
│ ├── gen-nav.js
│ ├── generate/
│ │ ├── format-lines.js
│ │ ├── helpers/
│ │ │ └── sanitize.js
│ │ ├── run.js
│ │ └── templates/
│ │ ├── Arrays.js
│ │ ├── Arrays.opts.js
│ │ ├── Checkpoints.js
│ │ ├── Checkpoints.opts.js
│ │ ├── Checkpoints.t.js
│ │ ├── Enumerable.opts.js
│ │ ├── EnumerableMap.js
│ │ ├── EnumerableSet.js
│ │ ├── MerkleProof.js
│ │ ├── MerkleProof.opts.js
│ │ ├── Packing.js
│ │ ├── Packing.opts.js
│ │ ├── Packing.t.js
│ │ ├── SafeCast.js
│ │ ├── Slot.opts.js
│ │ ├── SlotDerivation.js
│ │ ├── SlotDerivation.t.js
│ │ ├── StorageSlot.js
│ │ ├── StorageSlotMock.js
│ │ ├── TransientSlot.js
│ │ ├── TransientSlotMock.js
│ │ └── conversion.js
│ ├── get-contracts-metadata.js
│ ├── git-user-config.sh
│ ├── helpers.js
│ ├── minimize-pragma.js
│ ├── prepack.sh
│ ├── prepare-docs.sh
│ ├── release/
│ │ ├── format-changelog.js
│ │ ├── synchronize-versions.js
│ │ ├── update-comment.js
│ │ ├── version.sh
│ │ └── workflow/
│ │ ├── check-upgradeable.sh
│ │ ├── exit-prerelease.sh
│ │ ├── github-release.js
│ │ ├── integrity-check.sh
│ │ ├── pack.sh
│ │ ├── publish.sh
│ │ ├── rerun.js
│ │ ├── set-changesets-pr-title.js
│ │ ├── start.sh
│ │ └── state.js
│ ├── remove-ignored-artifacts.js
│ ├── set-max-old-space-size.sh
│ ├── solc-versions.js
│ ├── solhint-custom/
│ │ ├── index.js
│ │ └── package.json
│ ├── update-docs-branch.js
│ └── upgradeable/
│ ├── README.md
│ ├── alias/
│ │ ├── Initializable.sol
│ │ └── UUPSUpgradeable.sol
│ ├── patch-apply.sh
│ ├── patch-save.sh
│ ├── transpile-onto.sh
│ ├── transpile.sh
│ └── upgradeable.patch
├── slither.config.json
├── solhint.config.js
└── test/
├── TESTING.md
├── access/
│ ├── AccessControl.behavior.js
│ ├── AccessControl.test.js
│ ├── Ownable.test.js
│ ├── Ownable2Step.test.js
│ ├── extensions/
│ │ ├── AccessControlDefaultAdminRules.test.js
│ │ └── AccessControlEnumerable.test.js
│ └── manager/
│ ├── AccessManaged.test.js
│ ├── AccessManager.behavior.js
│ ├── AccessManager.predicate.js
│ ├── AccessManager.test.js
│ └── AuthorityUtils.test.js
├── account/
│ ├── Account.behavior.js
│ ├── Account.test.js
│ ├── AccountECDSA.test.js
│ ├── AccountEIP7702.t.sol
│ ├── AccountEIP7702.test.js
│ ├── AccountERC7913.test.js
│ ├── AccountMultiSigner.test.js
│ ├── AccountMultiSignerWeighted.test.js
│ ├── AccountP256.test.js
│ ├── AccountRSA.test.js
│ ├── AccountWebAuthn.test.js
│ ├── examples/
│ │ └── AccountEIP7702WithModulesMock.test.js
│ ├── extensions/
│ │ ├── AccountERC7579.behavior.js
│ │ ├── AccountERC7579.test.js
│ │ ├── AccountERC7579Hooked.test.js
│ │ └── ERC7821.behavior.js
│ └── utils/
│ ├── EIP7702Utils.test.js
│ ├── draft-ERC4337Utils.test.js
│ ├── draft-ERC7579Utils.t.sol
│ └── draft-ERC7579Utils.test.js
├── crosschain/
│ ├── BridgeERC1155.behavior.js
│ ├── BridgeERC1155.test.js
│ ├── BridgeERC20.behavior.js
│ ├── BridgeERC20.test.js
│ ├── BridgeERC721.behavior.js
│ ├── BridgeERC721.test.js
│ ├── CrosschainExecutor.test.js
│ └── ERC7786Recipient.test.js
├── finance/
│ ├── VestingWallet.behavior.js
│ ├── VestingWallet.test.js
│ └── VestingWalletCliff.test.js
├── governance/
│ ├── Governor.t.sol
│ ├── Governor.test.js
│ ├── TimelockController.test.js
│ ├── extensions/
│ │ ├── GovernorCountingFractional.test.js
│ │ ├── GovernorCountingOverridable.test.js
│ │ ├── GovernorCrosschain.test.js
│ │ ├── GovernorERC721.test.js
│ │ ├── GovernorNoncesKeyed.test.js
│ │ ├── GovernorPreventLateQuorum.test.js
│ │ ├── GovernorProposalGuardian.test.js
│ │ ├── GovernorSequentialProposalId.test.js
│ │ ├── GovernorStorage.test.js
│ │ ├── GovernorSuperQuorum.test.js
│ │ ├── GovernorSuperQuorumGreaterThanQuorum.t.sol
│ │ ├── GovernorTimelockAccess.test.js
│ │ ├── GovernorTimelockCompound.test.js
│ │ ├── GovernorTimelockControl.test.js
│ │ ├── GovernorVotesQuorumFraction.test.js
│ │ ├── GovernorVotesSuperQuorumFraction.test.js
│ │ └── GovernorWithParams.test.js
│ └── utils/
│ ├── ERC6372.behavior.js
│ ├── Votes.behavior.js
│ ├── Votes.test.js
│ └── VotesExtended.test.js
├── helpers/
│ ├── access-manager.js
│ ├── account.js
│ ├── chains.js
│ ├── constants.js
│ ├── deploy.js
│ ├── eip712-types.js
│ ├── eip712.js
│ ├── enums.js
│ ├── erc4337.js
│ ├── erc7579.js
│ ├── erc7739.js
│ ├── governance.js
│ ├── iterate.js
│ ├── math.js
│ ├── methods.js
│ ├── precompiles.js
│ ├── random.js
│ ├── signers.js
│ ├── storage.js
│ ├── strings.js
│ ├── time.js
│ ├── trie.js
│ └── txpool.js
├── metatx/
│ ├── ERC2771Context.test.js
│ ├── ERC2771Forwarder.t.sol
│ └── ERC2771Forwarder.test.js
├── proxy/
│ ├── Clones.behaviour.js
│ ├── Clones.t.sol
│ ├── Clones.test.js
│ ├── ERC1967/
│ │ ├── ERC1967Proxy.test.js
│ │ └── ERC1967Utils.test.js
│ ├── Proxy.behaviour.js
│ ├── beacon/
│ │ ├── BeaconProxy.test.js
│ │ └── UpgradeableBeacon.test.js
│ ├── transparent/
│ │ ├── ProxyAdmin.test.js
│ │ ├── TransparentUpgradeableProxy.behaviour.js
│ │ └── TransparentUpgradeableProxy.test.js
│ └── utils/
│ ├── Initializable.test.js
│ └── UUPSUpgradeable.test.js
├── sanity.test.js
├── token/
│ ├── ERC1155/
│ │ ├── ERC1155.behavior.js
│ │ ├── ERC1155.test.js
│ │ ├── extensions/
│ │ │ ├── ERC1155Burnable.test.js
│ │ │ ├── ERC1155Crosschain.test.js
│ │ │ ├── ERC1155Pausable.test.js
│ │ │ ├── ERC1155Supply.test.js
│ │ │ └── ERC1155URIStorage.test.js
│ │ └── utils/
│ │ ├── ERC1155Holder.test.js
│ │ └── ERC1155Utils.test.js
│ ├── ERC20/
│ │ ├── ERC20.behavior.js
│ │ ├── ERC20.test.js
│ │ ├── extensions/
│ │ │ ├── ERC1363.test.js
│ │ │ ├── ERC20Burnable.test.js
│ │ │ ├── ERC20Capped.test.js
│ │ │ ├── ERC20Crosschain.test.js
│ │ │ ├── ERC20FlashMint.test.js
│ │ │ ├── ERC20Pausable.test.js
│ │ │ ├── ERC20Permit.test.js
│ │ │ ├── ERC20Votes.test.js
│ │ │ ├── ERC20Wrapper.test.js
│ │ │ ├── ERC4626.t.sol
│ │ │ ├── ERC4626.test.js
│ │ │ ├── draft-ERC20Bridgeable.test.js
│ │ │ └── draft-ERC20TemporaryApproval.test.js
│ │ └── utils/
│ │ └── SafeERC20.test.js
│ ├── ERC6909/
│ │ ├── ERC6909.behavior.js
│ │ ├── ERC6909.test.js
│ │ └── extensions/
│ │ ├── ERC6909ContentURI.test.js
│ │ ├── ERC6909Metadata.test.js
│ │ └── ERC6909TokenSupply.test.js
│ ├── ERC721/
│ │ ├── ERC721.behavior.js
│ │ ├── ERC721.test.js
│ │ ├── ERC721Enumerable.test.js
│ │ ├── extensions/
│ │ │ ├── ERC721Burnable.test.js
│ │ │ ├── ERC721Consecutive.t.sol
│ │ │ ├── ERC721Consecutive.test.js
│ │ │ ├── ERC721Crosschain.test.js
│ │ │ ├── ERC721Pausable.test.js
│ │ │ ├── ERC721Royalty.test.js
│ │ │ ├── ERC721URIStorage.test.js
│ │ │ ├── ERC721Votes.test.js
│ │ │ └── ERC721Wrapper.test.js
│ │ └── utils/
│ │ ├── ERC721Holder.test.js
│ │ └── ERC721Utils.test.js
│ └── common/
│ └── ERC2981.behavior.js
└── utils/
├── Address.test.js
├── Arrays.t.sol
├── Arrays.test.js
├── Base58.t.sol
├── Base58.test.js
├── Base64.t.sol
├── Base64.test.js
├── Blockhash.t.sol
├── Blockhash.test.js
├── Bytes.t.sol
├── Bytes.test.js
├── CAIP.test.js
├── Calldata.test.js
├── Context.behavior.js
├── Context.test.js
├── Create2.t.sol
├── Create2.test.js
├── LowLevelCall.test.js
├── Memory.t.sol
├── Memory.test.js
├── Multicall.test.js
├── Nonces.behavior.js
├── Nonces.test.js
├── NoncesKeyed.t.sol
├── NoncesKeyed.test.js
├── Packing.t.sol
├── Packing.test.js
├── Panic.test.js
├── Pausable.test.js
├── RLP.t.sol
├── RLP.test.js
├── ReentrancyGuard.test.js
├── RelayedCall.test.js
├── ShortStrings.t.sol
├── ShortStrings.test.js
├── SimulatedCall.test.js
├── SlotDerivation.t.sol
├── SlotDerivation.test.js
├── StorageSlot.test.js
├── Strings.t.sol
├── Strings.test.js
├── TransientSlot.test.js
├── cryptography/
│ ├── ECDSA.test.js
│ ├── EIP712.test.js
│ ├── ERC1271.behavior.js
│ ├── ERC7739.test.js
│ ├── ERC7739Utils.test.js
│ ├── MerkleProof.test.js
│ ├── MessageHashUtils.t.sol
│ ├── MessageHashUtils.test.js
│ ├── P256.t.sol
│ ├── P256.test.js
│ ├── RSA.helper.js
│ ├── RSA.test.js
│ ├── SigVer15_186-3.rsp
│ ├── SignatureChecker.test.js
│ ├── TrieProof.test.js
│ ├── WebAuthn.t.sol
│ └── ecdsa_secp256r1_sha256_p1363_test.json
├── draft-InteroperableAddress.t.sol
├── draft-InteroperableAddress.test.js
├── introspection/
│ ├── ERC165.test.js
│ ├── ERC165Checker.test.js
│ └── SupportsInterface.behavior.js
├── math/
│ ├── Math.t.sol
│ ├── Math.test.js
│ ├── SafeCast.test.js
│ ├── SignedMath.t.sol
│ └── SignedMath.test.js
├── structs/
│ ├── Accumulators.t.sol
│ ├── BitMap.test.js
│ ├── Checkpoints.t.sol
│ ├── Checkpoints.test.js
│ ├── CircularBuffer.test.js
│ ├── DoubleEndedQueue.test.js
│ ├── EnumerableMap.behavior.js
│ ├── EnumerableMap.test.js
│ ├── EnumerableSet.behavior.js
│ ├── EnumerableSet.test.js
│ ├── Heap.t.sol
│ ├── Heap.test.js
│ └── MerkleTree.test.js
└── types/
└── Time.test.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .changeset/better-tires-pull.md
================================================
---
'openzeppelin-solidity': minor
---
`Memory`: Add a `isReserved(Slice)` function that checks if the memory occupied by the slice is reserved (i.e. before the free memory pointer).
================================================
FILE: .changeset/blue-jars-lay.md
================================================
---
'openzeppelin-solidity': minor
---
`ERC1155Crosschain`: Added an ERC-1155 extension to embed an ERC-7786 based crosschain bridge directly in the token contract.
================================================
FILE: .changeset/bright-cooks-brush.md
================================================
---
'openzeppelin-solidity': minor
---
`RLP`: Perform a memory copy when decoding `bytes` objects containing a single byte instead of returning a reference to the input.
================================================
FILE: .changeset/chatty-dryers-joke.md
================================================
---
'openzeppelin-solidity': minor
---
`AccountERC7579Hooked`: Do not revert if hook checks fail during the hook module uninstallation.
================================================
FILE: .changeset/config.json
================================================
{
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
"changelog": [
"@changesets/changelog-github",
{
"repo": "OpenZeppelin/openzeppelin-contracts"
}
],
"commit": false,
"access": "public",
"baseBranch": "master"
}
================================================
FILE: .changeset/curly-pandas-flow.md
================================================
---
'openzeppelin-solidity': patch
---
Add ERC-165 detection for the `IERC6909ContentURI`, `IERC6909TokenSupply` and `IERC6909Metadata` interfaces in the `ERC6909ContentURI`, `ERC6909TokenSupply` and `ERC6909Metadata` contracts respectively.
================================================
FILE: .changeset/flat-flies-hear.md
================================================
---
'openzeppelin-solidity': minor
---
`SimulateCall`: Add a new call simulation utilities that allow inspecting return data from contract calls by executing them in a non-mutating, revert-based context.
================================================
FILE: .changeset/floppy-symbols-burn.md
================================================
---
'openzeppelin-solidity': minor
---
`CrosschainRemoteExecutor`: Add a new executor contract that relays transaction from a controller on a remote chain.
================================================
FILE: .changeset/fruity-coats-smash.md
================================================
---
'openzeppelin-solidity': minor
---
`BridgeNonFungibleCore` and `BridgeERC721`: Added bridge contracts to handle crosschain movements of ERC-721 tokens.
================================================
FILE: .changeset/gentle-apples-dance.md
================================================
---
'openzeppelin-solidity': minor
---
`Accumulator`: Check that slices being added (`shift` or `push`) are in the reserved space.
================================================
FILE: .changeset/happy-pants-decide.md
================================================
---
'openzeppelin-solidity': patch
---
Rename `BridgeERC20Core` to `BridgeFungible`
================================================
FILE: .changeset/legal-cameras-sin.md
================================================
---
'openzeppelin-solidity': minor
---
`AccessManager`: treat `setAuthority` differently in `canCall` to prevent bypassing the `updateAuthority` security using an `execute`.
================================================
FILE: .changeset/rare-bushes-march.md
================================================
---
'openzeppelin-solidity': minor
---
`GovernorCrosschain`: Governor module that facilitates the execution of crosschain operations through CrosschainRemoteExecutors and ERC-7786 gateways.
================================================
FILE: .changeset/red-gifts-appear.md
================================================
---
'openzeppelin-solidity': patch
---
`InteroperableAddress`: Fix overflow in the parsing functions that caused silent misparse of large interoperable addresses.
================================================
FILE: .changeset/silver-falcons-lay.md
================================================
---
'openzeppelin-solidity': minor
---
`Governor`: Strict enforcement of the expected proposal state depending on `proposalNeedsQueuing` when calling `execute`.
================================================
FILE: .changeset/smooth-cows-notice.md
================================================
---
'openzeppelin-solidity': minor
---
`InteroperableAddress`: reject inputs with both chain reference and addresses empty.
================================================
FILE: .changeset/some-dolls-shine.md
================================================
---
'openzeppelin-solidity': minor
---
`ERC2771Forwarder`: Revert the entire atomic batch if a call with value fails.
================================================
FILE: .changeset/spicy-seals-bake.md
================================================
---
'openzeppelin-solidity': minor
---
`WebAuthn`: Verification now returns `false` instead of reverting when client data contains an out-of-bounds `challengeIndex`.
================================================
FILE: .changeset/sweet-houses-cheer.md
================================================
---
'openzeppelin-solidity': minor
---
`BridgeMultiToken` and `BridgeERC1155`: Added bridge contracts to handle crosschain movements of ERC-1155 tokens.
================================================
FILE: .changeset/tangy-jokes-begin.md
================================================
---
'openzeppelin-solidity': minor
---
`Memory`: Remove the `asBytes32` and `asPointer` function to reduce the risk of mistakes when manipulating memory pointers.
================================================
FILE: .changeset/tidy-turkeys-build.md
================================================
---
'openzeppelin-solidity': minor
---
`ERC721Crosschain`: Added an ERC-721 extension to embed an ERC-7786 based crosschain bridge directly in the token contract.
================================================
FILE: .codecov.yml
================================================
comment: off
github_checks:
annotations: false
coverage:
status:
patch:
default:
target: 95%
only_pulls: true
project:
default:
threshold: 1%
ignore:
- "test"
- "contracts/mocks"
- "contracts/vendor"
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = false
max_line_length = 120
[*.sol]
indent_size = 4
[*.js]
indent_size = 2
[*.{adoc,md}]
max_line_length = 0
================================================
FILE: .gitattributes
================================================
fv/specs/*.spec linguist-language=Solidity
fv/specs/*.conf linguist-detectable
fv/specs/*.conf linguist-language=JSON5
================================================
FILE: .github/CODEOWNERS
================================================
# List of approvers/reviewers for OpenZeppelin Contracts
#
# Get in touch with us via the OpenZeppelin Forum
# https://forum.openzeppelin.com/
#
# Learn about CODEOWNERS file format:
# https://help.github.com/en/articles/about-code-owners
# These owners will be the default owners for everything in the repo.
* @OpenZeppelin/contracts
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Report a bug in OpenZeppelin Contracts
---
<!-- Briefly describe the issue you're experiencing. Tell us what you were trying to do and what happened instead. -->
<!-- Remember, this is not a place to ask for help debugging code. For that, we welcome you in the OpenZeppelin Community Forum: https://forum.openzeppelin.com/. -->
**💻 Environment**
<!-- Tell us what version of OpenZeppelin Contracts you're using, and how you're using it: Hardhat, Remix, etc. -->
**📝 Details**
<!-- Describe the problem you have been experiencing in more detail. Include as much information as you think is relevant. Keep in mind that transactions can fail for many reasons; context is key here. -->
**🔢 Code to reproduce bug**
<!-- We will be able to better help if you provide a minimal example that triggers the bug. -->
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
- name: Questions & Support Requests
url: https://forum.openzeppelin.com/c/support/contracts/18
about: Ask in the OpenZeppelin Forum
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for OpenZeppelin Contracts
---
**🧐 Motivation**
<!-- Is your feature request related to a specific problem? Is it just a crazy idea? Tell us about it! -->
**📝 Details**
<!-- Please describe your feature request in detail. -->
<!-- Make sure that you have reviewed the OpenZeppelin Contracts Contributor Guidelines. -->
<!-- https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CONTRIBUTING.md -->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Thank you for your interest in contributing to OpenZeppelin! -->
<!-- Consider opening an issue for discussion prior to submitting a PR. -->
<!-- New features will be merged faster if they were first discussed and designed with the team. -->
Fixes #???? <!-- Fill in with issue number -->
<!-- Describe the changes introduced in this pull request. -->
<!-- Include any context necessary for understanding the PR's purpose. -->
#### PR Checklist
<!-- Before merging the pull request all of the following must be complete. -->
<!-- Feel free to submit a PR or Draft PR even if some items are pending. -->
<!-- Some of the items may not apply. -->
- [ ] Tests
- [ ] Documentation
- [ ] Changeset entry (run `npx changeset add`)
================================================
FILE: .github/actions/gas-compare/action.yml
================================================
name: Compare gas costs
description: Compare gas costs between branches
inputs:
token:
description: GitHub token, required to access GitHub API
required: true
report:
description: Path to the report to compare
required: false
default: gasReporterOutput.json
out_report:
description: Path to save the output report
required: false
default: ${{ github.ref_name }}.gasreport.json
ref_report:
description: Path to the reference report for comparison
required: false
default: ${{ github.base_ref }}.gasreport.json
runs:
using: composite
steps:
- name: Download reference report
if: github.event_name == 'pull_request'
run: |
RUN_ID=`gh run list --repo ${{ github.repository }} --branch ${{ github.base_ref }} --workflow ${{ github.workflow }} --limit 100 --json 'conclusion,databaseId,event' --jq 'map(select(.conclusion=="success" and .event!="pull_request"))[0].databaseId'`
gh run download ${RUN_ID} --repo ${{ github.repository }} -n gasreport
env:
GITHUB_TOKEN: ${{ inputs.token }}
shell: bash
continue-on-error: true
id: reference
- name: Compare reports
if: steps.reference.outcome == 'success' && github.event_name == 'pull_request'
run: |
node scripts/checks/compareGasReports.js ${{ inputs.report }} ${{ inputs.ref_report }} >> $GITHUB_STEP_SUMMARY
env:
STYLE: markdown
shell: bash
- name: Rename report for upload
if: github.event_name != 'pull_request'
run: |
mv ${{ inputs.report }} ${{ inputs.out_report }}
shell: bash
- name: Save report
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v7
with:
name: gasreport
overwrite: true
path: ${{ inputs.out_report }}
================================================
FILE: .github/actions/setup/action.yml
================================================
name: Setup
description: Common environment setup
inputs:
node:
description: Whether to set up node
required: false
default: 'on' # 'off' | 'on' | <specific version>
foundry:
description: Whether to set up Foundry
required: false
default: 'on' # 'off' | 'on' | <specific version>
java:
description: Whether to set up Java
required: false
default: 'off' # 'off' | 'on' | <specific version>
python:
description: Whether to set up Python
required: false
default: 'off' # 'off' | 'on' | <specific version>
python-requirements:
description: Path to Python requirements file (if python is true)
required: false
default: 'requirements.txt'
solc:
description: Whether to set up solc
required: false
default: 'off' # 'off' | 'on' | <specific version>
runs:
using: composite
steps:
- name: "Determine versions to install"
id: versions
shell: bash
run: |
(
[[ "${{ inputs.node }}" = "on" ]] \
&& echo "node=$NODE_DEFAULT_VERSION" \
|| echo "node=${{ inputs.node }}"
[[ "${{ inputs.foundry }}" = "on" ]] \
&& echo "foundry=$FOUNDRY_DEFAULT_VERSION" \
|| echo "foundry=${{ inputs.foundry }}"
[[ "${{ inputs.java }}" = "on" ]] \
&& echo "java=$JAVA_DEFAULT_VERSION" \
|| echo "java=${{ inputs.java }}"
[[ "${{ inputs.python }}" = "on" ]] \
&& echo "python=$PYTHON_DEFAULT_VERSION" \
|| echo "python=${{ inputs.python }}"
[[ "${{ inputs.solc }}" = "on" ]] \
&& echo "solc=$SOLC_DEFAULT_VERSION" \
|| echo "solc=${{ inputs.solc }}"
) > $GITHUB_OUTPUT
env:
NODE_DEFAULT_VERSION: "24.x"
FOUNDRY_DEFAULT_VERSION: "stable"
JAVA_DEFAULT_VERSION: "21"
PYTHON_DEFAULT_VERSION: "3.13"
SOLC_DEFAULT_VERSION: "0.8.31"
# Node & npm setup
- name: Install Node (${{ steps.versions.outputs.node }})
if: inputs.node != 'off'
uses: actions/setup-node@v6
with:
node-version: ${{ steps.versions.outputs.node }}
- name: Try fetch node modules from cache
id: cache
if: inputs.node != 'off'
uses: actions/cache@v5
with:
path: '**/node_modules'
key: npm-${{ steps.versions.outputs.node }}-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
if: inputs.node != 'off' && steps.cache.outputs.cache-hit != 'true'
shell: bash
run: npm ci
# Foundry setup
- name: Install Foundry (${{ steps.versions.outputs.foundry }})
if: inputs.foundry != 'off'
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ steps.versions.outputs.foundry }}
# Java setup
- name: Install java (${{ steps.versions.outputs.java }})
if: ${{ inputs.java != 'off' }}
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: ${{ steps.versions.outputs.java }}
# Python setup
- name: Install python (${{ steps.versions.outputs.python }})
if: inputs.python != 'off'
uses: actions/setup-python@v6
with:
python-version: ${{ steps.versions.outputs.python }}
cache: 'pip'
cache-dependency-path: ${{ inputs.python-requirements }}
- name: Install python packages
if: inputs.python != 'off'
shell: bash
run: pip install -r ${{ inputs.python-requirements }}
# Solc setup
- name: Install solc (${{ steps.versions.outputs.solc }})
if: inputs.solc != 'off'
shell: bash
run: |
wget -q https://github.com/argotorg/solidity/releases/download/v${{ steps.versions.outputs.solc }}/solc-static-linux
chmod +x solc-static-linux
sudo mv solc-static-linux /usr/local/bin/solc
================================================
FILE: .github/actions/storage-layout/action.yml
================================================
name: Compare storage layouts
description: Compare storage layouts between branches
inputs:
token:
description: github token
required: true
buildinfo:
description: compilation artifacts
required: false
default: artifacts/build-info/*.json
layout:
description: extracted storage layout
required: false
default: HEAD.layout.json
out_layout:
description: storage layout to upload
required: false
default: ${{ github.ref_name }}.layout.json
ref_layout:
description: storage layout for the reference branch
required: false
default: ${{ github.base_ref }}.layout.json
runs:
using: composite
steps:
- name: Extract layout
run: |
node scripts/checks/extract-layout.js ${{ inputs.buildinfo }} > ${{ inputs.layout }}
shell: bash
- name: Download reference
if: github.event_name == 'pull_request'
run: |
RUN_ID=`gh run list --repo ${{ github.repository }} --branch ${{ github.base_ref }} --workflow ${{ github.workflow }} --limit 100 --json 'conclusion,databaseId,event' --jq 'map(select(.conclusion=="success" and .event!="pull_request"))[0].databaseId'`
gh run download ${RUN_ID} --repo ${{ github.repository }} -n layout
env:
GITHUB_TOKEN: ${{ inputs.token }}
shell: bash
continue-on-error: true
id: reference
- name: Compare layouts
if: steps.reference.outcome == 'success' && github.event_name == 'pull_request'
run: |
node scripts/checks/compare-layout.js --head ${{ inputs.layout }} --ref ${{ inputs.ref_layout }}
shell: bash
- name: Rename artifacts for upload
if: github.event_name != 'pull_request'
run: |
mv ${{ inputs.layout }} ${{ inputs.out_layout }}
shell: bash
- name: Save artifacts
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v7
with:
name: layout
overwrite: true
path: ${{ inputs.out_layout }}
================================================
FILE: .github/workflows/actionlint.yml
================================================
name: lint workflows
on:
pull_request:
paths:
- '.github/**/*.ya?ml'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Add problem matchers
run: |
# https://github.com/rhysd/actionlint/blob/3a2f2c7/docs/usage.md#problem-matchers
curl -LO https://raw.githubusercontent.com/rhysd/actionlint/main/.github/actionlint-matcher.json
echo "::add-matcher::actionlint-matcher.json"
- uses: docker://rhysd/actionlint:latest
================================================
FILE: .github/workflows/changeset.yml
================================================
name: changeset
on:
pull_request:
branches:
- master
types:
- opened
- synchronize
- labeled
- unlabeled
concurrency:
group: changeset-${{ github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changeset') }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # Include history so Changesets finds merge-base
- name: Set up environment
uses: ./.github/actions/setup
- name: Check changeset
run: npx changeset status --since=origin/${{ github.base_ref }}
================================================
FILE: .github/workflows/checks.yml
================================================
name: checks
on:
push:
branches:
- master
- next-v*
- release-v*
pull_request: {}
workflow_dispatch: {}
concurrency:
group: checks-${{ github.ref }}
cancel-in-progress: true
env:
NODE_OPTIONS: --max_old_space_size=8192
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- run: npm run lint
tests:
runs-on: ubuntu-latest
env:
FORCE_COLOR: 1
# Needed for "eth-gas-reporter" to produce a "gasReporterOutput.json" as documented in
# https://github.com/cgewecke/eth-gas-reporter/blob/v0.2.27/docs/gasReporterOutput.md
CI: true
GAS: true
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- name: Run tests and generate gas report
run: npm run test
- name: Check linearisation of the inheritance graph
run: npm run test:inheritance
- name: Check pragma validity
run: npm run test:pragma -- --concurrency 1
- name: Check procedurally generated contracts are up-to-date
run: npm run test:generation
- name: Compare gas costs
uses: ./.github/actions/gas-compare
with:
token: ${{ github.token }}
tests-upgradeable:
runs-on: ubuntu-latest
env:
FORCE_COLOR: 1
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # Include history so patch conflicts are resolved automatically
- name: Set up environment
uses: ./.github/actions/setup
- name: Copy non-upgradeable contracts as dependency
run: |
mkdir -p lib/openzeppelin-contracts
cp -rnT contracts lib/openzeppelin-contracts/contracts
- name: Transpile to upgradeable
run: bash scripts/upgradeable/transpile.sh
- name: Run tests
run: npm run test
- name: Check linearisation of the inheritance graph
run: npm run test:inheritance
- name: Check pragma validity
run: npm run test:pragma -- --concurrency 1
- name: Check storage layout
uses: ./.github/actions/storage-layout
continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'breaking change') }}
with:
token: ${{ github.token }}
tests-foundry:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Set up environment
uses: ./.github/actions/setup
- name: Run tests
run: forge test -vvv
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- name: Run coverage
run: npm run coverage
- uses: codecov/codecov-action@v5
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
harnesses:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- name: Compile harnesses
run: |
make -C fv apply
npm run compile:harnesses
slither:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- uses: crytic/slither-action@v0.4.1
codespell:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run CodeSpell
uses: codespell-project/actions-codespell@v2.2
with:
check_hidden: true
check_filenames: true
skip: package-lock.json,*.pdf,vendor
================================================
FILE: .github/workflows/docs.yml
================================================
name: Build Docs
on:
push:
branches: [release-v*]
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- run: node scripts/update-docs-branch.js
- run: git push --all origin
================================================
FILE: .github/workflows/formal-verification.yml
================================================
name: formal verification
on:
pull_request:
types:
- opened
- reopened
- synchronize
- labeled
workflow_dispatch: {}
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
apply-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Apply patches
run: make -C fv apply
verify:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'formal-verification') || contains(github.event.pull_request.labels.*.name, 'formal-verification-force-all')
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
with:
solc: 'on'
java: 'on'
python: 'on'
python-requirements: 'fv-requirements.txt'
- name: identify specs that need to be run
id: arguments
run: |
if [[ ${{ github.event_name }} = 'pull_request' && ${{ contains(github.event.pull_request.labels.*.name, 'formal-verification-force-all') }} = 'false' ]];
then
RESULT=$(git diff ${{ github.event.pull_request.head.sha }}..${{ github.event.pull_request.base.sha }} --name-only fv/specs/*.spec | while IFS= read -r file; do [[ -f $file ]] && basename "${file%.spec}"; done | tr "\n" " ")
else
RESULT='--all'
fi
echo "result=$RESULT" >> "$GITHUB_OUTPUT"
- name: Verify specification
run: |
make -C fv apply
node fv/run.js ${{ steps.arguments.outputs.result }} -p 1 -v >> "$GITHUB_STEP_SUMMARY"
env:
CERTORAKEY: ${{ secrets.CERTORAKEY }}
halmos:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
with:
python: 'on'
python-requirements: 'fv-requirements.txt'
- name: Run Halmos
run: halmos --match-test '^symbolic|^testSymbolic' -vv
env:
HALMOS_ALLOW_DOWNLOAD: 1
================================================
FILE: .github/workflows/release-cycle.yml
================================================
# D: Manual Dispatch
# M: Merge release PR
# C: Commit
# ┌───────────┐ ┌─────────────┐ ┌────────────────┐
# │Development├──D──►RC-Unreleased│ ┌──►Final-Unreleased│
# └───────────┘ └─┬─────────▲─┘ │ └─┬────────────▲─┘
# │ │ │ │ │
# M C D M C
# │ │ │ │ │
# ┌▼─────────┴┐ │ ┌▼────────────┴┐
# │RC-Released├───┘ │Final-Released│
# └───────────┘ └──────────────┘
name: Release Cycle
on:
push:
branches:
- release-v*
workflow_dispatch: {}
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
state:
name: Check state
permissions:
pull-requests: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- id: state
name: Get state
uses: actions/github-script@v8
env:
TRIGGERING_ACTOR: ${{ github.triggering_actor }}
with:
result-encoding: string
script: await require('./scripts/release/workflow/state.js')({ github, context, core })
outputs:
# Job Flags
start: ${{ steps.state.outputs.start }}
changesets: ${{ steps.state.outputs.changesets }}
promote: ${{ steps.state.outputs.promote }}
publish: ${{ steps.state.outputs.publish }}
merge: ${{ steps.state.outputs.merge }}
# Global variables
is_prerelease: ${{ steps.state.outputs.is_prerelease }}
start:
needs: state
name: Start new release candidate
permissions:
contents: write
actions: write
if: needs.state.outputs.start == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- id: start
name: Create branch with release candidate
run: bash scripts/release/workflow/start.sh
- name: Re-run workflow
uses: actions/github-script@v8
env:
REF: ${{ steps.start.outputs.branch }}
with:
script: await require('./scripts/release/workflow/rerun.js')({ github, context })
promote:
needs: state
name: Promote to final release
permissions:
contents: write
actions: write
if: needs.state.outputs.promote == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Exit prerelease state
if: needs.state.outputs.is_prerelease == 'true'
run: bash scripts/release/workflow/exit-prerelease.sh
- name: Re-run workflow
uses: actions/github-script@v8
with:
script: await require('./scripts/release/workflow/rerun.js')({ github, context })
changesets:
needs: state
name: Update PR to release
permissions:
contents: write
pull-requests: write
if: needs.state.outputs.changesets == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # To get all tags
- name: Set up environment
uses: ./.github/actions/setup
- name: Set release title
uses: actions/github-script@v8
with:
result-encoding: string
script: await require('./scripts/release/workflow/set-changesets-pr-title.js')({ core })
- name: Create PR
uses: changesets/action@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
with:
version: npm run version
title: ${{ env.TITLE }}
commit: ${{ env.TITLE }}
body: | # Wait for support on this https://github.com/changesets/action/pull/250
This is an automated PR for releasing ${{ github.repository }}
Check [CHANGELOG.md](${{ github.repository }}/CHANGELOG.md)
publish:
needs: state
name: Publish to npm
environment: npm
permissions:
contents: write
id-token: write
if: needs.state.outputs.publish == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up environment
uses: ./.github/actions/setup
- id: pack
name: Pack
run: bash scripts/release/workflow/pack.sh
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- name: Upload tarball artifact
uses: actions/upload-artifact@v7
with:
name: ${{ github.ref_name }}
path: ${{ steps.pack.outputs.tarball }}
- name: Publish
run: bash scripts/release/workflow/publish.sh
env:
TARBALL: ${{ steps.pack.outputs.tarball }}
TAG: ${{ steps.pack.outputs.tag }}
- name: Create Github Release
uses: actions/github-script@v8
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
with:
script: await require('./scripts/release/workflow/github-release.js')({ github, context })
outputs:
tarball_name: ${{ steps.pack.outputs.tarball_name }}
integrity_check:
needs: publish
name: Tarball Integrity Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download tarball artifact
id: artifact
uses: actions/download-artifact@v8
with:
name: ${{ github.ref_name }}
- name: Check integrity
run: bash scripts/release/workflow/integrity-check.sh
env:
TARBALL: ${{ steps.artifact.outputs.download-path }}/${{ needs.publish.outputs.tarball_name }}
merge:
needs: state
name: Create PR back to master
permissions:
contents: write
pull-requests: write
if: needs.state.outputs.merge == 'true'
runs-on: ubuntu-latest
env:
MERGE_BRANCH: merge/${{ github.ref_name }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # All branches
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Create branch to merge
run: |
git checkout -B "$MERGE_BRANCH" "$GITHUB_REF_NAME"
git push -f origin "$MERGE_BRANCH"
- name: Create PR back to master
uses: actions/github-script@v8
with:
script: |
await github.rest.pulls.create({
owner: context.repo.owner,
repo: context.repo.repo,
head: process.env.MERGE_BRANCH,
base: 'master',
title: '${{ format('Merge {0} branch', github.ref_name) }}'
});
================================================
FILE: .github/workflows/release-upgradeable.yml
================================================
name: Release Upgradeable
on:
workflow_dispatch: {}
jobs:
state:
name: Check state
permissions:
pull-requests: read
if: ${{ !endsWith(github.repository, '-upgradeable') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
repository: ${{ github.repository }}-upgradeable
ref: ${{ github.ref }}
- uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
path: lib/openzeppelin-contracts
- name: Set up environment
uses: ./.github/actions/setup
- name: Check upgradeable
id: check-upgradeable
run: bash scripts/release/workflow/check-upgradeable.sh
outputs:
publish: ${{ steps.check-upgradeable.outcome }}
is_prerelease: ${{ steps.check-upgradeable.outputs.is_prerelease }}
# copied from release-cycle.yml
publish:
needs: state
name: Publish to npm
environment: npm
permissions:
id-token: write
if: needs.state.outputs.publish == 'success' # Note: changed from 'true' to 'success' to support the way publish is computed
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
repository: ${{ github.repository }}-upgradeable
ref: ${{ github.ref }}
- uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
path: lib/openzeppelin-contracts
- name: Set up environment
uses: ./.github/actions/setup
- id: pack
name: Pack
run: bash scripts/release/workflow/pack.sh
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- name: Upload tarball artifact
uses: actions/upload-artifact@v7
with:
name: ${{ github.ref_name }}-upgradeable
path: ${{ steps.pack.outputs.tarball }}
- name: Publish
run: bash scripts/release/workflow/publish.sh
env:
TARBALL: ${{ steps.pack.outputs.tarball }}
TAG: ${{ steps.pack.outputs.tag }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_CONFIG_PROVENANCE: false
- name: Create Github Release
uses: actions/github-script@v8
env:
PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
TARGET_COMMIT: ${{ github.ref }}
REPO_SUFFIX: -upgradeable
with:
github-token: ${{ secrets.GH_TOKEN_UPGRADEABLE }}
script: await require('./scripts/release/workflow/github-release.js')({ github, context })
outputs:
tarball_name: ${{ steps.pack.outputs.tarball_name }}
integrity_check:
needs: publish
name: Tarball Integrity Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
repository: ${{ github.repository }}-upgradeable
ref: ${{ github.ref }}
- name: Download tarball artifact
id: artifact
uses: actions/download-artifact@v8
with:
name: ${{ github.ref_name }}-upgradeable
- name: Check integrity
run: bash scripts/release/workflow/integrity-check.sh
env:
TARBALL: ${{ steps.artifact.outputs.download-path }}/${{ needs.publish.outputs.tarball_name }}
================================================
FILE: .github/workflows/upgradeable.yml
================================================
name: Transpile upgradeable
on:
push:
branches:
- master
- release-v*
jobs:
transpile:
environment: push-upgradeable
if: ${{ !endsWith(github.repository, '-upgradeable') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
repository: ${{ github.repository }}-upgradeable
fetch-depth: 0
token: ${{ secrets.GH_TOKEN_UPGRADEABLE }}
- name: Fetch current non-upgradeable branch
run: |
git fetch "$REMOTE" master # Fetch default branch first for patch to apply cleanly
git fetch "$REMOTE" "$REF"
git checkout FETCH_HEAD
env:
REF: ${{ github.ref }}
REMOTE: https://github.com/${{ github.repository }}.git
- name: Set up environment
uses: ./.github/actions/setup
- run: bash scripts/git-user-config.sh
- name: Transpile to upgradeable
run: bash scripts/upgradeable/transpile-onto.sh ${{ github.ref_name }} origin/${{ github.ref_name }}
env:
SUBMODULE_REMOTE: https://github.com/${{ github.repository }}.git
- run: git push origin ${{ github.ref_name }}
================================================
FILE: .gitignore
================================================
*.swp
*.swo
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
allFiredEvents
scTopics
# Coverage directory used by tools like istanbul
coverage
coverage.json
coverageEnv
# node-waf configuration
.lock-wscript
# Dependency directory
node_modules
# Debug log from npm
npm-debug.log
# local env variables
.env
# macOS
.DS_Store
# IntelliJ IDE
.idea
# docs artifacts
docs/modules/api
build/site
# only used to package @openzeppelin/contracts
contracts/build/
contracts/README.md
# temporary artifact from solidity-coverage
allFiredEvents
.coverage_artifacts
.coverage_cache
.coverage_contracts
# hardat-exposed
contracts-exposed
# Hardhat
/cache
/artifacts
# Foundry
/out
/cache_forge
# Certora
.certora*
.last_confs
certora_*
.zip-output-url.txt
================================================
FILE: .gitmodules
================================================
[submodule "lib/forge-std"]
branch = v1
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/erc4626-tests"]
path = lib/erc4626-tests
url = https://github.com/a16z/erc4626-tests.git
[submodule "lib/halmos-cheatcodes"]
path = lib/halmos-cheatcodes
url = https://github.com/a16z/halmos-cheatcodes
================================================
FILE: .husky/pre-commit
================================================
npm run test:generation
npx lint-staged
================================================
FILE: .mocharc.js
================================================
module.exports = {
require: 'hardhat/register',
timeout: 4000,
};
================================================
FILE: .prettierrc
================================================
{
"printWidth": 120,
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "avoid",
"overrides": [
{
"files": "*.sol",
"options": {
"singleQuote": false
}
}
],
"plugins": ["prettier-plugin-solidity"]
}
================================================
FILE: .solcover.js
================================================
module.exports = {
norpc: true,
testCommand: 'npm test',
compileCommand: 'npm run compile',
skipFiles: ['mocks'],
providerOptions: {
default_balance_ether: '10000000000000000000000000',
},
mocha: {
fgrep: '[skip-on-coverage]',
invert: true,
},
// Work around stack too deep for coverage
configureYulOptimizer: true,
solcOptimizerDetails: {
yul: true,
yulDetails: {
optimizerSteps: '',
},
},
};
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## 5.6.1 (2026-02-27)
- `InteroperableAddress`: Fix overflow in the parsing functions that caused silent misparse of large interoperable addresses. ([#6372](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6372))
## 5.6.0 (2026-02-25)
### Breaking changes
- `Strings`: The `escapeJSON` function now escapes all control characters in the range U+0000 to U+001F per RFC-4627. Previously only backspace, tab, newline, form feed, carriage return, double quote, and backslash were escaped. Input strings containing any other control character (e.g. null `0x00`) or raw bytes in U+0001–U+001F will now produce different, longer output (e.g. `\u0000` for null). ([#6344](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6344))
- `ERC1155`: Performing batch transfers with exactly one id/value in the batch no-longer calls `IERC1155Receiver.onERC1155Received`. `IERC1155Receiver.onERC1155BatchReceived` is called instead (with arrays of length one). ([#6170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6170))
- `ERC1967Proxy` and `TransparentUpgradeableProxy`: Mandate initialization during construction. Deployment now reverts with `ERC1967ProxyUninitialized` if an initialize call is not provided. Developers that rely on the previous behavior and want to disable this check can do so by overriding the internal `_unsafeAllowUninitialized` function to return true. ([#5906](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5906))
- `ERC721` and `ERC1155`: Prevent setting an operator for `address(0)`. In the case of `ERC721` this type of operator allowance could lead to obfuscated mint permission. ([#6171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6171))
- `RLP`: The `encode(bytes32)` function now encodes `bytes32` as a fixed size item and not as a scalar in `encode(uint256)`. Users must replace calls to `encode(bytes32)` with `encode(uint256(bytes32))` to preserve the same behavior. ([#6167](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6167))
- `ERC4337Utils`: The `parseValidationData` now returns a `ValidationRange` as the last return tuple value indicating whether the `validationData` is compared against a timestamp or block number. Developers must update their code to handle this new return value (e.g. `(aggregator, validAfter, validUntil) -> (aggregator, validAfter, validUntil, range)`). ([#6215](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6215))
- `SignerWebAuthn`: The `_rawSignatureValidation` function now returns `false` when the signature is not a valid WebAuthn authentication assertion. P256 fallback is removed. Developers can add it back by overriding the function. ([#6337](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6337))
- `Memory`: The `setFreeMemoryPointer` function is renamed to `unsafeSetFreeMemoryPointer`. Developers should use `unsafeSetFreeMemoryPointer` instead of `setFreeMemoryPointer` after v5.6.0. ([#6348](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6348))
- `Memory`: Remove the `asBytes32` and `asPointer` function to reduce the risk of mistakes when manipulating memory pointers. ([#6340](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6340))
### Changes by category
#### Account
- `Account`: Update default version of the ERC-4337 entrypoint to v0.9. ([#6135](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6135))
- `AccountERC7579`: Do not revert and perform the uninstall if the `onUninstall` hook of a module reverts. ([#6142](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6142))
- `ERC4337Utils`: Added the `paymasterSignature` function to extract the signature in `paymasterAndData` after Entrypoint v0.9. Similarly, a variant of `paymasterData` that receives a flag to exclude the signature from the returned data. ([#6215](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6215))
- `ERC4337Utils`: Added variants of `packValidationData(address,uint48,uint48)` and `packValidationData(bool,uint48,uint48)` that receive a `ValidationRange` argument, could be timestamp or block number. Similarly, the `parseValidationData` now returns a `ValidationRange` too. ([#6215](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6215))
#### Tokens
- `ERC1155`: Introduce the `_checkAuthorized` internal virtual function to encapsulate `isApprovedForAll` and `msg.sender == from` checks. ([#6133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6133))
- `ERC1155`: Call `IERC1155Receiver.onERC1155BatchReceived` when performing a batch transfers with exactly one id/value in the batch. ([#6170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6170))
- `ERC4626`: Allow overriding underlying assets transfer mechanisms through new internal virtual functions (`_transferIn` and `_transferOut`). ([#5970](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5970))
- `ERC721URIStorage`: Add `_suffixURI`, an internal getter for retrieving the custom tokenURI without the base prefix. ([#6175](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6175))
- Add ERC-165 detection for the `IERC6909ContentURI`, `IERC6909TokenSupply` and `IERC6909Metadata` interfaces in the `ERC6909ContentURI`, `ERC6909TokenSupply` and `ERC6909Metadata` contracts respectively. ([#6246](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6246)) and ([#6247](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6247))
#### Cross-chain
- `BridgeFungible`, `BridgeERC20` and `BridgeERC7802`: Added bridge contracts to handle crosschain movements of ERC-20 (and ERC-7802) tokens. ([#5914](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5914)) ([#6328](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6328))
- `CrosschainLinked`: Added a new helper contract to facilitate communication between a contract on one chain and counterparts on remote chains through ERC-7786 gateways. ([#5914](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5914))
- `ERC20Crosschain`: Added an ERC-20 extension to embed an ERC-7786 based crosschain bridge directly in the token contract. ([#5914](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5914))
- `InteroperableAddress`: Reject inputs with both chain reference and addresses empty. ([#6340](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6340))
#### Cryptography
- `MessageHashUtils`: Add helper functions to build EIP-712 domain typehash and separator with fields selectively enabled/disabled. ([#5908](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5908))
- `SignatureChecker`: Add `isValidERC1271SignatureNowCalldata`, a variant of `isValidERC1271SignatureNow` that takes the signature from calldata. ([#6123](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6123))
- `TrieProof`: Add library for verifying Ethereum Merkle-Patricia trie inclusion proofs. ([#5826](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5826))
- `WebAuthn`: Verification now returns `false` instead of reverting when client data contains an out-of-bounds `challengeIndex`. ([#6329](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6329))
#### Structures
- `Accumulator`: Check that slices being added (`shift` or `push`) are in the reserved space. ([#6302](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6302))
- `DoubleEndedQueue`: Add `tryPushBack`, `tryPopBack`, `tryPushFront`, `tryPopFront`, `tryFront`, `tryBack`, and `tryAt` function variants that do not revert. ([#6020](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6020))
- `EnumerableMap`: Add support for `Bytes4ToAddressMap` types. ([#6091](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6091))
- `EnumerableSet`: Add support for `Bytes4Set` type. ([#6091](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6091))
#### Utils
- `Arrays`: Add `replace` functions enabling in-place array modification of `address[]`, `bytes32[]` and `uint256[]` arrays, with new content from another array. ([#5995](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5995))
- `Arrays`: Add `slice` and `splice` functions for value types (`uint256[]`, `bytes32[]`, `address[]`). ([#5965](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5965))
- `Bytes`: Add `replace` functions that replaces a portion of a bytes buffer with content from another buffer. ([#5995](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5995))
- `Bytes`: Add the `toNibbles` function that expands the nibbles (4 bits chunk) of a `bytes` buffer. Used for manipulating Patricia Merkle Trees keys and paths. ([#5826](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5826))
- `Memory`: Add a `isReserved(Slice)` function that checks if the memory occupied by the slice is reserved (i.e. before the free memory pointer). ([#6302](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6302))
- `RLP`: Encode `bytes32` as a fixed size item and not as a scalar in `encode(bytes32)`. Scalar RLP encoding remains available by casting to a `uint256` and using the `encode(uint256)` function. ([#6167](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6167))
- `RLP`: Fix RLP encoding validity check when decoding long lists or strings ([#6051](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6051))
- `RLP`: Perform a memory copy when decoding `bytes` objects containing a single byte instead of returning a reference to the input. ([#6303](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/6303))
## 5.5.0 (2025-10-31)
### Bug fixes
- `AccountERC7579`: Prevent revert in `isModuleInstalled` for fallback modules when `additionalContext` has fewer than 4 bytes. The function now returns `false` instead of reverting, ensuring ERC-7579 compliance. ([#5961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5961))
- `ERC165Checker`: Ensure the `supportsERC165` function returns false if the target reverts during the `supportsInterface(0xffffffff)` call. ([#5880](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5880))
- `AccountERC7579`: Prevent revert in `isModuleInstalled` for fallback modules when `additionalContext` has fewer than 4 bytes. The function now returns `false` instead of reverting, ensuring ERC-7579 compliance. ([#5961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5961))
### Breaking changes
- `Account`: Add `signature` argument to the internal `_validateUserOp` function for custom signature handling logic. Developers overriding it must now provide the signature from the user operation (i.e. `userOp.signature`) to keep compatibility. ([#5976](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5976))
- `AccountERC7579`: Installing and uninstalling fallback modules now require the corresponding `initData` and `deInitData` arguments to be at least 4 bytes long (matching the selector to which the fallback module is registered). It now reverts with `ERC7579CannotDecodeFallbackData` instead of treating the missing bytes as `0x00`. ([#5974](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5974))
- `ERC6909` and its extensions (`ERC6909ContentURI`, `ERC6909Metadata` and `ERC6909TokenSupply`) are no longer marked as draft since [EIP-6909](https://eips.ethereum.org/EIPS/eip-6909) is now final. Developers must update the import paths. Contracts behavior is not modified. ([#5929](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5929))
- `SignerERC7702` is renamed as `SignerEIP7702`. Imports and inheritance must be updated to that new name and path. Behavior is unmodified. ([#5932](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5932))
- `ERC721Holder`, `ERC1155Holder`, `ReentrancyGuard` and `ReentrancyGuardTransient` are flagged as stateless and are no longer transpiled. Developers using their upgradeable variants from `@openzeppelin/contracts-upgradeable` must update their imports to use the equivalent version available in `@openzeppelin/contracts`. ([#5944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5944), [#5942](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5942))
- Update minimum pragma to 0.8.24 in `AccessControlEnumerable`, `Arrays`, `CircularBuffer`, `EIP712`, `EnumerableMap`, `EnumerableSet`, `ERC1155`, `ERC1155Burnable`, `ERC1155Pausable`, `ERC1155Supply`, `ERC1155URIStorage`, `ERC20Votes`, `ERC4626`,`ERC721Burnable`, `ERC721Consecutive`, `ERC721Enumerable`, `ERC721Pausable`, `ERC721Royalty`, `ERC721URIStorage`, `ERC721Votes`, `ERC721Wrapper`, `ERC7739`, `Heap`, `MerkleTree`, `MessageHashUtils`, `Strings`, `Votes` and `VotesExtended`. ([#5723](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/5723), [#5726](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5726), [#5965](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5965))
### Deprecation
- `Initializable` and `UUPSUpgradeable` are no longer transpiled. Aliases are present in the `@openzeppelin/contracts-upgradeable` package that redirect to the corresponding files in `@openzeppelin/contracts`. These aliases will be removed in the next major release. Developers are advised to update their imports to get these files directly from the `@openzeppelin/contracts` package. [#5941](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5941)
- `ECDSA` signature malleability protection is partly deprecated. See documentation for more details. [#5814](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5814)
### Changes by category
#### Tokens
- `ERC4626`: compute `maxWithdraw` using `maxRedeem` and `previewRedeem` so that changes to the preview functions affect the max functions. ([#5130](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5130))
#### Cross-chain
- `InteroperableAddress`: Add a library for formatting and parsing ERC-7930 interoperable addresses. ([#5736](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5736))
- `ERC7786Recipient`: Generic ERC-7786 cross-chain message recipient contract. ([#5904](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5904))
- `IERC7786`: Add the (draft) interface for ERC-7786 "Cross-Chain Messaging Gateway" ([#5737](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5737))
#### Cryptography
##### Signers
- `SignerWebAuthn`: Add an abstract signer that verifies WebAuthn signatures, with a P256 fallback. ([#5809](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5809))
- Add constructors to the different signers. ([#5757](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5757))
##### Verifiers
- `ERC7913WebAuthnVerifier`: Add an ERC-7913 verifier that verifies WebAuthn Authentication Assertions for P256 identities. ([#5809](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5809))
##### Other
- `WebAuthn`: Add a library for verifying WebAuthn Authentication Assertions. ([#5809](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5809))
- `ECDSA`: Add `parse` and `parseCalldata` to parse bytes signatures of length 65 or 64 (erc-2098) into its v,r,s components. ([#5814](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5814))
- `ECDSA`: Add `recoverCalldata` and `tryRecoverCalldata`, variants of `recover` and `tryRecover` that are more efficient when signatures are in calldata. ([#5788](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5788))
- `SignatureChecker`: Add `isValidSignatureNowCalldata(address,bytes32,bytes calldata)` for efficient processing of calldata signatures. ([#5788](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5788))
#### Structures
- `Checkpoints`: Add a new checkpoint variant `Checkpoint256` using `uint256` type for the value and key. ([#5748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5748))
- `Accumulators`: A library for merging an arbitrary dynamic number of bytes buffers. ([#5680](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5680))
#### Utils
- `Arrays`: Add `slice` and `splice` functions for value types (`uint256[]`, `bytes32[]`, `address[]`). ([#5983](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5983))
- `Base58`: Add a library for encoding and decoding bytes buffers into base58 strings. ([#5762](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5762))
- `Base64`: Add a new `decode` function that parses base64 encoded strings. ([#5765](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5765))
- `Bytes`: Add `concat` that merges a `bytes[]` array of buffers into a single `bytes` buffer. ([#5882](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5882))
- `Bytes`: Add `reverseBytes32`, `reverseBytes16`, `reverseBytes8`, `reverseBytes4`, and `reverseBytes2` functions to reverse byte order for converting between little-endian and big-endian representations. ([#5724](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5724))
- `Bytes`: Add `splice(bytes,uint256)` and `splice(bytes,uint256,uint256)` functions that move a specified range of bytes to the start of the buffer and truncate it in place, as an alternative to `slice`. ([#5733](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5733))
- `Bytes`: Add a `clz` function to count the leading zero bits in a `bytes` buffer. ([#5725](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5725))
- `Bytes`: Add an `equal` function to compare byte buffers. ([#5726](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5726))
- `Bytes`: Fix `lastIndexOf(bytes,byte,uint256)` with empty buffers and finite position to correctly return `type(uint256).max` instead of accessing uninitialized memory sections. ([#5797](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5797))
- `IERC7751`: Add the interface for custom error wrapping of bubbled up reverts. ([#5816](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5816))
- `LowLevelCall`: Add a library to perform low-level calls and deal with the `returndata` more granularly. ([#5094](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5094))
- `Math`: Add a `clz` function to count the leading zero bits in a `uint256` value. ([#5725](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5725))
- `Memory`: Add library with utilities to manipulate memory ([#5189](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5189))
- `Memory`: Add a UDVT for handling slices on memory space similarly to calldata slices. ([#5680](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5680))
- `ReentrancyGuard` and `ReentrancyGuardTransient`: Add `nonReentrantView`, a read-only version of the `nonReentrant` modifier. ([#5800](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5800))
- `ReentrancyGuard`, `ReentrancyGuardTransient`: Add an internal `_reentrancyGuardStorageSlot` function allowing slot customization via override. ([#5892](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5892))
- `RelayedCall`: Add a library to perform indirect calls through minimal and predictable relayers. ([#5630](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5630))
- `RLP`: Add a library for encoding and decoding data in Ethereum's Recursive Length Prefix format. ([#5680](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5680))
- `Strings`: Add `toHexString(bytes)`. ([#5761](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5761))
## 5.4.0 (2025-07-17)
### Breaking changes
- Update minimum pragma to 0.8.24 in `SignatureChecker`, `Governor` and Governor's extensions. ([#5716](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5716)).
### Pragma changes
- Reduced pragma requirement of interface files.
### Changes by category
#### Account
- `Account`: Added a simple ERC-4337 account implementation with minimal logic to process user operations. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
- `AccountERC7579`: Extension of `Account` that implements support for ERC-7579 modules of type executor, validator, and fallback handler. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
- `AccountERC7579Hooked`: Extension of `AccountERC7579` that implements support for ERC-7579 hook modules. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
- `EIP7702Utils`: Add a library for checking if an address has an EIP-7702 delegation in place. ([#5587](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5587))
- `IERC7821`, `ERC7821`: Interface and logic for minimal batch execution. No support for additional `opData` is included. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
#### Governance
- `GovernorNoncesKeyed`: Extension of `Governor` that adds support for keyed nonces when voting by sig. ([#5574](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5574))
#### Tokens
- `ERC20Bridgeable`: Implementation of ERC-7802 that makes an ERC-20 compatible with crosschain bridges. ([#5735](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5735))
#### Cryptography
##### Signers
- `AbstractSigner`, `SignerECDSA`, `SignerP256`, and `SignerRSA`: Add an abstract contract and various implementations for contracts that deal with signature verification. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
- `SignerERC7702`: Implementation of `AbstractSigner` for Externally Owned Accounts (EOAs). Useful with ERC-7702. ([#5657](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5657))
- `SignerERC7913`: Abstract signer that verifies signatures using the ERC-7913 workflow. ([#5659](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5659))
- `MultiSignerERC7913`: Implementation of `AbstractSigner` that supports multiple ERC-7913 signers with a threshold-based signature verification system. ([#5659](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5659))
- `MultiSignerERC7913Weighted`: Extension of `MultiSignerERC7913` that supports assigning different weights to each signer, enabling more flexible governance schemes. ([#5718](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5718))
##### Verifiers
- `ERC7913P256Verifier` and `ERC7913RSAVerifier`: Ready to use ERC-7913 verifiers that implement key verification for P256 (secp256r1) and RSA keys. ([#5659](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5659))
##### Other
- `SignatureChecker`: Add support for ERC-7913 signatures alongside existing ECDSA and ERC-1271 signature verification. ([#5659](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5659))
- `ERC7739`: An abstract contract to validate signatures following the rehashing scheme from `ERC7739Utils`. ([#5664](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5664))
- `ERC7739Utils`: Add a library that implements a defensive rehashing mechanism to prevent replayability of smart contract signatures based on the ERC-7739. ([#5664](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5664))
#### Structures
- `EnumerableMap`: Add support for `BytesToBytesMap` type. ([#5658](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5658))
- `EnumerableMap`: Add `keys(uint256,uint256)` that returns a subset (slice) of the keys in the map. ([#5713](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5713))
- `EnumerableSet`: Add support for `StringSet` and `BytesSet` types. ([#5658](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5658))
- `EnumerableSet`: Add `values(uint256,uint256)` that returns a subset (slice) of the values in the set. ([#5713](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5713))
#### Utils
- `Arrays`: Add `unsafeAccess`, `unsafeMemoryAccess` and `unsafeSetLength` for `bytes[]` and `string[]`. ([#5568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5568))
- `Blockhash`: Add a library that provides access to historical block hashes using EIP-2935's history storage, extending the standard 256-block limit to 8191 blocks. ([#5642](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5642))
- `Bytes`: Fix `lastIndexOf(bytes,byte,uint256)` with empty buffers and finite position to correctly return `type(uint256).max` instead of accessing uninitialized memory sections. ([#5797](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5797))
## 5.3.0 (2025-04-09)
### Breaking Changes
- Replace `GovernorCountingOverridable.VoteReceipt` struct parameter member names `hasOverriden` and `overridenWeight` for `hasOverridden` and `overriddenWeight` respectively.
#### Custom error changes
- Replace `GovernorAlreadyOverridenVote` with `GovernorAlreadyOverriddenVote`.
- Replace `GovernorOnlyProposer` with `GovernorUnableToCancel`.
### Changes by category
#### Account
- `ERC4337Utils`: Update the `hash` function to call `getUserOpHash` on the specified entrypoint and add an `ENTRYPOINT_V08` constant. ([#5614](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5614))
- `ERC7579Utils`: Add ABI decoding checks on calldata bounds within `decodeBatch`. ([#5371](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5371))
- `ERC7579Utils`: Replace `address(0)` with `address(this)` during execution for calldata compression efficiency. ([#5614](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5614))
#### Governance
- `IGovernor`: Add the `getProposalId` function to the governor interface. ([#5290](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5290))
- `GovernorProposalGuardian`: Add a governance extension that defines a proposal guardian who can cancel proposals at any stage in their lifecycle. ([#5303](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5303))
- `GovernorSequentialProposalId`: Adds a `Governor` extension that sequentially numbers proposal ids instead of using the hash. ([#5290](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5290))
- `GovernorSuperQuorum`: Add a governance extension to support a super quorum. Proposals that meet the super quorum (and have a majority of for votes) advance to the `Succeeded` state before the proposal deadline. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `GovernorVotesSuperQuorumFraction`: Add a variant of the `GovernorSuperQuorum` extensions where the super quorum is expressed as a fraction of the total supply. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `TimelockController`: Receive function is now virtual. ([#5509](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5509))
#### Structures
- `EnumerableSet`: Add `clear` function to EnumerableSets which deletes all values in the set. ([#5486](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5486))
- `EnumerableMap`: Add `clear` function to EnumerableMaps which deletes all entries in the map. ([#5486](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5486))
- `MerkleTree`: Add an update function that replaces a previously inserted leaf with a new value, updating the tree root along the way. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
#### Tokens
- `ERC4626`: Use the `asset` getter in `totalAssets`, `_deposit` and `_withdraw`. ([#5322](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5322))
- `IERC6909`: Add the interface for ERC-6909. ([#5343](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5343))
- `ERC6909`: Add a standard implementation of ERC6909. ([#5394](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5394))
- `ERC6909TokenSupply`: Add an extension of ERC6909 which tracks total supply for each token id. ([#5394](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5394))
- `ERC6909Metadata`: Add an extension of ERC6909 which adds metadata functionality. ([#5394](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5394))
- `ERC6909ContentURI`: Add an extension of ERC6909 which adds content URI functionality. ([#5394](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5394))
- `SafeERC20`: Add `trySafeTransfer` and `trySafeTransferFrom` that do not revert and return false if the transfer is not successful. ([#5483](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5483))
#### Other
- `Address`: bubble up revert data on `sendValue` failed call. ([#5379](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5379))
- `Calldata`: Library with `emptyBytes` and `emptyString` functions to generate empty `bytes` and `string` calldata types. ([#5422](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5422))
- `ERC2771Forwarder`: Expose the `_isTrustedByTarget` internal function to check whether a target trusts the forwarder. ([#5416](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5416))
- `Hashes`: Expose `efficientKeccak256` for hashing non-commutative pairs of bytes32 without allocating extra memory. ([#5442](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5442))
- `Initializable`: Add `_initializableStorageSlot` function that returns a pointer to the storage struct. The function allows customizing with a custom storage slot with an `override`. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `Math`: Add `add512`, `mul512` and `mulShr`. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `Math`: Add saturating arithmetic operations `saturatingAdd`, `saturatingSub` and `saturatingMul`. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `MessageHashUtils`: Add `toDataWithIntendedValidatorHash(address, bytes32)`. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
- `P256`: Adjust precompile detection in `verifyNative` to consider empty `returndata` on invalid verification. Previously, invalid signatures would've reverted with a `MissingPrecompile` error in chains with RIP-7212 support. ([#5620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5620))
- `Pausable`: Stop explicitly setting `paused` to `false` during construction. ([#5448](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5448))
- `Strings`: Add `espaceJSON` that escapes special characters in JSON strings. ([#5526](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5526))
## 5.2.0 (2025-01-08)
### Breaking Changes
#### Custom error changes
This version comes with changes to the custom error identifiers. Contracts previously depending on the following errors should be replaced accordingly:
- Replace `Errors.FailedCall` with a bubbled-up revert reason in `Address.sendValue`.
### Changes by category
#### General
- Update some pragma directives to ensure that all file requirements match that of the files they import. ([#5273](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5273))
#### Account
- `ERC4337Utils`: Add a reusable library to manipulate user operations and interact with ERC-4337 contracts ([#5274](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5274))
- `ERC7579Utils`: Add a reusable library to interact with ERC-7579 modular accounts ([#5274](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5274))
#### Governance
- `GovernorCountingOverridable`: Add a governor counting module that enables token holders to override the vote of their delegate. ([#5192](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5192))
- `VotesExtended`: Create an extension of `Votes` which checkpoints balances and delegates. ([#5192](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5192))
### Proxy
- `Clones`: Add `cloneWithImmutableArgs` and `cloneDeterministicWithImmutableArgs` variants that create clones with per-instance immutable arguments. The immutable arguments can be retrieved using `fetchCloneArgs`. The corresponding `predictDeterministicWithImmutableArgs` function is also included. ([#5109](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5109))
### Tokens
- `ERC1363Utils`: Add helper similar to the existing `ERC721Utils` and `ERC1155Utils` ([#5133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5133))
### Utils
- `Address`: bubble up revert data on `sendValue` failed call ([#5418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5418))
- `Bytes`: Add a library of common operations that operate on `bytes` objects. ([#5252](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5252))
- `CAIP2` and `CAIP10`: Add libraries for formatting and parsing CAIP-2 and CAIP-10 identifiers. ([#5252](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5252))
- `NoncesKeyed`: Add a variant of `Nonces` that implements the ERC-4337 entrypoint nonce system. ([#5272](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5272))
- `Packing`: Add variants for packing `bytes10` and `bytes22` ([#5274](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5274))
- `Strings`: Add `parseUint`, `parseInt`, `parseHexUint` and `parseAddress` to parse strings into numbers and addresses. Also provide variants of these functions that parse substrings, and `tryXxx` variants that do not revert on invalid input. ([#5166](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5166))
## 5.1.0 (2024-10-17)
### Breaking changes
- `ERC1967Utils`: Removed duplicate declaration of the `Upgraded`, `AdminChanged` and `BeaconUpgraded` events. These events are still available through the `IERC1967` interface located under the `contracts/interfaces/` directory. Minimum pragma version is now 0.8.21.
- `Governor`, `GovernorCountingSimple`: The `_countVote` virtual function now returns an `uint256` with the total votes cast. This change allows for more flexibility for partial and fractional voting. Upgrading users may get a compilation error that can be fixed by adding a return statement to the `_countVote` function.
#### Custom error changes
This version comes with changes to the custom error identifiers. Contracts previously depending on the following errors should be replaced accordingly:
- Replace `Address.FailedInnerCall` with `Errors.FailedCall`
- Replace `Address.AddressInsufficientBalance` with `Errors.InsufficientBalance`
- Replace `Clones.Create2InsufficientBalance` with `Errors.InsufficientBalance`
- Replace `Clones.ERC1167FailedCreateClone` with `Errors.FailedDeployment`
- Replace `Clones.Create2FailedDeployment` with `Errors.FailedDeployment`
- `SafeERC20`: Replace `Address.AddressEmptyCode` with `SafeERC20FailedOperation` if there is no code at the token's address.
- `SafeERC20`: Replace generic `Error(string)` with `SafeERC20FailedOperation` if the returned data can't be decoded as `bool`.
- `SafeERC20`: Replace generic `SafeERC20FailedOperation` with the revert message from the contract call if it fails.
### Changes by category
#### General
- `AccessManager`, `VestingWallet`, `TimelockController` and `ERC2771Forwarder`: Added a public `initializer` function in their corresponding upgradeable variants. ([#5008](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5008))
#### Access
- `AccessControlEnumerable`: Add a `getRoleMembers` method to return all accounts that have `role`. ([#4546](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4546))
- `AccessManager`: Allow the `onlyAuthorized` modifier to restrict functions added to the manager. ([#5014](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5014))
#### Finance
- `VestingWalletCliff`: Add an extension of the `VestingWallet` contract with an added cliff. ([#4870](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4870))
#### Governance
- `GovernorCountingFractional`: Add a governor counting module that allows distributing voting power amongst 3 options (For, Against, Abstain). ([#5045](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5045))
- `Votes`: Set `_moveDelegateVotes` visibility to internal instead of private. ([#5007](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5007))
#### Proxy
- `Clones`: Add version of `clone` and `cloneDeterministic` that support sending value at creation. ([#4936](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4936))
- `TransparentUpgradeableProxy`: Make internal `_proxyAdmin()` getter have `view` visibility. ([#4688](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4688))
- `ProxyAdmin`: Fixed documentation for `UPGRADE_INTERFACE_VERSION` getter. ([#5031](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5031))
#### Tokens
- `ERC1363`: Add implementation of the token payable standard allowing execution of contract code after transfers and approvals. ([#4631](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4631))
- `ERC20TemporaryApproval`: Add an ERC-20 extension that implements temporary approval using transient storage, based on ERC7674 (draft). ([#5071](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5071))
- `SafeERC20`: Add "relaxed" function for interacting with ERC-1363 functions in a way that is compatible with EOAs. ([#4631](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4631))
- `SafeERC20`: Document risks of `safeIncreaseAllowance` and `safeDecreaseAllowance` when associated with ERC-7674. ([#5262](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5262))
- `ERC721Utils` and `ERC1155Utils`: Add reusable libraries with functions to perform acceptance checks on `IERC721Receiver` and `IERC1155Receiver` implementers. ([#4845](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4845))
- `ERC1363Utils`: Add helper similar to the existing ERC721Utils and ERC1155Utils. ([#5133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5133))
#### Utils
- `Arrays`: add a `sort` functions for `address[]`, `bytes32[]` and `uint256[]` memory arrays. ([#4846](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4846))
- `Arrays`: add new functions `lowerBound`, `upperBound`, `lowerBoundMemory` and `upperBoundMemory` for lookups in sorted arrays with potential duplicates. ([#4842](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4842))
- `Arrays`: deprecate `findUpperBound` in favor of the new `lowerBound`. ([#4842](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4842))
- `Base64`: Add `encodeURL` following section 5 of RFC4648 for URL encoding ([#4822](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4822))
- `Comparator`: A library of comparator functions, useful for customizing the behavior of the Heap structure. ([#5084](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5084))
- `Create2`: Bubbles up returndata from a deployed contract that reverted during construction. ([#5052](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5052))
- `Create2`, `Clones`: Mask `computeAddress` and `cloneDeterministic` outputs to produce a clean value for an `address` type (i.e. only use 20 bytes) ([#4941](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4941))
- `Errors`: New library of common custom errors. ([#4936](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4936))
- `Hashes`: A library with commonly used hash functions. ([#3617](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3617))
- `Packing`: Added a new utility for packing, extracting and replacing bytesXX values. ([#4992](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4992))
- `Panic`: Add a library for reverting with panic codes. ([#3298](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3298))
- `ReentrancyGuardTransient`: Added a variant of `ReentrancyGuard` that uses transient storage. ([#4988](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4988))
- `Strings`: Added a utility function for converting an address to checksummed string. ([#5067](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5067))
- `SlotDerivation`: Add a library of methods for derivating common storage slots. ([#4975](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4975))
- `TransientSlot`: Add primitives for operating on the transient storage space using a typed-slot representation. ([#4980](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4980))
##### Cryptography
- `SignatureChecker`: refactor `isValidSignatureNow` to avoid validating ECDSA signatures if there is code deployed at the signer's address. ([#4951](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4951))
- `MerkleProof`: Add variations of `verify`, `processProof`, `multiProofVerify` and `processMultiProof` (and equivalent calldata version) with support for custom hashing functions. ([#4887](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4887))
- `P256`: Library for verification and public key recovery of P256 (aka secp256r1) signatures. ([#4881](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4881))
- `RSA`: Library to verify signatures according to RFC 8017 Signature Verification Operation ([#4952](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4952))
#### Math
- `Math`: add an `invMod` function to get the modular multiplicative inverse of a number in Z/nZ. ([#4839](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4839))
- `Math`: Add `modExp` function that exposes the `EIP-198` precompile. Includes `uint256` and `bytes memory` versions. ([#3298](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3298))
- `Math`: Custom errors replaced with native panic codes. ([#3298](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3298))
- `Math`, `SignedMath`: Add a branchless `ternary` function that computes`cond ? a : b` in constant gas cost. ([#4976](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4976))
- `SafeCast`: Add `toUint(bool)` for operating on `bool` values as `uint256`. ([#4878](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4878))
#### Structures
- `CircularBuffer`: Add a data structure that stores the last `N` values pushed to it. ([#4913](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4913))
- `DoubleEndedQueue`: Custom errors replaced with native panic codes. ([#4872](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4872))
- `EnumerableMap`: add `UintToBytes32Map`, `AddressToAddressMap`, `AddressToBytes32Map` and `Bytes32ToAddressMap`. ([#4843](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4843))
- `Heap`: A data structure that implements a heap-based priority queue. ([#5084](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5084))
- `MerkleTree`: A data structure that allows inserting elements into a merkle tree and updating its root hash. ([#3617](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3617))
## 5.0.2 (2024-02-29)
- `Base64`: Fix issue where dirty memory located just after the input buffer is affecting the result. ([#4926](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4926))
## 5.0.1 (2023-12-07)
- `ERC2771Context` and `Context`: Introduce a `_contextPrefixLength()` getter, used to trim extra information appended to `msg.data`.
- `Multicall`: Make aware of non-canonical context (i.e. `msg.sender` is not `_msgSender()`), allowing compatibility with `ERC2771Context`.
## 5.0.0 (2023-10-05)
### Additions Summary
The following contracts and libraries were added:
- `AccessManager`: A consolidated system for managing access control in complex systems.
- `AccessManaged`: A module for connecting a contract to an authority in charge of its access control.
- `GovernorTimelockAccess`: An adapter for time-locking governance proposals using an `AccessManager`.
- `AuthorityUtils`: A library of utilities for interacting with authority contracts.
- `GovernorStorage`: A Governor module that stores proposal details in storage.
- `ERC2771Forwarder`: An ERC2771 forwarder for meta transactions.
- `ERC1967Utils`: A library with ERC1967 events, errors and getters.
- `Nonces`: An abstraction for managing account nonces.
- `MessageHashUtils`: A library for producing digests for ECDSA operations.
- `Time`: A library with helpers for manipulating time-related objects.
### Removals Summary
The following contracts, libraries, and functions were removed:
- `Address.isContract` (because of its ambiguous nature and potential for misuse)
- `Checkpoints.History`
- `Counters`
- `ERC20Snapshot`
- `ERC20VotesComp`
- `ERC165Storage` (in favor of inheritance based approach)
- `ERC777`
- `ERC1820Implementer`
- `GovernorVotesComp`
- `GovernorProposalThreshold` (deprecated since 4.4)
- `PaymentSplitter`
- `PullPayment`
- `SafeMath`
- `SignedSafeMath`
- `Timers`
- `TokenTimelock` (in favor of `VestingWallet`)
- All escrow contracts (`Escrow`, `ConditionalEscrow` and `RefundEscrow`)
- All cross-chain contracts, including `AccessControlCrossChain` and all the vendored bridge interfaces
- All presets in favor of [OpenZeppelin Contracts Wizard](https://wizard.openzeppelin.com/)
These removals were implemented in the following PRs: [#3637](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3637), [#3880](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3880), [#3945](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3945), [#4258](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4258), [#4276](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4276), [#4289](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4289)
### Changes by category
#### General
- Replaced revert strings and require statements with custom errors. ([#4261](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4261))
- Bumped minimum compiler version required to 0.8.20 ([#4288](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4288), [#4489](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4489))
- Use of `abi.encodeCall` in place of `abi.encodeWithSelector` and `abi.encodeWithSignature` for improved type-checking of parameters ([#4293](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4293))
- Replaced some uses of `abi.encodePacked` with clearer alternatives (e.g. `bytes.concat`, `string.concat`). ([#4504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4504)) ([#4296](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4296))
- Overrides are now used internally for a number of functions that were previously hardcoded to their default implementation in certain locations: `ERC1155Supply.totalSupply`, `ERC721.ownerOf`, `ERC721.balanceOf` and `ERC721.totalSupply` in `ERC721Enumerable`, `ERC20.totalSupply` in `ERC20FlashMint`, and `ERC1967._getImplementation` in `ERC1967Proxy`. ([#4299](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4299))
- Removed the `override` specifier from functions that only override a single interface function. ([#4315](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4315))
- Switched to using explicit Solidity import statements. Some previously available symbols may now have to be separately imported. ([#4399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4399))
- `Governor`, `Initializable`, and `UUPSUpgradeable`: Use internal functions in modifiers to optimize bytecode size. ([#4472](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4472))
- Upgradeable contracts now use namespaced storage (EIP-7201). ([#4534](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4534))
- Upgradeable contracts no longer transpile interfaces and libraries. ([#4628](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4628))
#### Access
- `Ownable`: Added an `initialOwner` parameter to the constructor, making the ownership initialization explicit. ([#4267](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4267))
- `Ownable`: Prevent using address(0) as the initial owner. ([#4531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4531))
- `AccessControl`: Added a boolean return value to the internal `_grantRole` and `_revokeRole` functions indicating whether the role was granted or revoked. ([#4241](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4241))
- `access`: Moved `AccessControl` extensions to a dedicated directory. ([#4359](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4359))
- `AccessManager`: Added a new contract for managing access control of complex systems in a consolidated location. ([#4121](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4121))
- `AccessManager`, `AccessManaged`, `GovernorTimelockAccess`: Ensure that calldata shorter than 4 bytes is not padded to 4 bytes. ([#4624](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4624))
- `AccessManager`: Use named return parameters in functions that return multiple values. ([#4624](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4624))
- `AccessManager`: Make `schedule` and `execute` more conservative when delay is 0. ([#4644](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4644))
#### Finance
- `VestingWallet`: Fixed revert during 1 second time window when duration is 0. ([#4502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4502))
- `VestingWallet`: Use `Ownable` instead of an immutable `beneficiary`. ([#4508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4508))
#### Governance
- `Governor`: Optimized use of storage for proposal data ([#4268](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4268))
- `Governor`: Added validation in ERC1155 and ERC721 receiver hooks to ensure Governor is the executor. ([#4314](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4314))
- `Governor`: Refactored internals to implement common queuing logic in the core module of the Governor. Added `queue` and `_queueOperations` functions that act at different levels. Modules that implement queuing via timelocks are expected to override `_queueOperations` to implement the timelock-specific logic. Added `_executeOperations` as the equivalent for execution. ([#4360](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4360))
- `Governor`: Added `voter` and `nonce` parameters in signed ballots, to avoid forging signatures for random addresses, prevent signature replay, and allow invalidating signatures. Add `voter` as a new parameter in the `castVoteBySig` and `castVoteWithReasonAndParamsBySig` functions. ([#4378](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4378))
- `Governor`: Added support for casting votes with ERC-1271 signatures by using a `bytes memory signature` instead of `r`, `s` and `v` arguments in the `castVoteBySig` and `castVoteWithReasonAndParamsBySig` functions. ([#4418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4418))
- `Governor`: Added a mechanism to restrict the address of the proposer using a suffix in the description.
- `GovernorStorage`: Added a new governor extension that stores the proposal details in storage, with an interface that operates on `proposalId`, as well as proposal enumerability. This replaces the old `GovernorCompatibilityBravo` module. ([#4360](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4360))
- `GovernorTimelockAccess`: Added a module to connect a governor with an instance of `AccessManager`, allowing the governor to make calls that are delay-restricted by the manager using the normal `queue` workflow. ([#4523](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4523))
- `GovernorTimelockControl`: Clean up timelock id on execution for gas refund. ([#4118](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4118))
- `GovernorTimelockControl`: Added the Governor instance address as part of the TimelockController operation `salt` to avoid operation id collisions between governors using the same TimelockController. ([#4432](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4432))
- `TimelockController`: Changed the role architecture to use `DEFAULT_ADMIN_ROLE` as the admin for all roles, instead of the bespoke `TIMELOCK_ADMIN_ROLE` that was used previously. This aligns with the general recommendation for `AccessControl` and makes the addition of new roles easier. Accordingly, the `admin` parameter and timelock will now be granted `DEFAULT_ADMIN_ROLE` instead of `TIMELOCK_ADMIN_ROLE`. ([#3799](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3799))
- `TimelockController`: Added a state getter that returns an `OperationState` enum. ([#4358](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4358))
- `Votes`: Use Trace208 for checkpoints. This enables EIP-6372 clock support for keys but reduces the max supported voting power to uint208. ([#4539](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4539))
#### Metatx
- `ERC2771Forwarder`: Added `deadline` for expiring transactions, batching, and more secure handling of `msg.value`. ([#4346](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4346))
- `ERC2771Context`: Return the forwarder address whenever the `msg.data` of a call originating from a trusted forwarder is not long enough to contain the request signer address (i.e. `msg.data.length` is less than 20 bytes), as specified by ERC-2771. ([#4481](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4481))
- `ERC2771Context`: Prevent revert in `_msgData()` when a call originating from a trusted forwarder is not long enough to contain the request signer address (i.e. `msg.data.length` is less than 20 bytes). Return the full calldata in that case. ([#4484](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4484))
#### Proxy
- `ProxyAdmin`: Removed `getProxyAdmin` and `getProxyImplementation` getters. ([#3820](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3820))
- `TransparentUpgradeableProxy`: Removed `admin` and `implementation` getters, which were only callable by the proxy owner and thus not very useful. ([#3820](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3820))
- `ERC1967Utils`: Refactored the `ERC1967Upgrade` abstract contract as a library. ([#4325](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4325))
- `TransparentUpgradeableProxy`: Admin is now stored in an immutable variable (set during construction) to avoid unnecessary storage reads on every proxy call. This removed the ability to ever change the admin. Transfer of the upgrade capability is exclusively handled through the ownership of the `ProxyAdmin`. ([#4354](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4354))
- Moved the logic to validate ERC-1822 during an upgrade from `ERC1967Utils` to `UUPSUpgradeable`. ([#4356](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4356))
- `UUPSUpgradeable`, `TransparentUpgradeableProxy` and `ProxyAdmin`: Removed `upgradeTo` and `upgrade` functions, and made `upgradeToAndCall` and `upgradeAndCall` ignore the data argument if it is empty. It is no longer possible to invoke the receive function (or send value with empty data) along with an upgrade. ([#4382](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4382))
- `BeaconProxy`: Reject value in initialization unless a payable function is explicitly invoked. ([#4382](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4382))
- `Proxy`: Removed redundant `receive` function. ([#4434](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4434))
- `BeaconProxy`: Use an immutable variable to store the address of the beacon. It is no longer possible for a `BeaconProxy` to upgrade by changing to another beacon. ([#4435](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4435))
- `Initializable`: Use the namespaced storage pattern to avoid putting critical variables in slot 0. Allow reinitializer versions greater than 256. ([#4460](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4460))
- `Initializable`: Use intermediate variables to improve readability. ([#4576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4576))
#### Token
- `ERC20`, `ERC721`, `ERC1155`: Deleted `_beforeTokenTransfer` and `_afterTokenTransfer` hooks, added a new internal `_update` function for customizations, and refactored all extensions using those hooks to use `_update` instead. ([#3838](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3838), [#3876](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3876), [#4377](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4377))
- `ERC20`: Removed `Approval` event previously emitted in `transferFrom` to indicate that part of the allowance was consumed. With this change, allowances are no longer reconstructible from events. See the code for guidelines on how to re-enable this event if needed. ([#4370](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4370))
- `ERC20`: Removed the non-standard `increaseAllowance` and `decreaseAllowance` functions. ([#4585](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4585))
- `ERC20Votes`: Changed internal vote accounting to reusable `Votes` module previously used by `ERC721Votes`. Removed implicit `ERC20Permit` inheritance. Note that the `DOMAIN_SEPARATOR` getter was previously guaranteed to be available for `ERC20Votes` contracts, but is no longer available unless `ERC20Permit` is explicitly used; ERC-5267 support is included in `ERC20Votes` with `EIP712` and is recommended as an alternative. ([#3816](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3816))
- `SafeERC20`: Refactored `safeDecreaseAllowance` and `safeIncreaseAllowance` to support USDT-like tokens. ([#4260](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4260))
- `SafeERC20`: Removed `safePermit` in favor of documentation-only `permit` recommendations. Based on recommendations from @trust1995 ([#4582](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4582))
- `ERC721`: `_approve` no longer allows approving the owner of the tokenId. ([#4377](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/4377)) `_setApprovalForAll` no longer allows setting address(0) as an operator. ([#4377](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4377))
- `ERC721`: Renamed `_requireMinted` to `_requireOwned` and added a return value with the current owner. Implemented `ownerOf` in terms of `_requireOwned`. ([#4566](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4566))
- `ERC721Consecutive`: Added a `_firstConsecutiveId` internal function that can be overridden to change the id of the first token minted through `_mintConsecutive`. ([#4097](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4097))
- `ERC721URIStorage`: Allow setting the token URI prior to minting. ([#4559](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4559))
- `ERC721URIStorage`, `ERC721Royalty`: Stop resetting token-specific URI and royalties when burning. ([#4561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4561))
- `ERC1155`: Optimized array allocation. ([#4196](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4196))
- `ERC1155`: Removed check for address zero in `balanceOf`. ([#4263](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4263))
- `ERC1155`: Optimized array accesses by skipping bounds checking when unnecessary. ([#4300](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4300))
- `ERC1155`: Bubble errors triggered in the `onERC1155Received` and `onERC1155BatchReceived` hooks. ([#4314](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4314))
- `ERC1155Supply`: Added a `totalSupply()` function that returns the total amount of token circulating, this change will restrict the total tokens minted across all ids to 2\*\*256-1 . ([#3962](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3962))
- `ERC1155Receiver`: Removed in favor of `ERC1155Holder`. ([#4450](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4450))
#### Utils
- `Address`: Removed the ability to customize error messages. A common custom error is always used if the underlying revert reason cannot be bubbled up. ([#4502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4502))
- `Arrays`: Added `unsafeMemoryAccess` helpers to read from a memory array without checking the length. ([#4300](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4300))
- `Arrays`: Optimized `findUpperBound` by removing redundant SLOAD. ([#4442](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4442))
- `Checkpoints`: Library moved from `utils` to `utils/structs` ([#4275](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4275))
- `DoubleEndedQueue`: Refactored internal structure to use `uint128` instead of `int128`. This has no effect on the library interface. ([#4150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4150))
- `ECDSA`: Use unchecked arithmetic for the `tryRecover` function that receives the `r` and `vs` short-signature fields separately. ([#4301](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4301))
- `EIP712`: Added internal getters for the name and version strings ([#4303](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4303))
- `Math`: Makes `ceilDiv` to revert on 0 division even if the numerator is 0 ([#4348](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4348))
- `Math`: Optimized stack operations in `mulDiv`. ([#4494](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4494))
- `Math`: Renamed members of `Rounding` enum, and added a new rounding mode for "away from zero". ([#4455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4455))
- `MerkleProof`: Use custom error to report invalid multiproof instead of reverting with overflow panic. ([#4564](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4564))
- `MessageHashUtils`: Added a new library for creating message digest to be used along with signing or recovery such as ECDSA or ERC-1271. These functions are moved from the `ECDSA` library. ([#4430](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4430))
- `Nonces`: Added a new contract to keep track of user nonces. Used for signatures in `ERC20Permit`, `ERC20Votes`, and `ERC721Votes`. ([#3816](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3816))
- `ReentrancyGuard`, `Pausable`: Moved to `utils` directory. ([#4551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4551))
- `Strings`: Renamed `toString(int256)` to `toStringSigned(int256)`. ([#4330](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4330))
- Optimized `Strings.equal` ([#4262](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4262))
### How to migrate from 4.x
#### ERC20, ERC721, and ERC1155
These breaking changes will require modifications to ERC20, ERC721, and ERC1155 contracts, since the `_afterTokenTransfer` and `_beforeTokenTransfer` functions were removed. Thus, any customization made through those hooks should now be done overriding the new `_update` function instead.
Minting and burning are implemented by `_update` and customizations should be done by overriding this function as well. `_transfer`, `_mint` and `_burn` are no longer virtual (meaning they are not overridable) to guard against possible inconsistencies.
For example, a contract using `ERC20`'s `_beforeTokenTransfer` hook would have to be changed in the following way.
```diff
-function _beforeTokenTransfer(
+function _update(
address from,
address to,
uint256 amount
) internal virtual override {
- super._beforeTokenTransfer(from, to, amount);
require(!condition(), "ERC20: wrong condition");
+ super._update(from, to, amount);
}
```
#### More about ERC721
In the case of `ERC721`, the `_update` function does not include a `from` parameter, as the sender is implicitly the previous owner of the `tokenId`. The address of this previous owner is returned by the `_update` function, so it can be used for a posteriori checks. In addition to `to` and `tokenId`, a third parameter (`auth`) is present in this function. This parameter enabled an optional check that the caller/spender is approved to do the transfer. This check cannot be performed after the transfer (because the transfer resets the approval), and doing it before `_update` would require a duplicate call to `_ownerOf`.
In this logic of removing hidden SLOADs, the `_isApprovedOrOwner` function was removed in favor of a new `_isAuthorized` function. Overrides that used to target the `_isApprovedOrOwner` should now be performed on the `_isAuthorized` function. Calls to `_isApprovedOrOwner` that preceded a call to `_transfer`, `_burn` or `_approve` should be removed in favor of using the `auth` argument in `_update` and `_approve`. This is showcased in `ERC721Burnable.burn` and in `ERC721Wrapper.withdrawTo`.
The `_exists` function was removed. Calls to this function can be replaced by `_ownerOf(tokenId) != address(0)`.
#### More about ERC1155
Batch transfers will now emit `TransferSingle` if the batch consists of a single token, while in previous versions the `TransferBatch` event would be used for all transfers initiated through `safeBatchTransferFrom`. Both behaviors are compliant with the ERC-1155 specification.
#### ERC165Storage
Users that were registering EIP-165 interfaces with `_registerInterface` from `ERC165Storage` should instead do so by overriding the `supportsInterface` function as seen below:
```solidity
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
}
```
#### SafeMath
Methods in SafeMath superseded by native overflow checks in Solidity 0.8.0 were removed along with operations providing an interface for revert strings. The remaining methods were moved to `utils/Math.sol`.
```diff
- import "@openzeppelin/contracts/utils/math/SafeMath.sol";
+ import "@openzeppelin/contracts/utils/math/Math.sol";
function tryOperations(uint256 x, uint256 y) external view {
- (bool overflowsAdd, uint256 resultAdd) = SafeMath.tryAdd(x, y);
+ (bool overflowsAdd, uint256 resultAdd) = Math.tryAdd(x, y);
- (bool overflowsSub, uint256 resultSub) = SafeMath.trySub(x, y);
+ (bool overflowsSub, uint256 resultSub) = Math.trySub(x, y);
- (bool overflowsMul, uint256 resultMul) = SafeMath.tryMul(x, y);
+ (bool overflowsMul, uint256 resultMul) = Math.tryMul(x, y);
- (bool overflowsDiv, uint256 resultDiv) = SafeMath.tryDiv(x, y);
+ (bool overflowsDiv, uint256 resultDiv) = Math.tryDiv(x, y);
// ...
}
```
#### Adapting Governor modules
Custom Governor modules that override internal functions may require modifications if migrated to v5. In particular, the new internal functions `_queueOperations` and `_executeOperations` may need to be used. If assistance with this migration is needed reach out via the [OpenZeppelin Support Forum](https://forum.openzeppelin.com/c/support/contracts/18).
#### ECDSA and MessageHashUtils
The `ECDSA` library is now focused on signer recovery. Previously it also included utility methods for producing digests to be used with signing or recovery. These utilities have been moved to the `MessageHashUtils` library and should be imported if needed:
```diff
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
contract Verifier {
using ECDSA for bytes32;
+ using MessageHashUtils for bytes32;
function _verify(bytes32 data, bytes memory signature, address account) internal pure returns (bool) {
return data
.toEthSignedMessageHash()
.recover(signature) == account;
}
}
```
#### Interfaces and libraries in upgradeable contracts
The upgradeable version of the contracts library used to include a variant suffixed with `Upgradeable` for every contract. These variants, which are produced automatically, mainly include changes for dealing with storage that don't apply to libraries and interfaces.
The upgradeable library no longer includes upgradeable variants for libraries and interfaces. Projects migrating to 5.0 should replace their library and interface imports with their corresponding non-upgradeable version:
```diff
// Libraries
-import {AddressUpgradeable} from '@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol';
+import {Address} from '@openzeppelin/contracts/utils/Address.sol';
// Interfaces
-import {IERC20Upgradeable} from '@openzeppelin/contracts-upgradeable/interfaces/IERC20.sol';
+import {IERC20} from '@openzeppelin/contracts/interfaces/IERC20.sol';
```
#### Offchain Considerations
Some changes may affect offchain systems if they rely on assumptions that are changed along with these new breaking changes. These cases are:
##### Relying on revert strings for processing errors
A concrete example is AccessControl, where it was previously advised to catch revert reasons using the following regex:
```
/^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
```
Instead, contracts now revert with custom errors. Systems that interact with smart contracts outside of the network should consider reliance on revert strings and possibly support the new custom errors.
##### Relying on storage locations for retrieving data
After 5.0, the storage location of some variables was changed. This is the case for `Initializable` and all the upgradeable contracts since they now use namespaced storage locations. Any system relying on storage locations for retrieving data or detecting capabilities should be updated to support these new locations.
## 4.9.6 (2024-02-29)
- `Base64`: Fix issue where dirty memory located just after the input buffer is affecting the result. ([#4929](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4929))
## 4.9.5 (2023-12-08)
- `Multicall`: Make aware of non-canonical context (i.e. `msg.sender` is not `_msgSender()`), allowing compatibility with `ERC2771Context`. Patch duplicated `Address.functionDelegateCall` in v4.9.4 (removed).
## 4.9.3 (2023-07-28)
- `ERC2771Context`: Return the forwarder address whenever the `msg.data` of a call originating from a trusted forwarder is not long enough to contain the request signer address (i.e. `msg.data.length` is less than 20 bytes), as specified by ERC-2771. ([#4481](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4481))
- `ERC2771Context`: Prevent revert in `_msgData()` when a call originating from a trusted forwarder is not long enough to contain the request signer address (i.e. `msg.data.length` is less than 20 bytes). Return the full calldata in that case. ([#4484](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4484))
## 4.9.2 (2023-06-16)
- `MerkleProof`: Fix a bug in `processMultiProof` and `processMultiProofCalldata` that allows proving arbitrary leaves if the tree contains a node with value 0 at depth 1.
## 4.9.1 (2023-06-07)
- `Governor`: Add a mechanism to restrict the address of the proposer using a suffix in the description.
## 4.9.0 (2023-05-23)
- `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714))
- `ERC721Wrapper`: add a new extension of the `ERC721` token which wraps an underlying token. Deposit and withdraw guarantee that the ownership of each token is backed by a corresponding underlying token with the same identifier. ([#3863](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3863))
- `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920))
- `Governor`: add a public `cancel(uint256)` function. ([#3983](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3983))
- `Governor`: Enable timestamp operation for blockchains without a stable block time. This is achieved by connecting a Governor's internal clock to match a voting token's EIP-6372 interface. ([#3934](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3934))
- `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774))
- `IERC5313`: Add an interface for EIP-5313 that is now final. ([#4013](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4013))
- `IERC4906`: Add an interface for ERC-4906 that is now Final. ([#4012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4012))
- `StorageSlot`: Add support for `string` and `bytes`. ([#4008](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4008))
- `Votes`, `ERC20Votes`, `ERC721Votes`: support timestamp checkpointing using EIP-6372. ([#3934](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3934))
- `ERC4626`: Add mitigation to the inflation attack through virtual shares and assets. ([#3979](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3979))
- `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773))
- `ERC20Wrapper`: Make the `underlying` variable private and add a public accessor. ([#4029](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4029))
- `EIP712`: add EIP-5267 support for better domain discovery. ([#3969](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3969))
- `AccessControlDefaultAdminRules`: Add an extension of `AccessControl` with additional security rules for the `DEFAULT_ADMIN_ROLE`. ([#4009](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4009))
- `SignatureChecker`: Add `isValidERC1271SignatureNow` for checking a signature directly against a smart contract using ERC-1271. ([#3932](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3932))
- `SafeERC20`: Add a `forceApprove` function to improve compatibility with tokens behaving like USDT. ([#4067](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4067))
- `ERC1967Upgrade`: removed contract-wide `oz-upgrades-unsafe-allow delegatecall` annotation, replaced by granular annotation in `UUPSUpgradeable`. ([#3971](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3971))
- `ERC20Wrapper`: self wrapping and deposit by the wrapper itself are now explicitly forbidden. ([#4100](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4100))
- `ECDSA`: optimize bytes32 computation by using assembly instead of `abi.encodePacked`. ([#3853](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3853))
- `ERC721URIStorage`: Emit ERC-4906 `MetadataUpdate` in `_setTokenURI`. ([#4012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4012))
- `ShortStrings`: Added a library for handling short strings in a gas efficient way, with fallback to storage for longer strings. ([#4023](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4023))
- `SignatureChecker`: Allow return data length greater than 32 from EIP-1271 signers. ([#4038](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4038))
- `UUPSUpgradeable`: added granular `oz-upgrades-unsafe-allow-reachable` annotation to improve upgrade safety checks on latest version of the Upgrades Plugins (starting with `@openzeppelin/upgrades-core@1.21.0`). ([#3971](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3971))
- `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787))
- `Ownable2Step`: make `acceptOwnership` public virtual to enable usecases that require overriding it. ([#3960](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3960))
- `UUPSUpgradeable.sol`: Change visibility to the functions `upgradeTo ` and `upgradeToAndCall ` from `external` to `public`. ([#3959](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3959))
- `TimelockController`: Add the `CallSalt` event to emit on operation schedule. ([#4001](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4001))
- Reformatted codebase with latest version of Prettier Solidity. ([#3898](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3898))
- `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745))
- `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748))
- `Multicall`: annotate `multicall` function as upgrade safe to not raise a flag for its delegatecall. ([#3961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3961))
- `ERC20Pausable`, `ERC721Pausable`, `ERC1155Pausable`: Add note regarding missing public pausing functionality ([#4007](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4007))
- `ECDSA`: Add a function `toDataWithIntendedValidatorHash` that encodes data with version 0x00 following EIP-191. ([#4063](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4063))
- `MerkleProof`: optimize by using unchecked arithmetic. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745))
### Breaking changes
- `EIP712`: Addition of ERC5267 support requires support for user defined value types, which was released in Solidity version 0.8.8. This requires a pragma change from `^0.8.0` to `^0.8.8`.
- `EIP712`: Optimization of the cache for the upgradeable version affects the way `name` and `version` are set. This is no longer done through an initializer, and is instead part of the implementation's constructor. As a consequence, all proxies using the same implementation will necessarily share the same `name` and `version`. Additionally, an implementation upgrade risks changing the EIP712 domain unless the same `name` and `version` are used when deploying the new implementation contract.
### Deprecations
- `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793))
- `Timers`: The `Timers` library is now deprecated and will be removed in the next major release. ([#4062](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4062))
- `ERC777`: The `ERC777` token standard is no longer supported by OpenZeppelin. Our implementation is now deprecated and will be removed in the next major release. The corresponding standard interfaces remain available. ([#4066](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4066))
- `ERC1820Implementer`: The `ERC1820` pseudo-introspection mechanism is no longer supported by OpenZeppelin. Our implementation is now deprecated and will be removed in the next major release. The corresponding standard interfaces remain available. ([#4066](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4066))
## 4.8.3 (2023-04-13)
- `GovernorCompatibilityBravo`: Fix encoding of proposal data when signatures are missing.
- `TransparentUpgradeableProxy`: Fix transparency in case of selector clash with non-decodable calldata or payable mutability. ([#4154](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4154))
## 4.8.2 (2023-03-02)
- `ERC721Consecutive`: Fixed a bug when `_mintConsecutive` is used for batches of size 1 that could lead to balance overflow. Refer to the breaking changes section in the changelog for a note on the behavior of `ERC721._beforeTokenTransfer`.
### Breaking changes
- `ERC721`: The internal function `_beforeTokenTransfer` no longer updates balances, which it previously did when `batchSize` was greater than 1. This change has no consequence unless a custom ERC721 extension is explicitly invoking `_beforeTokenTransfer`. Balance updates in extensions must now be done explicitly using `__unsafe_increaseBalance`, with a name that indicates that there is an invariant that has to be manually verified.
## 4.8.1 (2023-01-12)
- `ERC4626`: Use staticcall instead of call when fetching underlying ERC-20 decimals. ([#3943](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3943))
## 4.8.0 (2022-11-08)
- `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722))
- `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598))
- `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339))
- `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468))
- `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469))
- `Governor`: make the `relay` function payable, and add support for EOA payments. ([#3730](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3730))
- `GovernorCompatibilityBravo`: remove unused `using` statements. ([#3506](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3506))
- `ERC20`: optimize `_transfer`, `_mint` and `_burn` by using `unchecked` arithmetic when possible. ([#3513](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3513))
- `ERC20Votes`, `ERC721Votes`: optimize `getPastVotes` for looking up recent checkpoints. ([#3673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3673))
- `ERC20FlashMint`: add an internal `_flashFee` function for overriding. ([#3551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3551))
- `ERC4626`: use the same `decimals()` as the underlying asset by default (if available). ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639))
- `ERC4626`: add internal `_initialConvertToShares` and `_initialConvertToAssets` functions to customize empty vaults behavior. ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639))
- `ERC721`: optimize transfers by making approval clearing implicit instead of emitting an event. ([#3481](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3481))
- `ERC721`: optimize burn by making approval clearing implicit instead of emitting an event. ([#3538](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3538))
- `ERC721`: Fix balance accounting when a custom `_beforeTokenTransfer` hook results in a transfer of the token under consideration. ([#3611](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3611))
- `ERC721`: use unchecked arithmetic for balance updates. ([#3524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3524))
- `ERC721Consecutive`: Implementation of EIP-2309 that allows batch minting of ERC721 tokens during construction. ([#3311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3311))
- `ReentrancyGuard`: Reduce code size impact of the modifier by using internal functions. ([#3515](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3515))
- `SafeCast`: optimize downcasting of signed integers. ([#3565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3565))
- `ECDSA`: Remove redundant check on the `v` value. ([#3591](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3591))
- `VestingWallet`: add `releasable` getters. ([#3580](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3580))
- `VestingWallet`: remove unused library `Math.sol`. ([#3605](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3605))
- `VestingWallet`: make constructor payable. ([#3665](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3665))
- `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600))
- `Clones`: optimized the assembly to use only the scratch space during deployments, and optimized `predictDeterministicAddress` to use fewer operations. ([#3640](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3640))
- `Checkpoints`: Use procedural generation to support multiple key/value lengths. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589))
- `Checkpoints`: Add new lookup mechanisms. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589))
- `Arrays`: Add `unsafeAccess` functions that allow reading and writing to an element in a storage array bypassing Solidity's "out-of-bounds" check. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589))
- `Strings`: optimize `toString`. ([#3573](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3573))
- `Ownable2Step`: extension of `Ownable` that makes the ownership transfers a two step process. ([#3620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3620))
- `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679))
- `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670))
- Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692))
### Breaking changes
- `ERC721`: In order to add support for batch minting via `ERC721Consecutive` it was necessary to make a minor breaking change in the internal interface of `ERC721`. Namely, the hooks `_beforeTokenTransfer` and `_afterTokenTransfer` have one additional argument that may need to be added to overrides:
```diff
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId,
+ uint256 batchSize
) internal virtual override
```
- `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior.
- `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role.
### Deprecations
- `EIP712`: Added the file `EIP712.sol` and deprecated `draft-EIP712.sol` since the EIP is no longer a Draft. Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3621))
```diff
-import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
+import "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
```
- `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3699](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699))
```diff
-import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol";
+import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";
```
### ERC-721 Compatibility Note
ERC-721 integrators that interpret contract state from events should make sure that they implement the clearing of approval that is implicit in every transfer according to the EIP. Previous versions of OpenZeppelin Contracts emitted an explicit `Approval` event even though it was not required by the specification, and this is no longer the case.
With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The internal functions that should be considered are `_ownerOf` (new), `_beforeTokenTransfer`, and `_afterTokenTransfer`.
### ERC-4626 Upgrade Note
Existing `ERC4626` contracts that are upgraded to 4.8 must initialize a new variable that holds the vault token decimals. The recommended way to do this is to use a [reinitializer]:
[reinitializer]: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-reinitializer-uint8-
```solidity
function migrateToV48() public reinitializer(2) {
__ERC4626_init(IERC20Upgradeable(asset()));
}
```
## 4.7.3 (2022-08-10)
### Breaking changes
- `ECDSA`: `recover(bytes32,bytes)` and `tryRecover(bytes32,bytes)` no longer accept compact signatures to prevent malleability. Compact signature support remains available using `recover(bytes32,bytes32,bytes32)` and `tryRecover(bytes32,bytes32,bytes32)`.
## 4.7.2 (2022-07-25)
- `LibArbitrumL2`, `CrossChainEnabledArbitrumL2`: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. ([#3578](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3578))
- `GovernorVotesQuorumFraction`: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. ([#3561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3561))
- `ERC165Checker`: Added protection against large returndata. ([#3587](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3587))
## 4.7.1 (2022-07-18)
- `SignatureChecker`: Fix an issue that causes `isValidSignatureNow` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552))
- `ERC165Checker`: Fix an issue that causes `supportsInterface` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552))
## 4.7.0 (2022-06-29)
- `TimelockController`: Migrate `_call` to `_execute` and allow inheritance and overriding similar to `Governor`. ([#3317](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3317))
- `CrossChainEnabledPolygonChild`: replace the `require` statement with the custom error `NotCrossChainCall`. ([#3380](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3380))
- `ERC20FlashMint`: Add customizable flash fee receiver. ([#3327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3327))
- `ERC4626`: add an extension of `ERC20` that implements the ERC4626 Tokenized Vault Standard. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171))
- `SafeERC20`: add `safePermit` as mitigation against phantom permit functions. ([#3280](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3280))
- `Math`: add a `mulDiv` function that can round the result either up or down. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171))
- `Math`: Add a `sqrt` function to compute square roots of integers, rounding either up or down. ([#3242](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3242))
- `Strings`: add a new overloaded function `toHexString` that converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. ([#3403](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3403))
- `EnumerableMap`: add new `UintToUintMap` map type. ([#3338](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3338))
- `EnumerableMap`: add new `Bytes32ToUintMap` map type. ([#3416](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3416))
- `SafeCast`: add support for many more types, using procedural code generation. ([#3245](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3245))
- `MerkleProof`: add `multiProofVerify` to prove multiple values are part of a Merkle tree. ([#3276](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3276))
- `MerkleProof`: add calldata versions of the functions to avoid copying input arrays to memory and save gas. ([#3200](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3200))
- `ERC721`, `ERC1155`: simplified revert reasons. ([#3254](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3254), ([#3438](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3438)))
- `ERC721`: removed redundant require statement. ([#3434](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3434))
- `PaymentSplitter`: add `releasable` getters. ([#3350](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3350))
- `Initializable`: refactored implementation of modifiers for easier understanding. ([#3450](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3450))
- `Proxies`: remove runtime check of ERC1967 storage slots. ([#3455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3455))
### Breaking changes
- `Initializable`: functions decorated with the modifier `reinitializer(1)` may no longer invoke each other.
## 4.6.0 (2022-04-26)
- `crosschain`: Add a new set of contracts for cross-chain applications. `CrossChainEnabled` is a base contract with instantiations for several chains and bridges, and `AccessControlCrossChain` is an extension of access control that allows cross-chain operation. ([#3183](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3183))
- `AccessControl`: add a virtual `_checkRole(bytes32)` function that can be overridden to alter the `onlyRole` modifier behavior. ([#3137](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3137))
- `EnumerableMap`: add new `AddressToUintMap` map type. ([#3150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3150))
- `EnumerableMap`: add new `Bytes32ToBytes32Map` map type. ([#3192](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3192))
- `ERC20FlashMint`: support infinite allowance when paying back a flash loan. ([#3226](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3226))
- `ERC20Wrapper`: the `decimals()` function now tries to fetch the value from the underlying token instance. If that calls revert, then the default value is used. ([#3259](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3259))
- `draft-ERC20Permit`: replace `immutable` with `constant` for `_PERMIT_TYPEHASH` since the `keccak256` of string literals is treated specially and the hash is evaluated at compile time. ([#3196](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3196))
- `ERC1155`: Add a `_afterTokenTransfer` hook for improved extensibility. ([#3166](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3166))
- `ERC1155URIStorage`: add a new extension that implements a `_setURI` behavior similar to ERC721's `_setTokenURI`. ([#3210](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3210))
- `DoubleEndedQueue`: a new data structure that supports efficient push and pop to both front and back, useful for FIFO and LIFO queues. ([#3153](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3153))
- `Governor`: improved security of `onlyGovernance` modifier when using an external executor contract (e.g. a timelock) that can operate without necessarily going through the governance protocol. ([#3147](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3147))
- `Governor`: Add a way to parameterize votes. This can be used to implement voting systems such as fractionalized voting, ERC721 based voting, or any number of other systems. The `params` argument added to `_countVote` method, and included in the newly added `_getVotes` method, can be used by counting and voting modules respectively for such purposes. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043))
- `Governor`: rewording of revert reason for consistency. ([#3275](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3275))
- `Governor`: fix an inconsistency in data locations that could lead to invalid bytecode being produced. ([#3295](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3295))
- `Governor`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by governors. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230))
- `TimelockController`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by timelocks. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230))
- `TimelockController`: Add a separate canceller role for the ability to cancel. ([#3165](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3165))
- `Initializable`: add a reinitializer modifier that enables the initialization of new modules, added to already initialized contracts through upgradeability. ([#3232](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3232))
- `Initializable`: add an Initialized event that tracks initialized version numbers. ([#3294](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3294))
- `ERC2981`: make `royaltyInfo` public to allow super call in overrides. ([#3305](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3305))
### Upgradeability notice
- `TimelockController`: **(Action needed)** The upgrade from <4.6 to >=4.6 introduces a new `CANCELLER_ROLE` that requires set up to be assignable. After the upgrade, only addresses with this role will have the ability to cancel. Proposers will no longer be able to cancel. Assigning cancellers can be done by an admin (including the timelock itself) once the role admin is set up. To do this, we recommend upgrading to the `TimelockControllerWith46MigrationUpgradeable` contract and then calling the `migrateTo46` function.
### Breaking changes
- `Governor`: Adds internal virtual `_getVotes` method that must be implemented; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing voting module extension, rename `getVotes` to `_getVotes` and add a `bytes memory` argument. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043))
- `Governor`: Adds `params` parameter to internal virtual `_countVote` method; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing counting module extension, add a `bytes memory` argument to `_countVote`. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043))
- `Governor`: Does not emit `VoteCast` event when params data is non-empty; instead emits `VoteCastWithParams` event. To fix this on an integration that consumes the `VoteCast` event, also fetch/monitor `VoteCastWithParams` events. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043))
- `Votes`: The internal virtual function `_getVotingUnits` was made `view` (which was accidentally missing). Any overrides should now be updated so they are `view` as well.
## 4.5.0 (2022-02-09)
- `ERC2981`: add implementation of the royalty standard, and the respective extensions for `ERC721` and `ERC1155`. ([#3012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3012))
- `GovernorTimelockControl`: improve the `state()` function to have it reflect cases where a proposal has been canceled directly on the timelock. ([#2977](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2977))
- Preset contracts are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com). ([#2986](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2986))
- `Governor`: add a relay function to help recover assets sent to a governor that is not its own executor (e.g. when using a timelock). ([#2926](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2926))
- `GovernorPreventLateQuorum`: add new module to ensure a minimum voting duration is available after the quorum is reached. ([#2973](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2973))
- `ERC721`: improved revert reason when transferring from wrong owner. ([#2975](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2975))
- `Votes`: Added a base contract for vote tracking with delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944))
- `ERC721Votes`: Added an extension of ERC721 enabled with vote tracking and delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944))
- `ERC2771Context`: use immutable storage to store the forwarder address, no longer an issue since Solidity >=0.8.8 allows reading immutable variables in the constructor. ([#2917](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2917))
- `Base64`: add a library to parse bytes into base64 strings using `encode(bytes memory)` function, and provide examples to show how to use to build URL-safe `tokenURIs`. ([#2884](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2884))
- `ERC20`: reduce allowance before triggering transfer. ([#3056](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3056))
- `ERC20`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085))
- `ERC20`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170))
- `ERC20Burnable`: do not update allowance on `burnFrom` when allowance is `type(uint256).max`. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170))
- `ERC777`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085))
- `ERC777`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170))
- `SignedMath`: a new signed version of the Math library with `max`, `min`, and `average`. ([#2686](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2686))
- `SignedMath`: add an `abs(int256)` method that returns the unsigned absolute value of a signed value. ([#2984](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2984))
- `ERC1967Upgrade`: Refactor the secure upgrade to use `ERC1822` instead of the previous rollback mechanism. This reduces code complexity and attack surface with similar security guarantees. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021))
- `UUPSUpgradeable`: Add `ERC1822` compliance to support the updated secure upgrade mechanism. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021))
- Some more functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior.
### Breaking changes
- `ERC1967Upgrade`: The function `_upgradeToAndCallSecure` was renamed to `_upgradeToAndCallUUPS`, along with the change in security mechanism described above.
- `Address`: The Solidity pragma is increased from `^0.8.0` to `^0.8.1`. This is required by the `account.code.length` syntax that replaces inline assembly. This may require users to bump their compiler version from `0.8.0` to `0.8.1` or later. Note that other parts of the code already include stricter requirements.
## 4.4.2 (2022-01-11)
### Bugfixes
- `GovernorCompatibilityBravo`: Fix error in the encoding of calldata for proposals submitted through the compatibility interface with explicit signatures. ([#3100](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3100))
## 4.4.1 (2021-12-14)
- `Initializable`: change the existing `initializer` modifier and add a new `onlyInitializing` modifier to prevent reentrancy risk. ([#3006](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3006))
### Breaking change
It is no longer possible to call an `initializer`-protected function from within another `initializer` function outside the context of a constructor. Projects using OpenZeppelin upgradeable proxies should continue to work as is, since in the common case the initializer is invoked in the constructor directly. If this is not the case for you, the suggested change is to use the new `onlyInitializing` modifier in the following way:
```diff
contract A {
- function initialize() public initializer { ... }
+ function initialize() internal onlyInitializing { ... }
}
contract B is A {
function initialize() public initializer {
A.initialize();
}
}
```
## 4.4.0 (2021-11-25)
- `Ownable`: add an internal `_transferOwnership(address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568))
- `AccessControl`: add internal `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568))
- `AccessControl`: mark `_setupRole(bytes32,address)` as deprecated in favor of `_grantRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568))
- `AccessControlEnumerable`: hook into `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2946](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2946))
- `EIP712`: cache `address(this)` to immutable storage to avoid potential issues if a vanilla contract is used in a delegatecall context. ([#2852](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2852))
- Add internal `_setApprovalForAll` to `ERC721` and `ERC1155`. ([#2834](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2834))
- `Governor`: shift vote start and end by one block to better match Compound's GovernorBravo and prevent voting at the Governor level if the voting snapshot is not ready. ([#2892](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2892))
- `GovernorCompatibilityBravo`: consider quorum an inclusive rather than exclusive minimum to match Compound's GovernorBravo. ([#2974](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2974))
- `GovernorSettings`: a new governor module that manages voting settings updatable through governance actions. ([#2904](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2904))
- `PaymentSplitter`: now supports ERC20 assets in addition to Ether. ([#2858](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2858))
- `ECDSA`: add a variant of `toEthSignedMessageHash` for arbitrary length message hashing. ([#2865](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2865))
- `MerkleProof`: add a `processProof` function that returns the rebuilt root hash given a leaf and a proof. ([#2841](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2841))
- `VestingWallet`: new contract that handles the vesting of Ether and ERC20 tokens following a customizable vesting schedule. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2748))
- `Governor`: enable receiving Ether when a Timelock contract is not used. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849))
- `GovernorTimelockCompound`: fix ability to use Ether stored in the Timelock contract. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849))
## 4.3.3 (2021-11-08)
- `ERC1155Supply`: Handle `totalSupply` changes by hooking into `_beforeTokenTransfer` to ensure consistency of balances and supply during `IERC1155Receiver.onERC1155Received` calls.
## 4.3.2 (2021-09-14)
- `UUPSUpgradeable`: Add modifiers to prevent `upgradeTo` and `upgradeToAndCall` being executed on any contract that is not the active ERC1967 proxy. This prevents these functions being called on implementation contracts or minimal ERC1167 clones, in particular.
## 4.3.1 (2021-08-26)
- `TimelockController`: Add additional isOperationReady check.
## 4.3.0 (2021-08-17)
- `ERC2771Context`: use private variable from storage to store the forwarder address. Fixes issues where `_msgSender()` was not callable from constructors. ([#2754](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2754))
- `EnumerableSet`: add `values()` functions that returns an array containing all values in a single call. ([#2768](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2768))
- `Governor`: added a modular system of `Governor` contracts based on `GovernorAlpha` and `GovernorBravo`. ([#2672](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2672))
- Add an `interfaces` folder containing solidity interfaces to final ERCs. ([#2517](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2517))
- `ECDSA`: add `tryRecover` functions that will not throw if the signature is invalid, and will return an error flag instead. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661))
- `SignatureChecker`: Reduce gas usage of the `isValidSignatureNow` function for the "signature by EOA" case. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661))
## 4.2.0 (2021-06-30)
- `ERC20Votes`: add a new extension of the `ERC20` token with support for voting snapshots and delegation. ([#2632](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2632))
- `ERC20VotesComp`: Variant of `ERC20Votes` that is compatible with Compound's `Comp` token interface but restricts supply to `uint96`. ([#2706](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2706))
- `ERC20Wrapper`: add a new extension of the `ERC20` token which wraps an underlying token. Deposit and withdraw guarantee that the total supply is backed by a corresponding amount of underlying token. ([#2633](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2633))
- Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`.
- Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`.
- `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678))
- Tokens: Wrap definitely safe subtractions in `unchecked` blocks.
- `Math`: Add a `ceilDiv` method for performing ceiling division.
- `ERC1155Supply`: add a new `ERC1155` extension that keeps track of the totalSupply of each tokenId. ([#2593](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2593))
- `BitMaps`: add a new `BitMaps` library that provides a storage efficient datastructure for `uint256` to `bool` mapping with contiguous keys. ([#2710](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2710))
### Breaking Changes
- `ERC20FlashMint` is no longer a Draft ERC. ([#2673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2673)))
**How to update:** Change your import paths by removing the `draft-` prefix from `@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20FlashMint.sol`.
> See [Releases and Stability: Drafts](https://docs.openzeppelin.com/contracts/4.x/releases-stability#drafts).
## 4.1.0 (2021-04-29)
- `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561))
- `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552))
- `ERC20Permit`: add a `_useNonce` to enable further usage of ERC712 signatures. ([#2565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2565))
- `ERC20FlashMint`: add an implementation of the ERC3156 extension for flash-minting ERC20 tokens. ([#2543](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2543))
- `SignatureChecker`: add a signature verification library that supports both EOA and ERC1271 compliant contracts as signers. ([#2532](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2532))
- `Multicall`: add abstract contract with `multicall(bytes[] calldata data)` function to bundle multiple calls together ([#2608](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2608))
- `ECDSA`: add support for ERC2098 short-signatures. ([#2582](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2582))
- `AccessControl`: add an `onlyRole` modifier to restrict specific function to callers bearing a specific role. ([#2609](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2609))
- `StorageSlot`: add a library for reading and writing primitive types to specific storage slots. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542))
- UUPS Proxies: add `UUPSUpgradeable` to implement the UUPS proxy pattern together with `EIP1967Proxy`. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542))
### Breaking changes
This release includes two small breaking changes in `TimelockController`.
1. The `onlyRole` modifier in this contract was designed to let anyone through if the role was granted to `address(0)`,
allowing the possibility to make a role "open", which can be used for `EXECUTOR_ROLE`. This modifier is now
replaced by `AccessControl.onlyRole`, which does not have this ability. The previous behavior was moved to the
modifier `TimelockController.onlyRoleOrOpenRole`.
2. It was possible to make `PROPOSER_ROLE` an open role (as described in the previous item) if it was granted to
`address(0)`. This would affect the `schedule`, `scheduleBatch`, and `cancel` operations in `TimelockController`.
This ability was removed as it does not make sense to open up the `PROPOSER_ROLE` in the same way that it does for
`EXECUTOR_ROLE`.
## 4.0.0 (2021-03-23)
- Now targeting the 0.8.x line of Solidity compilers. For 0.6.x (resp 0.7.x) support, use version 3.4.0 (resp 3.4.0-solc-0.7) of OpenZeppelin.
- `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492))
- `ERC20`: removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502))
- `Strings`: addition of a `toHexString` function. ([#2504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2504))
- `EnumerableMap`: change implementation to optimize for `key → value` lookups instead of enumeration. ([#2518](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2518))
- `GSN`: deprecate GSNv1 support in favor of upcoming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521))
- `ERC165`: remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behavior remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505))
- `Initializable`: make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531))
- `ERC721`: remove enumerability of tokens from the base implementation. This feature is now provided separately through the `ERC721Enumerable` extension. ([#2511](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2511))
- `AccessControl`: removed enumerability by default for a more lightweight contract. It is now opt-in through `AccessControlEnumerable`. ([#2512](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2512))
- Meta Transactions: add `ERC2771Context` and a `MinimalForwarder` for meta-transactions. ([#2508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2508))
- Overall reorganization of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503))
- `ERC20Capped`: optimize gas usage by enforcing the check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524))
- Rename `UpgradeableProxy` to `ERC1967Proxy`. ([#2547](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2547))
- `ERC777`: optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551))
- `ERC721URIStorage`: add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555))
- `AccessControl`: added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562))
- `ERC1155`: make `uri` public so overloading function can call it using super. ([#2576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2576))
### Bug fixes for beta releases
- `AccessControlEnumerable`: Fixed `renounceRole` not updating enumerable set of addresses for a role. ([#2572](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2572))
### How to upgrade from 3.x
Since this version has moved a few contracts to different directories, users upgrading from a previous version will need to adjust their import statements. To make this easier, the package includes a script that will migrate import statements automatically. After upgrading to the latest version of the package, run:
```
npx openzeppelin-contracts-migrate-imports
```
Make sure you're using git or another version control system to be able to recover from any potential error in our script.
### How to upgrade from 4.0-beta.x
Some further changes have been done between the different beta iterations. Transitions made during this period are configured in the `migrate-imports` script. Consequently, you can upgrade from any previous 4.0-beta.x version using the same script as described in the _How to upgrade from 3.x_ section.
## 3.4.2 (2021-07-24)
- `TimelockController`: Add additional isOperationReady check.
## 3.4.1 (2021-03-03)
- `ERC721`: made `_approve` an internal function (was private).
## 3.4.0 (2021-02-02)
- `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411))
- `EIP712`: added helpers to verify EIP712 typed data signatures on chain. ([#2418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2418))
- `ERC20Permit`: added an implementation of the ERC20 permit extension for gasless token approvals. ([#2237](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237))
- Presets: added token presets with preminted fixed supply `ERC20PresetFixedSupply` and `ERC777PresetFixedSupply`. ([#2399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2399))
- `Address`: added `functionDelegateCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333))
- `Clones`: added a library for deploying EIP 1167 minimal proxies. ([#2449](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2449))
- `Context`: moved from `contracts/GSN` to `contracts/utils`. ([#2453](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2453))
- `PaymentSplitter`: replace usage of `.transfer()` with `Address.sendValue` for improved compatibility with smart wallets. ([#2455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2455))
- `UpgradeableProxy`: bubble revert reasons from initialization calls. ([#2454](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2454))
- `SafeMath`: fix a memory allocation issue by adding new `SafeMath.tryOp(uint,uint)→(bool,uint)` functions. `SafeMath.op(uint,uint,string)→uint` are now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462))
- `EnumerableMap`: fix a memory allocation issue by adding new `EnumerableMap.tryGet(uint)→(bool,address)` functions. `EnumerableMap.get(uint)→string` is now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462))
- `ERC165Checker`: added batch `getSupportedInterfaces`. ([#2469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2469))
- `RefundEscrow`: `beneficiaryWithdraw` will forward all available gas to the beneficiary. ([#2480](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2480))
- Many view and pure functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior.
### Security Fixes
- `ERC777`: fix potential reentrancy issues for custom extensions to `ERC777`. ([#2483](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2483))
If you're using our implementation of ERC777 from version 3.3.0 or earlier, and you define a custom `_beforeTokenTransfer` function that writes to a storage variable, you may be vulnerable to a reentrancy attack. If you're affected and would like assistance please write to security@openzeppelin.com. [Read more in the pull request.](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2483)
## 3.3.0 (2020-11-26)
- Now supports both Solidity 0.6 and 0.7. Compiling with solc 0.7 will result in warnings. Install the `solc-0.7` tag to compile without warnings.
- `Address`: added `functionStaticCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333))
- `TimelockController`: added a contract to augment access control schemes with a delay. ([#2354](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2354))
- `EnumerableSet`: added `Bytes32Set`, for sets of `bytes32`. ([#2395](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2395))
## 3.2.2-solc-0.7 (2020-10-28)
- Resolve warnings introduced by Solidity 0.7.4. ([#2396](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2396))
## 3.2.1-solc-0.7 (2020-09-15)
- `ERC777`: Remove a warning about function state visibility in Solidity 0.7. ([#2327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2327))
## 3.2.0 (2020-09-10)
### New features
- Proxies: added the proxy contracts from OpenZeppelin SDK. ([#2335](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2335))
#### Proxy changes with respect to OpenZeppelin SDK
Aside from upgrading them from Solidity 0.5 to 0.6, we've changed a few minor things from the proxy contracts as they were found in OpenZeppelin SDK.
- `UpgradeabilityProxy` was renamed to `UpgradeableProxy`.
- `AdminUpgradeabilityProxy` was renamed to `TransparentUpgradeableProxy`.
- `Proxy._willFallback` was renamed to `Proxy._beforeFallback`.
- `UpgradeabilityProxy._setImplementation` and `AdminUpgradeabilityProxy._setAdmin` were made private.
### Improvements
- `Address.isContract`: switched from `extcodehash` to `extcodesize` for less gas usage. ([#2311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2311))
### Breaking changes
- `ERC20Snapshot`: switched to using `_beforeTokenTransfer` hook instead of overriding ERC20 operations. ([#2312](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2312))
This small change in the way we implemented `ERC20Snapshot` may affect users who are combining this contract with
other ERC20 flavors, since it no longer overrides `_transfer`, `_mint`, and `_burn`. This can result in having to remove Solidity `override(...)` specifiers in derived contracts for these functions, and to instead have to add it for `_beforeTokenTransfer`. See [Using Hooks](https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks) in the documentation.
## 3.1.0 (2020-06-23)
### New features
- `SafeCast`: added functions to downcast signed integers (e.g. `toInt32`), improving usability of `SignedSafeMath`. ([#2243](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2243))
- `functionCall`: new helpers that replicate Solidity's function call semantics, reducing the need to rely on `call`. ([#2264](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2264))
- `ERC1155`: added support for a base implementation, non-standard extensions and a preset contract. ([#2014](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2014), [#2230](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2230))
### Improvements
- `ReentrancyGuard`: reduced overhead of using the `nonReentrant` modifier. ([#2171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2171))
- `AccessControl`: added a `RoleAdminChanged` event to `_setAdminRole`. ([#2214](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2214))
- Made all `public` functions in the token preset contracts `virtual`. ([#2257](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2257))
### Deprecations
- `SafeERC20`: deprecated `safeApprove`. ([#2268](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2268))
## 3.0.2 (2020-06-08)
### Improvements
- Added SPX license identifier to all contracts. ([#2235](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2235))
## 3.0.1 (2020-04-27)
### Bugfixes
- `ERC777`: fixed the `_approve` internal function not validating some of their arguments for non-zero addresses. ([#2213](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2213))
## 3.0.0 (2020-04-20)
### New features
- `AccessControl`: new contract for managing permissions in a system, replacement for `Ownable` and `Roles`. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112))
- `SafeCast`: new functions to convert to and from signed and unsigned values: `toUint256` and `toInt256`. ([#2123](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2123))
- `EnumerableMap`: a new data structure for key-value pairs (like `mapping`) that can be iterated over. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
### Breaking changes
- `ERC721`: `burn(owner, tokenId)` was removed, use `burn(tokenId)` instead. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
- `ERC721`: `_checkOnERC721Received` was removed. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
- `ERC721`: `_transferFrom` and `_safeTransferFrom` were renamed to `_transfer` and `_safeTransfer`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162))
- `Ownable`: removed `_transferOwnership`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162))
- `PullPayment`, `Escrow`: `withdrawWithGas` was removed. The old `withdraw` function now forwards all gas. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125))
- `Roles` was removed, use `AccessControl` as a replacement. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112))
- `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114))
- `Create2`: added an `amount` argument to `deploy` for contracts with `payable` constructors. ([#2117](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2117))
- `Pausable`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
- `Strings`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
- `Counters`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
- `SignedSafeMath`: moved to the `math` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
- `ERC20Snapshot`: moved to the `token/ERC20` directory. `snapshot` was changed into an `internal` function. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122))
- `Ownable`: moved to the `access` directory. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
- `Ownable`: removed `isOwner`. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
- `Secondary`: removed from the library, use `Ownable` instead. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
- `Escrow`, `ConditionalEscrow`, `RefundEscrow`: these now use `Ownable` instead of `Secondary`, their external API changed accordingly. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120))
- `ERC20`: removed `_burnFrom`. ([#2119](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2119))
- `Address`: removed `toPayable`, use `payable(address)` instead. ([#2133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2133))
- `ERC777`: `_send`, `_mint` and `_burn` now use the caller as the operator. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134))
- `ERC777`: removed `_callsTokensToSend` and `_callTokensReceived`. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134))
- `EnumerableSet`: renamed `get` to `at`. ([#2151](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2151))
- `ERC165Checker`: functions no longer have a leading underscore. ([#2150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2150))
- `ERC721Metadata`, `ERC721Enumerable`: these contracts were removed, and their functionality merged into `ERC721`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
- `ERC721`: added a constructor for `name` and `symbol`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160))
- `ERC20Detailed`: this contract was removed and its functionality merged into `ERC20`. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161))
- `ERC20`: added a constructor for `name` and `symbol`. `decimals` now defaults to 18. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161))
- `Strings`: renamed `fromUint256` to `toString` ([#2188](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2188))
## 2.5.1 (2020-04-24)
### Bugfixes
- `ERC777`: fixed the `_send` and `_approve` internal functions not validating some of their arguments for non-zero addresses. ([#2212](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2212))
## 2.5.0 (2020-02-04)
### New features
- `SafeCast.toUintXX`: new library for integer downcasting, which allows for safe operation on smaller types (e.g. `uint32`) when combined with `SafeMath`. ([#1926](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1926))
- `ERC721Metadata`: added `baseURI`, which can be used for dramatic gas savings when all token URIs share a prefix (e.g. `http://api.myapp.com/tokens/<id>`). ([#1970](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1970))
- `EnumerableSet`: new library for storing enumerable sets of values. Only `AddressSet` is supported in this release. ([#2061](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/2061))
- `Create2`: simple library to make usage of the `CREATE2` opcode easier. ([#1744](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1744))
### Improvements
- `ERC777`: `_burn` is now internal, providing more flexibility and making it easier to create tokens that deflate. ([#1908](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1908))
- `ReentrancyGuard`: greatly improved gas efficiency by using the net gas metering mechanism introduced in the Istanbul hardfork. ([#1992](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1992), [#1996](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1996))
- `ERC777`: improve extensibility by making `_send` and related functions `internal`. ([#2027](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2027))
- `ERC721`: improved revert reason when transferring tokens to a non-recipient contract. ([#2018](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2018))
### Breaking changes
- `ERC165Checker` now requires a minimum Solidity compiler version of 0.5.10. ([#1829](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1829))
## 2.4.0 (2019-10-29)
### New features
- `Address.toPayable`: added a helper to convert between address types without having to resort to low-level casting. ([#1773](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1773))
- Facilities to make metatransaction-enabled contracts through the Gas Station Network. ([#1844](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1844))
- `Address.sendValue`: added a replacement to Solidity's `transfer`, removing the fixed gas stipend. ([#1962](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1962))
- Added replacement for functions that don't forward all gas (which have been deprecated): ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976))
- `PullPayment.withdrawPaymentsWithGas(address payable payee)`
- `Escrow.withdrawWithGas(address payable payee)`
- `SafeMath`: added support for custom error messages to `sub`, `div` and `mod` functions. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828))
### Improvements
- `Address.isContract`: switched from `extcodesize` to `extcodehash` for less gas usage. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802))
- `ERC20` and `ERC777` updated to throw custom errors on subtraction overflows. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828))
### Deprecations
- Deprecated functions that don't forward all gas: ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976))
- `PullPayment.withdrawPayments(address payable payee)`
- `Escrow.withdraw(address payable payee)`
### Breaking changes
- `Address` now requires a minimum Solidity compiler version of 0.5.5. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802))
- `SignatureBouncer` has been removed from drafts, both to avoid confusions with the GSN and `GSNRecipientSignature` (previously called `GSNBouncerSignature`) and because the API was not very clear. ([#1879](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1879))
### How to upgrade from 2.4.0-beta
The final 2.4.0 release includes a refactor of the GSN contracts that will be a breaking change for 2.4.0-beta users.
- The default empty implementations of `_preRelayedCall` and `_postRelayedCall` were removed and must now be explicitly implemented always in custom recipients. If your custom recipient didn't include an implementation, you can provide an empty one.
- `GSNRecipient`, `GSNBouncerBase`, and `GSNContext` were all merged into `GSNRecipient`.
- `GSNBouncerSignature` and `GSNBouncerERC20Fee` were renamed to `GSNRecipientSignature` and `GSNRecipientERC20Fee`.
- It is no longer necessary to inherit from `GSNRecipient` when using `GSNRecipientSignature` and `GSNRecipientERC20Fee`.
For example, a contract using `GSNBouncerSignature` would have to be changed in the following way.
```diff
-contract MyDapp is GSNRecipient, GSNBouncerSignature {
+contract MyDapp is GSNRecipientSignature {
```
Refer to the table below to adjust your inheritance list.
| 2.4.0-beta | 2.4.0 |
| ----------------------------------- | ----------------------- |
| `GSNRecipient, GSNBouncerSignature` | `GSNRecipientSignature` |
| `GSNRecipient, GSNBouncerERC20Fee` | `GSNRecipientERC20Fee` |
| `GSNBouncerBase` | `GSNRecipient` |
## 2.3.0 (2019-05-27)
### New features
- `ERC1820`: added support for interacting with the [ERC1820](https://eips.ethereum.org/EIPS/eip-1820) registry contract (`IERC1820Registry`), as well as base contracts that can be registered as implementers there. ([#1677](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1677))
- `ERC777`: support for the [ERC777 token](https://eips.ethereum.org/EIPS/eip-777), which has multiple improvements over `ERC20` (but is backwards compatible with it) such as built-in burning, a more straightforward permission system, and optional sender and receiver hooks on transfer (mandatory for contracts!). ([#1684](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1684))
- All contracts now have revert reason strings, which give insight into error conditions, and help debug failing transactions. ([#1704](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1704))
### Improvements
- Reverted the Solidity version bump done in v2.2.0, setting the minimum compiler version to v0.5.0, to prevent unexpected build breakage. Users are encouraged however to stay on top of new compiler releases, which usually include bugfixes. ([#1729](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1729))
### Bugfixes
- `PostDeliveryCrowdsale`: some validations where skipped when paired with other crowdsale flavors, such as `AllowanceCrowdsale`, or `MintableCrowdsale` and `ERC20Capped`, which could cause buyers to not be able to claim their purchased tokens. ([#1721](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1721))
- `ERC20._transfer`: the `from` argument was allowed to be the zero address, so it was possible to internally trigger a transfer of 0 tokens from the zero address. This address is not a valid destinatary of transfers, nor can it give or receive allowance, so this behavior was inconsistent. It now reverts. ([#1752](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1752))
## 2.2.0 (2019-03-14)
### New features
- `ERC20Snapshot`: create snapshots on demand of the token balances and total supply, to later retrieve and e.g. calculate dividends at a past time. ([#1617](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1617))
- `SafeERC20`: `ERC20` contracts with no return value (i.e. that revert on failure) are now supported. ([#1655](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1655))
- `ERC20`: added internal `_approve(address owner, address spender, uint256 value)`, allowing derived contracts to set the allowance of arbitrary accounts. ([#1609](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1609))
- `ERC20Metadata`: added internal `_setTokenURI(string memory tokenURI)`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618))
- `TimedCrowdsale`: added internal `_extendTime(uint256 newClosingTime)` as well as `TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime)` event allowing to extend the crowdsale, as long as it hasn't already closed.
### Improvements
- Upgraded the minimum compiler version to v0.5.2: this removes many Solidity warnings that were false positives. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606))
- `ECDSA`: `recover` no longer accepts malleable signatures (those using upper-range values for `s`, or 0/1 for `v`). ([#1622](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1622))
- `ERC721`'s transfers are now more gas efficient due to removal of unnecessary `SafeMath` calls. ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610))
- Fixed variable shadowing issues. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606))
### Bugfixes
- (minor) `SafeERC20`: `safeApprove` wasn't properly checking for a zero allowance when attempting to set a non-zero allowance. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647))
### Breaking changes in drafts
- `TokenMetadata` has been renamed to `ERC20Metadata`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618))
- The library `Counter` has been renamed to `Counters` and its API has been improved. See an example in `ERC721`, lines [17](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L17) and [204](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L204). ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610))
## 2.1.3 (2019-02-26)
- Backported `SafeERC20.safeApprove` bugfix. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647))
## 2.1.2 (2019-01-17)
- Removed most of the test suite from the npm package, except `PublicRole.behavior.js`, which may be useful to users testing their own `Roles`.
## 2.1.1 (2019-01-04)
- Version bump to avoid conflict in the npm registry.
## 2.1.0 (2019-01-04)
### New features
- Now targeting the 0.5.x line of Solidity compilers. For 0.4.24 support, use version 2.0 of OpenZeppelin.
- `WhitelistCrowdsale`: a crowdsale where only whitelisted accounts (`WhitelistedRole`) can purchase tokens. Adding or removing accounts from the whitelist is done by whitelist admins (`WhitelistAdminRole`). Similar to the pre-2.0 `WhitelistedCrowdsale`. ([#1525](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1525), [#1589](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1589))
- `RefundablePostDeliveryCrowdsale`: replacement for `RefundableCrowdsale` (deprecated, see below) where tokens are only granted once the crowdsale ends (if it meets its goal). ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543))
- `PausableCrowdsale`: allows for pausers (`PauserRole`) to pause token purchases. Other crowdsale operations (e.g. withdrawals and refunds, if applicable) are not affected. ([#832](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/832))
- `ERC20`: `transferFrom` and `_burnFrom ` now emit `Approval` events, to represent the token's state comprehensively through events. ([#1524](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1524))
- `ERC721`: added `_burn(uint256 tokenId)`, replacing the similar deprecated function (see below). ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550))
- `ERC721`: added `_tokensOfOwner(address owner)`, allowing to internally retrieve the array of an account's owned tokens. ([#1522](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1522))
- Crowdsales: all constructors are now `public`, meaning it is not necessary to extend these contracts in order to deploy them. The exception is `FinalizableCrowdsale`, since it is meaningless unless extended. ([#1564](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1564))
- `SignedSafeMath`: added overflow-safe operations for signed integers (`int256`). ([#1559](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1559), [#1588](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1588))
### Improvements
- The compiler version required by `Array` was behind the rest of the library so it was updated to `v0.4.24`. ([#1553](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1553))
- Now conforming to a 4-space indentation code style. ([1508](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1508))
- `ERC20`: more gas efficient due to removed redundant `require`s. ([#1409](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1409))
- `ERC721`: fixed a bug that prevented internal data structures from being properly cleaned, missing potential gas refunds. ([#1539](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1539) and [#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549))
- `ERC721`: general gas savings on `transferFrom`, `_mint` and `_burn`, due to redundant `require`s and `SSTORE`s. ([#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549))
### Bugfixes
### Breaking changes
### Deprecations
- `ERC721._burn(address owner, uint256 tokenId)`: due to the `owner` parameter being unnecessary. ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550))
- `RefundableCrowdsale`: due to trading abuse potential on crowdsales that miss their goal. ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543))
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socioeconomic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact@openzeppelin.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guidelines
There are many ways to contribute to OpenZeppelin Contracts.
## Troubleshooting
You can help other users in the community to solve their smart contract issues in the [OpenZeppelin Forum].
[OpenZeppelin Forum]: https://forum.openzeppelin.com/
## Opening an issue
You can [open an issue] to suggest a feature or report a minor bug. For serious bugs please do not open an issue, instead refer to our [security policy] for appropriate steps.
If you believe your issue may be due to user error and not a problem in the library, consider instead posting a question on the [OpenZeppelin Forum].
Before opening an issue, be sure to search through the existing open and closed issues, and consider posting a comment in one of those instead.
When requesting a new feature, include as many details as you can, especially around the use cases that motivate it. Features are prioritized according to the impact they may have on the ecosystem, so we appreciate information showing that the impact could be high.
[security policy]: https://github.com/OpenZeppelin/openzeppelin-contracts/security
[open an issue]: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/new/choose
## Submitting a pull request
If you would like to contribute code or documentation you may do so by forking the repository and submitting a pull request.
Any non-trivial code contribution must be first discussed with the maintainers in an issue (see [Opening an issue](#opening-an-issue)). Only very minor changes are accepted without prior discussion.
Make sure to read and follow the [engineering guidelines](./GUIDELINES.md). Run linter and tests to make sure your pull request is good before submitting it.
Changelog entries should be added to each pull request by using [Changesets](https://github.com/changesets/changesets/).
When opening the pull request you will be presented with a template and a series of instructions. Read through it carefully and follow all the steps. Expect a review and feedback from the maintainers afterwards.
If you're looking for a good place to start, look for issues labelled ["good first issue"](https://github.com/OpenZeppelin/openzeppelin-contracts/labels/good%20first%20issue)!
================================================
FILE: FUNDING.json
================================================
{
"drips": {
"ethereum": {
"ownedBy": "0xAeb37910f93486C85A1F8F994b67E8187554d664"
}
},
"opRetro": {
"projectId": "0x939241afa4c4b9e1dda6b8250baa8f04fa8b0debce738cfd324c0b18f9926d25"
}
}
================================================
FILE: GUIDELINES.md
================================================
# Engineering Guidelines
## Testing
Code must be thoroughly tested with quality unit tests.
We defer to the [Moloch Testing Guide](https://github.com/MolochVentures/moloch/tree/master/test#readme) for specific recommendations, though not all of it is relevant here. Note the introduction:
> Tests should be written, not only to verify correctness of the target code, but to be comprehensively reviewed by other programmers. Therefore, for mission critical Solidity code, the quality of the tests is just as important (if not more so) than the code itself, and should be written to the highest standards of clarity and elegance.
Every addition or change to the code must come with relevant and comprehensive tests.
Refactors should avoid simultaneous changes to tests.
Flaky tests are not acceptable.
The test suite should run automatically for every change in the repository, and in pull requests tests must pass before merging.
The test suite coverage must be kept as close to 100% as possible, enforced in pull requests.
In some cases unit tests may be insufficient and complementary techniques should be used:
1. Property-based tests (aka. fuzzing) for math-heavy code.
2. Formal verification for state machines.
## Code style
Solidity code should be written in a consistent format enforced by a linter, following the official [Solidity Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html). See below for further [Solidity Conventions](#solidity-conventions).
The code should be simple and straightforward, prioritizing readability and understandability. Consistency and predictability should be maintained across the codebase. In particular, this applies to naming, which should be systematic, clear, and concise.
Sometimes these guidelines may be broken if doing so brings significant efficiency gains, but explanatory comments should be added.
Modularity should be pursued, but not at the cost of the above priorities.
## Documentation
For contributors, project guidelines and processes must be documented publicly.
For users, features must be abundantly documented. Documentation should include answers to common questions, solutions to common problems, and recommendations for critical decisions that the user may face.
All changes to the core codebase (excluding tests, auxiliary scripts, etc.) must be documented in a changelog, except for purely cosmetic or documentation changes.
## Peer review
All changes must be submitted through pull requests and go through peer code review.
The review must be approached by the reviewer in a similar way as if it was an audit of the code in question (but importantly it is not a substitute for and should not be considered an audit).
Reviewers should enforce code and project guidelines.
External contributions must be reviewed separately by multiple maintainers.
## Automation
Automation should be used as much as possible to reduce the possibility of human error and forgetfulness.
Automations that make use of sensitive credentials must use secure secret management, and must be strengthened against attacks such as [those on GitHub Actions workflows](https://github.com/nikitastupin/pwnhub).
Some other examples of automation are:
- Looking for common security vulnerabilities or errors in our code (eg. reentrancy analysis).
- Keeping dependencies up to date and monitoring for vulnerable dependencies.
## Pull requests
Pull requests are squash-merged to keep the `master` branch history clean. The title of the pull request becomes the commit message, so it should be written in a consistent format:
1) Begin with a capital letter.
2) Do not end with a period.
3) Write in the imperative: "Add feature X" and not "Adds feature X" or "Added feature X".
This repository does not follow conventional commits, so do not prefix the title with "fix:" or "feat:".
Work in progress pull requests should be submitted as Drafts and should not be prefixed with "WIP:".
Branch names don't matter, and commit messages within a pull request mostly don't matter either, although they can help the review process.
# Solidity Conventions
In addition to the official Solidity Style Guide we have a number of other conventions that must be followed.
* All state variables should be private.
Changes to state should be accompanied by events, and in some cases it is not correct to arbitrarily set state. Encapsulating variables as private and only allowing modification via setters enables us to ensure that events and other rules are followed reliably and prevents this kind of user error.
* Internal or private state variables or functions should have an underscore prefix.
```solidity
contract TestContract {
uint256 private _privateVar;
uint256 internal _internalVar;
function _testInternal() internal { ... }
function _testPrivate() private { ... }
}
```
* Functions should be declared virtual, with few exceptions listed below. The
contract logic should be written considering that these functions may be
overridden by developers, e.g. getting a value using an internal getter rather
than reading directly from a state variable.
If function A is an "alias" of function B, i.e. it invokes function B without
significant additional logic, then function A should not be virtual so that
any user overrides are implemented on B, preventing inconsistencies.
* Events should generally be emitted immediately after the state change that they
represent, and should be named in the past tense. Some exceptions may be made for gas
efficiency if the result doesn't affect observable ordering of events.
```solidity
function _burn(address who, uint256 value) internal {
super._burn(who, value);
emit TokensBurned(who, value);
}
```
Some standards (e.g. ERC-20) use present tense, and in those cases the
standard specification is used.
* Interface names should have a capital I prefix.
```solidity
interface IERC777 {
```
* Contracts not intended to be used standalone should be marked abstract
so they are required to be inherited by other contracts.
```solidity
abstract contract AccessControl is ..., {
```
* Return values are generally not named, unless they are not immediately clear or there are multiple return values.
```solidity
function expiration() public view returns (uint256) { // Good
function hasRole() public view returns (bool isMember, uint32 currentDelay) { // Good
```
* Unchecked arithmetic blocks should contain comments explaining why overflow is guaranteed not to happen. If the reason is immediately apparent from the line above the unchecked block, the comment may be omitted.
* Custom errors should be declared following the [EIP-6093](https://eips.ethereum.org/EIPS/eip-6093) rationale whenever reasonable. Also, consider the following:
* The domain prefix should be picked in the following order:
1. Use `ERC<num
gitextract_wqwjgfld/
├── .changeset/
│ ├── better-tires-pull.md
│ ├── blue-jars-lay.md
│ ├── bright-cooks-brush.md
│ ├── chatty-dryers-joke.md
│ ├── config.json
│ ├── curly-pandas-flow.md
│ ├── flat-flies-hear.md
│ ├── floppy-symbols-burn.md
│ ├── fruity-coats-smash.md
│ ├── gentle-apples-dance.md
│ ├── happy-pants-decide.md
│ ├── legal-cameras-sin.md
│ ├── rare-bushes-march.md
│ ├── red-gifts-appear.md
│ ├── silver-falcons-lay.md
│ ├── smooth-cows-notice.md
│ ├── some-dolls-shine.md
│ ├── spicy-seals-bake.md
│ ├── sweet-houses-cheer.md
│ ├── tangy-jokes-begin.md
│ └── tidy-turkeys-build.md
├── .codecov.yml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actions/
│ │ ├── gas-compare/
│ │ │ └── action.yml
│ │ ├── setup/
│ │ │ └── action.yml
│ │ └── storage-layout/
│ │ └── action.yml
│ └── workflows/
│ ├── actionlint.yml
│ ├── changeset.yml
│ ├── checks.yml
│ ├── docs.yml
│ ├── formal-verification.yml
│ ├── release-cycle.yml
│ ├── release-upgradeable.yml
│ └── upgradeable.yml
├── .gitignore
├── .gitmodules
├── .husky/
│ └── pre-commit
├── .mocharc.js
├── .prettierrc
├── .solcover.js
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── FUNDING.json
├── GUIDELINES.md
├── LICENSE
├── README.md
├── RELEASING.md
├── SECURITY.md
├── audits/
│ ├── 2017-03.md
│ └── README.md
├── contracts/
│ ├── access/
│ │ ├── AccessControl.sol
│ │ ├── IAccessControl.sol
│ │ ├── Ownable.sol
│ │ ├── Ownable2Step.sol
│ │ ├── README.adoc
│ │ ├── extensions/
│ │ │ ├── AccessControlDefaultAdminRules.sol
│ │ │ ├── AccessControlEnumerable.sol
│ │ │ ├── IAccessControlDefaultAdminRules.sol
│ │ │ └── IAccessControlEnumerable.sol
│ │ └── manager/
│ │ ├── AccessManaged.sol
│ │ ├── AccessManager.sol
│ │ ├── AuthorityUtils.sol
│ │ ├── IAccessManaged.sol
│ │ ├── IAccessManager.sol
│ │ └── IAuthority.sol
│ ├── account/
│ │ ├── Account.sol
│ │ ├── README.adoc
│ │ ├── extensions/
│ │ │ ├── draft-AccountERC7579.sol
│ │ │ ├── draft-AccountERC7579Hooked.sol
│ │ │ └── draft-ERC7821.sol
│ │ └── utils/
│ │ ├── EIP7702Utils.sol
│ │ ├── draft-ERC4337Utils.sol
│ │ └── draft-ERC7579Utils.sol
│ ├── crosschain/
│ │ ├── CrosschainLinked.sol
│ │ ├── CrosschainRemoteExecutor.sol
│ │ ├── ERC7786Recipient.sol
│ │ ├── README.adoc
│ │ └── bridges/
│ │ ├── BridgeERC1155.sol
│ │ ├── BridgeERC20.sol
│ │ ├── BridgeERC721.sol
│ │ ├── BridgeERC7802.sol
│ │ └── abstract/
│ │ ├── BridgeFungible.sol
│ │ ├── BridgeMultiToken.sol
│ │ └── BridgeNonFungible.sol
│ ├── finance/
│ │ ├── README.adoc
│ │ ├── VestingWallet.sol
│ │ └── VestingWalletCliff.sol
│ ├── governance/
│ │ ├── Governor.sol
│ │ ├── IGovernor.sol
│ │ ├── README.adoc
│ │ ├── TimelockController.sol
│ │ ├── extensions/
│ │ │ ├── GovernorCountingFractional.sol
│ │ │ ├── GovernorCountingOverridable.sol
│ │ │ ├── GovernorCountingSimple.sol
│ │ │ ├── GovernorCrosschain.sol
│ │ │ ├── GovernorNoncesKeyed.sol
│ │ │ ├── GovernorPreventLateQuorum.sol
│ │ │ ├── GovernorProposalGuardian.sol
│ │ │ ├── GovernorSequentialProposalId.sol
│ │ │ ├── GovernorSettings.sol
│ │ │ ├── GovernorStorage.sol
│ │ │ ├── GovernorSuperQuorum.sol
│ │ │ ├── GovernorTimelockAccess.sol
│ │ │ ├── GovernorTimelockCompound.sol
│ │ │ ├── GovernorTimelockControl.sol
│ │ │ ├── GovernorVotes.sol
│ │ │ ├── GovernorVotesQuorumFraction.sol
│ │ │ └── GovernorVotesSuperQuorumFraction.sol
│ │ └── utils/
│ │ ├── IVotes.sol
│ │ ├── Votes.sol
│ │ └── VotesExtended.sol
│ ├── interfaces/
│ │ ├── IERC1155.sol
│ │ ├── IERC1155MetadataURI.sol
│ │ ├── IERC1155Receiver.sol
│ │ ├── IERC1271.sol
│ │ ├── IERC1363.sol
│ │ ├── IERC1363Receiver.sol
│ │ ├── IERC1363Spender.sol
│ │ ├── IERC165.sol
│ │ ├── IERC1820Implementer.sol
│ │ ├── IERC1820Registry.sol
│ │ ├── IERC1967.sol
│ │ ├── IERC20.sol
│ │ ├── IERC20Metadata.sol
│ │ ├── IERC2309.sol
│ │ ├── IERC2612.sol
│ │ ├── IERC2981.sol
│ │ ├── IERC3156.sol
│ │ ├── IERC3156FlashBorrower.sol
│ │ ├── IERC3156FlashLender.sol
│ │ ├── IERC4626.sol
│ │ ├── IERC4906.sol
│ │ ├── IERC5267.sol
│ │ ├── IERC5313.sol
│ │ ├── IERC5805.sol
│ │ ├── IERC6372.sol
│ │ ├── IERC6909.sol
│ │ ├── IERC721.sol
│ │ ├── IERC721Enumerable.sol
│ │ ├── IERC721Metadata.sol
│ │ ├── IERC721Receiver.sol
│ │ ├── IERC7751.sol
│ │ ├── IERC777.sol
│ │ ├── IERC777Recipient.sol
│ │ ├── IERC777Sender.sol
│ │ ├── IERC7913.sol
│ │ ├── README.adoc
│ │ ├── draft-IERC1822.sol
│ │ ├── draft-IERC4337.sol
│ │ ├── draft-IERC6093.sol
│ │ ├── draft-IERC7579.sol
│ │ ├── draft-IERC7674.sol
│ │ ├── draft-IERC7786.sol
│ │ ├── draft-IERC7802.sol
│ │ └── draft-IERC7821.sol
│ ├── metatx/
│ │ ├── ERC2771Context.sol
│ │ ├── ERC2771Forwarder.sol
│ │ └── README.adoc
│ ├── mocks/
│ │ ├── AccessManagedTarget.sol
│ │ ├── AccessManagerMock.sol
│ │ ├── ArraysMock.sol
│ │ ├── AuthorityMock.sol
│ │ ├── Base64Dirty.sol
│ │ ├── BatchCaller.sol
│ │ ├── CallReceiverMock.sol
│ │ ├── ConstructorMock.sol
│ │ ├── ContextMock.sol
│ │ ├── DummyImplementation.sol
│ │ ├── EIP712Verifier.sol
│ │ ├── ERC1271WalletMock.sol
│ │ ├── ERC165Mock.sol
│ │ ├── ERC2771ContextMock.sol
│ │ ├── ERC3156FlashBorrowerMock.sol
│ │ ├── EtherReceiverMock.sol
│ │ ├── InitializableMock.sol
│ │ ├── MerkleProofCustomHashMock.sol
│ │ ├── MerkleTreeMock.sol
│ │ ├── MulticallHelper.sol
│ │ ├── MultipleInheritanceInitializableMocks.sol
│ │ ├── PausableMock.sol
│ │ ├── ReentrancyAttack.sol
│ │ ├── ReentrancyMock.sol
│ │ ├── ReentrancyTransientMock.sol
│ │ ├── RegressionImplementation.sol
│ │ ├── SingleInheritanceInitializableMocks.sol
│ │ ├── Stateless.sol
│ │ ├── StorageSlotMock.sol
│ │ ├── TimelockReentrant.sol
│ │ ├── TransientSlotMock.sol
│ │ ├── UpgradeableBeaconMock.sol
│ │ ├── VotesExtendedMock.sol
│ │ ├── VotesMock.sol
│ │ ├── account/
│ │ │ ├── AccountMock.sol
│ │ │ ├── modules/
│ │ │ │ └── ERC7579Mock.sol
│ │ │ └── utils/
│ │ │ └── ERC7579UtilsMock.sol
│ │ ├── compound/
│ │ │ └── CompTimelock.sol
│ │ ├── crosschain/
│ │ │ ├── ERC7786GatewayMock.sol
│ │ │ └── ERC7786RecipientMock.sol
│ │ ├── docs/
│ │ │ ├── AccessManagerEnumerable.sol
│ │ │ ├── ERC20WithAutoMinerReward.sol
│ │ │ ├── ERC4626Fees.sol
│ │ │ ├── MyNFT.sol
│ │ │ ├── access-control/
│ │ │ │ ├── AccessControlERC20MintBase.sol
│ │ │ │ ├── AccessControlERC20MintMissing.sol
│ │ │ │ ├── AccessControlERC20MintOnlyRole.sol
│ │ │ │ ├── AccessControlModified.sol
│ │ │ │ ├── AccessManagedERC20MintBase.sol
│ │ │ │ └── MyContractOwnable.sol
│ │ │ ├── account/
│ │ │ │ ├── MyAccountEIP7702.sol
│ │ │ │ └── MyFactoryAccount.sol
│ │ │ ├── governance/
│ │ │ │ ├── MyGovernor.sol
│ │ │ │ ├── MyToken.sol
│ │ │ │ ├── MyTokenTimestampBased.sol
│ │ │ │ └── MyTokenWrapped.sol
│ │ │ ├── token/
│ │ │ │ ├── ERC1155/
│ │ │ │ │ ├── GameItems.sol
│ │ │ │ │ └── MyERC115HolderContract.sol
│ │ │ │ ├── ERC20/
│ │ │ │ │ └── GLDToken.sol
│ │ │ │ ├── ERC6909/
│ │ │ │ │ └── ERC6909GameItems.sol
│ │ │ │ └── ERC721/
│ │ │ │ └── GameItem.sol
│ │ │ └── utilities/
│ │ │ ├── Base64NFT.sol
│ │ │ └── Multicall.sol
│ │ ├── governance/
│ │ │ ├── GovernorCountingOverridableMock.sol
│ │ │ ├── GovernorCrosschain.sol
│ │ │ ├── GovernorFractionalMock.sol
│ │ │ ├── GovernorMock.sol
│ │ │ ├── GovernorNoncesKeyedMock.sol
│ │ │ ├── GovernorPreventLateQuorumMock.sol
│ │ │ ├── GovernorProposalGuardianMock.sol
│ │ │ ├── GovernorSequentialProposalIdMock.sol
│ │ │ ├── GovernorStorageMock.sol
│ │ │ ├── GovernorSuperQuorumMock.sol
│ │ │ ├── GovernorTimelockAccessMock.sol
│ │ │ ├── GovernorTimelockCompoundMock.sol
│ │ │ ├── GovernorTimelockControlMock.sol
│ │ │ ├── GovernorVoteMock.sol
│ │ │ ├── GovernorVotesSuperQuorumFractionMock.sol
│ │ │ └── GovernorWithParamsMock.sol
│ │ ├── proxy/
│ │ │ ├── BadBeacon.sol
│ │ │ ├── ClashingImplementation.sol
│ │ │ ├── ERC1967ProxyUnsafe.sol
│ │ │ └── UUPSUpgradeableMock.sol
│ │ ├── token/
│ │ │ ├── ERC1155ReceiverMock.sol
│ │ │ ├── ERC1363ForceApproveMock.sol
│ │ │ ├── ERC1363NoReturnMock.sol
│ │ │ ├── ERC1363ReceiverMock.sol
│ │ │ ├── ERC1363ReturnFalseMock.sol
│ │ │ ├── ERC1363SpenderMock.sol
│ │ │ ├── ERC20ApprovalMock.sol
│ │ │ ├── ERC20BridgeableMock.sol
│ │ │ ├── ERC20DecimalsMock.sol
│ │ │ ├── ERC20ExcessDecimalsMock.sol
│ │ │ ├── ERC20FlashMintMock.sol
│ │ │ ├── ERC20ForceApproveMock.sol
│ │ │ ├── ERC20GetterHelper.sol
│ │ │ ├── ERC20Mock.sol
│ │ │ ├── ERC20MulticallMock.sol
│ │ │ ├── ERC20NoReturnMock.sol
│ │ │ ├── ERC20Reentrant.sol
│ │ │ ├── ERC20ReturnFalseMock.sol
│ │ │ ├── ERC20VotesAdditionalCheckpointsMock.sol
│ │ │ ├── ERC20VotesLegacyMock.sol
│ │ │ ├── ERC20VotesTimestampMock.sol
│ │ │ ├── ERC4626LimitsMock.sol
│ │ │ ├── ERC4626Mock.sol
│ │ │ ├── ERC4626OffsetMock.sol
│ │ │ ├── ERC4646FeesMock.sol
│ │ │ ├── ERC721ConsecutiveEnumerableMock.sol
│ │ │ ├── ERC721ConsecutiveMock.sol
│ │ │ ├── ERC721ReceiverMock.sol
│ │ │ └── ERC721URIStorageMock.sol
│ │ └── utils/
│ │ └── cryptography/
│ │ └── ERC7739Mock.sol
│ ├── package.json
│ ├── proxy/
│ │ ├── Clones.sol
│ │ ├── ERC1967/
│ │ │ ├── ERC1967Proxy.sol
│ │ │ └── ERC1967Utils.sol
│ │ ├── Proxy.sol
│ │ ├── README.adoc
│ │ ├── beacon/
│ │ │ ├── BeaconProxy.sol
│ │ │ ├── IBeacon.sol
│ │ │ └── UpgradeableBeacon.sol
│ │ ├── transparent/
│ │ │ ├── ProxyAdmin.sol
│ │ │ └── TransparentUpgradeableProxy.sol
│ │ └── utils/
│ │ ├── Initializable.sol
│ │ └── UUPSUpgradeable.sol
│ ├── token/
│ │ ├── ERC1155/
│ │ │ ├── ERC1155.sol
│ │ │ ├── IERC1155.sol
│ │ │ ├── IERC1155Receiver.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC1155Burnable.sol
│ │ │ │ ├── ERC1155Crosschain.sol
│ │ │ │ ├── ERC1155Pausable.sol
│ │ │ │ ├── ERC1155Supply.sol
│ │ │ │ ├── ERC1155URIStorage.sol
│ │ │ │ └── IERC1155MetadataURI.sol
│ │ │ └── utils/
│ │ │ ├── ERC1155Holder.sol
│ │ │ └── ERC1155Utils.sol
│ │ ├── ERC20/
│ │ │ ├── ERC20.sol
│ │ │ ├── IERC20.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC1363.sol
│ │ │ │ ├── ERC20Burnable.sol
│ │ │ │ ├── ERC20Capped.sol
│ │ │ │ ├── ERC20Crosschain.sol
│ │ │ │ ├── ERC20FlashMint.sol
│ │ │ │ ├── ERC20Pausable.sol
│ │ │ │ ├── ERC20Permit.sol
│ │ │ │ ├── ERC20Votes.sol
│ │ │ │ ├── ERC20Wrapper.sol
│ │ │ │ ├── ERC4626.sol
│ │ │ │ ├── IERC20Metadata.sol
│ │ │ │ ├── IERC20Permit.sol
│ │ │ │ ├── draft-ERC20Bridgeable.sol
│ │ │ │ └── draft-ERC20TemporaryApproval.sol
│ │ │ └── utils/
│ │ │ ├── ERC1363Utils.sol
│ │ │ └── SafeERC20.sol
│ │ ├── ERC6909/
│ │ │ ├── ERC6909.sol
│ │ │ ├── README.adoc
│ │ │ └── extensions/
│ │ │ ├── ERC6909ContentURI.sol
│ │ │ ├── ERC6909Metadata.sol
│ │ │ └── ERC6909TokenSupply.sol
│ │ ├── ERC721/
│ │ │ ├── ERC721.sol
│ │ │ ├── IERC721.sol
│ │ │ ├── IERC721Receiver.sol
│ │ │ ├── README.adoc
│ │ │ ├── extensions/
│ │ │ │ ├── ERC721Burnable.sol
│ │ │ │ ├── ERC721Consecutive.sol
│ │ │ │ ├── ERC721Crosschain.sol
│ │ │ │ ├── ERC721Enumerable.sol
│ │ │ │ ├── ERC721Pausable.sol
│ │ │ │ ├── ERC721Royalty.sol
│ │ │ │ ├── ERC721URIStorage.sol
│ │ │ │ ├── ERC721Votes.sol
│ │ │ │ ├── ERC721Wrapper.sol
│ │ │ │ ├── IERC721Enumerable.sol
│ │ │ │ └── IERC721Metadata.sol
│ │ │ └── utils/
│ │ │ ├── ERC721Holder.sol
│ │ │ └── ERC721Utils.sol
│ │ └── common/
│ │ ├── ERC2981.sol
│ │ └── README.adoc
│ ├── utils/
│ │ ├── Address.sol
│ │ ├── Arrays.sol
│ │ ├── Base58.sol
│ │ ├── Base64.sol
│ │ ├── Blockhash.sol
│ │ ├── Bytes.sol
│ │ ├── CAIP10.sol
│ │ ├── CAIP2.sol
│ │ ├── Calldata.sol
│ │ ├── Comparators.sol
│ │ ├── Context.sol
│ │ ├── Create2.sol
│ │ ├── Errors.sol
│ │ ├── LowLevelCall.sol
│ │ ├── Memory.sol
│ │ ├── Multicall.sol
│ │ ├── Nonces.sol
│ │ ├── NoncesKeyed.sol
│ │ ├── Packing.sol
│ │ ├── Panic.sol
│ │ ├── Pausable.sol
│ │ ├── README.adoc
│ │ ├── RLP.sol
│ │ ├── ReentrancyGuard.sol
│ │ ├── ReentrancyGuardTransient.sol
│ │ ├── RelayedCall.sol
│ │ ├── ShortStrings.sol
│ │ ├── SimulateCall.sol
│ │ ├── SlotDerivation.sol
│ │ ├── StorageSlot.sol
│ │ ├── Strings.sol
│ │ ├── TransientSlot.sol
│ │ ├── cryptography/
│ │ │ ├── ECDSA.sol
│ │ │ ├── EIP712.sol
│ │ │ ├── Hashes.sol
│ │ │ ├── MerkleProof.sol
│ │ │ ├── MessageHashUtils.sol
│ │ │ ├── P256.sol
│ │ │ ├── README.adoc
│ │ │ ├── RSA.sol
│ │ │ ├── SignatureChecker.sol
│ │ │ ├── TrieProof.sol
│ │ │ ├── WebAuthn.sol
│ │ │ ├── draft-ERC7739Utils.sol
│ │ │ ├── signers/
│ │ │ │ ├── AbstractSigner.sol
│ │ │ │ ├── MultiSignerERC7913.sol
│ │ │ │ ├── MultiSignerERC7913Weighted.sol
│ │ │ │ ├── SignerECDSA.sol
│ │ │ │ ├── SignerEIP7702.sol
│ │ │ │ ├── SignerERC7913.sol
│ │ │ │ ├── SignerP256.sol
│ │ │ │ ├── SignerRSA.sol
│ │ │ │ ├── SignerWebAuthn.sol
│ │ │ │ └── draft-ERC7739.sol
│ │ │ └── verifiers/
│ │ │ ├── ERC7913P256Verifier.sol
│ │ │ ├── ERC7913RSAVerifier.sol
│ │ │ └── ERC7913WebAuthnVerifier.sol
│ │ ├── draft-InteroperableAddress.sol
│ │ ├── introspection/
│ │ │ ├── ERC165.sol
│ │ │ ├── ERC165Checker.sol
│ │ │ └── IERC165.sol
│ │ ├── math/
│ │ │ ├── Math.sol
│ │ │ ├── SafeCast.sol
│ │ │ └── SignedMath.sol
│ │ ├── structs/
│ │ │ ├── Accumulators.sol
│ │ │ ├── BitMaps.sol
│ │ │ ├── Checkpoints.sol
│ │ │ ├── CircularBuffer.sol
│ │ │ ├── DoubleEndedQueue.sol
│ │ │ ├── EnumerableMap.sol
│ │ │ ├── EnumerableSet.sol
│ │ │ ├── Heap.sol
│ │ │ └── MerkleTree.sol
│ │ └── types/
│ │ └── Time.sol
│ └── vendor/
│ └── compound/
│ ├── ICompoundTimelock.sol
│ └── LICENSE
├── docs/
│ ├── README.md
│ ├── antora.yml
│ ├── config.js
│ ├── modules/
│ │ └── ROOT/
│ │ ├── nav.adoc
│ │ └── pages/
│ │ ├── access-control.adoc
│ │ ├── account-abstraction.adoc
│ │ ├── accounts.adoc
│ │ ├── backwards-compatibility.adoc
│ │ ├── eoa-delegation.adoc
│ │ ├── erc1155.adoc
│ │ ├── erc20-supply.adoc
│ │ ├── erc20.adoc
│ │ ├── erc4626.adoc
│ │ ├── erc6909.adoc
│ │ ├── erc721.adoc
│ │ ├── extending-contracts.adoc
│ │ ├── faq.adoc
│ │ ├── governance.adoc
│ │ ├── index.adoc
│ │ ├── multisig.adoc
│ │ ├── tokens.adoc
│ │ ├── upgradeable.adoc
│ │ ├── utilities.adoc
│ │ └── wizard.adoc
│ └── templates/
│ ├── contract.hbs
│ ├── helpers.js
│ ├── page.hbs
│ └── properties.js
├── eslint.config.mjs
├── foundry.toml
├── fv/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── diff/
│ │ ├── access_manager_AccessManager.sol.patch
│ │ ├── account_extensions_draft-AccountERC7579.sol.patch
│ │ └── token_ERC721_ERC721.sol.patch
│ ├── harnesses/
│ │ ├── AccessControlDefaultAdminRulesHarness.sol
│ │ ├── AccessControlHarness.sol
│ │ ├── AccessManagedHarness.sol
│ │ ├── AccessManagerHarness.sol
│ │ ├── AccountHarness.sol
│ │ ├── DoubleEndedQueueHarness.sol
│ │ ├── ERC20FlashMintHarness.sol
│ │ ├── ERC20PermitHarness.sol
│ │ ├── ERC20WrapperHarness.sol
│ │ ├── ERC3156FlashBorrowerHarness.sol
│ │ ├── ERC721Harness.sol
│ │ ├── ERC721ReceiverHarness.sol
│ │ ├── EnumerableMapHarness.sol
│ │ ├── EnumerableSetHarness.sol
│ │ ├── InitializableHarness.sol
│ │ ├── NoncesHarness.sol
│ │ ├── Ownable2StepHarness.sol
│ │ ├── OwnableHarness.sol
│ │ ├── PausableHarness.sol
│ │ └── TimelockControllerHarness.sol
│ ├── run.js
│ └── specs/
│ ├── AccessControl.conf
│ ├── AccessControl.spec
│ ├── AccessControlDefaultAdminRules.conf
│ ├── AccessControlDefaultAdminRules.spec
│ ├── AccessManaged.conf
│ ├── AccessManaged.spec
│ ├── AccessManager.conf
│ ├── AccessManager.spec
│ ├── Account.conf
│ ├── Account.spec
│ ├── DoubleEndedQueue.conf
│ ├── DoubleEndedQueue.spec
│ ├── ERC20.conf
│ ├── ERC20.spec
│ ├── ERC20FlashMint.conf
│ ├── ERC20FlashMint.spec
│ ├── ERC20Wrapper.conf
│ ├── ERC20Wrapper.spec
│ ├── ERC721.conf
│ ├── ERC721.spec
│ ├── EnumerableMap.conf
│ ├── EnumerableMap.spec
│ ├── EnumerableSet.conf
│ ├── EnumerableSet.spec
│ ├── Initializable.conf
│ ├── Initializable.spec
│ ├── Nonces.conf
│ ├── Nonces.spec
│ ├── Ownable.conf
│ ├── Ownable.spec
│ ├── Ownable2Step.conf
│ ├── Ownable2Step.spec
│ ├── Pausable.conf
│ ├── Pausable.spec
│ ├── TimelockController.conf
│ ├── TimelockController.spec
│ ├── helpers/
│ │ └── helpers.spec
│ └── methods/
│ ├── IAccessControl.spec
│ ├── IAccessControlDefaultAdminRules.spec
│ ├── IAccessManaged.spec
│ ├── IAccessManager.spec
│ ├── IAccount.spec
│ ├── IERC20.spec
│ ├── IERC2612.spec
│ ├── IERC3156FlashBorrower.spec
│ ├── IERC3156FlashLender.spec
│ ├── IERC5313.spec
│ ├── IERC721.spec
│ ├── IERC721Receiver.spec
│ ├── IOwnable.spec
│ └── IOwnable2Step.spec
├── fv-requirements.txt
├── hardhat/
│ ├── async-test-sanity.js
│ ├── env-artifacts.js
│ ├── ignore-unreachable-warnings.js
│ ├── remappings.js
│ ├── skip-foundry-tests.js
│ └── task-test-get-files.js
├── hardhat.config.js
├── netlify.toml
├── package.json
├── remappings.txt
├── renovate.json
├── scripts/
│ ├── checks/
│ │ ├── compare-layout.js
│ │ ├── compareGasReports.js
│ │ ├── coverage.sh
│ │ ├── extract-layout.js
│ │ ├── generation.sh
│ │ ├── inheritance-ordering.js
│ │ └── pragma-validity.js
│ ├── fetch-common-contracts.js
│ ├── gen-nav.js
│ ├── generate/
│ │ ├── format-lines.js
│ │ ├── helpers/
│ │ │ └── sanitize.js
│ │ ├── run.js
│ │ └── templates/
│ │ ├── Arrays.js
│ │ ├── Arrays.opts.js
│ │ ├── Checkpoints.js
│ │ ├── Checkpoints.opts.js
│ │ ├── Checkpoints.t.js
│ │ ├── Enumerable.opts.js
│ │ ├── EnumerableMap.js
│ │ ├── EnumerableSet.js
│ │ ├── MerkleProof.js
│ │ ├── MerkleProof.opts.js
│ │ ├── Packing.js
│ │ ├── Packing.opts.js
│ │ ├── Packing.t.js
│ │ ├── SafeCast.js
│ │ ├── Slot.opts.js
│ │ ├── SlotDerivation.js
│ │ ├── SlotDerivation.t.js
│ │ ├── StorageSlot.js
│ │ ├── StorageSlotMock.js
│ │ ├── TransientSlot.js
│ │ ├── TransientSlotMock.js
│ │ └── conversion.js
│ ├── get-contracts-metadata.js
│ ├── git-user-config.sh
│ ├── helpers.js
│ ├── minimize-pragma.js
│ ├── prepack.sh
│ ├── prepare-docs.sh
│ ├── release/
│ │ ├── format-changelog.js
│ │ ├── synchronize-versions.js
│ │ ├── update-comment.js
│ │ ├── version.sh
│ │ └── workflow/
│ │ ├── check-upgradeable.sh
│ │ ├── exit-prerelease.sh
│ │ ├── github-release.js
│ │ ├── integrity-check.sh
│ │ ├── pack.sh
│ │ ├── publish.sh
│ │ ├── rerun.js
│ │ ├── set-changesets-pr-title.js
│ │ ├── start.sh
│ │ └── state.js
│ ├── remove-ignored-artifacts.js
│ ├── set-max-old-space-size.sh
│ ├── solc-versions.js
│ ├── solhint-custom/
│ │ ├── index.js
│ │ └── package.json
│ ├── update-docs-branch.js
│ └── upgradeable/
│ ├── README.md
│ ├── alias/
│ │ ├── Initializable.sol
│ │ └── UUPSUpgradeable.sol
│ ├── patch-apply.sh
│ ├── patch-save.sh
│ ├── transpile-onto.sh
│ ├── transpile.sh
│ └── upgradeable.patch
├── slither.config.json
├── solhint.config.js
└── test/
├── TESTING.md
├── access/
│ ├── AccessControl.behavior.js
│ ├── AccessControl.test.js
│ ├── Ownable.test.js
│ ├── Ownable2Step.test.js
│ ├── extensions/
│ │ ├── AccessControlDefaultAdminRules.test.js
│ │ └── AccessControlEnumerable.test.js
│ └── manager/
│ ├── AccessManaged.test.js
│ ├── AccessManager.behavior.js
│ ├── AccessManager.predicate.js
│ ├── AccessManager.test.js
│ └── AuthorityUtils.test.js
├── account/
│ ├── Account.behavior.js
│ ├── Account.test.js
│ ├── AccountECDSA.test.js
│ ├── AccountEIP7702.t.sol
│ ├── AccountEIP7702.test.js
│ ├── AccountERC7913.test.js
│ ├── AccountMultiSigner.test.js
│ ├── AccountMultiSignerWeighted.test.js
│ ├── AccountP256.test.js
│ ├── AccountRSA.test.js
│ ├── AccountWebAuthn.test.js
│ ├── examples/
│ │ └── AccountEIP7702WithModulesMock.test.js
│ ├── extensions/
│ │ ├── AccountERC7579.behavior.js
│ │ ├── AccountERC7579.test.js
│ │ ├── AccountERC7579Hooked.test.js
│ │ └── ERC7821.behavior.js
│ └── utils/
│ ├── EIP7702Utils.test.js
│ ├── draft-ERC4337Utils.test.js
│ ├── draft-ERC7579Utils.t.sol
│ └── draft-ERC7579Utils.test.js
├── crosschain/
│ ├── BridgeERC1155.behavior.js
│ ├── BridgeERC1155.test.js
│ ├── BridgeERC20.behavior.js
│ ├── BridgeERC20.test.js
│ ├── BridgeERC721.behavior.js
│ ├── BridgeERC721.test.js
│ ├── CrosschainExecutor.test.js
│ └── ERC7786Recipient.test.js
├── finance/
│ ├── VestingWallet.behavior.js
│ ├── VestingWallet.test.js
│ └── VestingWalletCliff.test.js
├── governance/
│ ├── Governor.t.sol
│ ├── Governor.test.js
│ ├── TimelockController.test.js
│ ├── extensions/
│ │ ├── GovernorCountingFractional.test.js
│ │ ├── GovernorCountingOverridable.test.js
│ │ ├── GovernorCrosschain.test.js
│ │ ├── GovernorERC721.test.js
│ │ ├── GovernorNoncesKeyed.test.js
│ │ ├── GovernorPreventLateQuorum.test.js
│ │ ├── GovernorProposalGuardian.test.js
│ │ ├── GovernorSequentialProposalId.test.js
│ │ ├── GovernorStorage.test.js
│ │ ├── GovernorSuperQuorum.test.js
│ │ ├── GovernorSuperQuorumGreaterThanQuorum.t.sol
│ │ ├── GovernorTimelockAccess.test.js
│ │ ├── GovernorTimelockCompound.test.js
│ │ ├── GovernorTimelockControl.test.js
│ │ ├── GovernorVotesQuorumFraction.test.js
│ │ ├── GovernorVotesSuperQuorumFraction.test.js
│ │ └── GovernorWithParams.test.js
│ └── utils/
│ ├── ERC6372.behavior.js
│ ├── Votes.behavior.js
│ ├── Votes.test.js
│ └── VotesExtended.test.js
├── helpers/
│ ├── access-manager.js
│ ├── account.js
│ ├── chains.js
│ ├── constants.js
│ ├── deploy.js
│ ├── eip712-types.js
│ ├── eip712.js
│ ├── enums.js
│ ├── erc4337.js
│ ├── erc7579.js
│ ├── erc7739.js
│ ├── governance.js
│ ├── iterate.js
│ ├── math.js
│ ├── methods.js
│ ├── precompiles.js
│ ├── random.js
│ ├── signers.js
│ ├── storage.js
│ ├── strings.js
│ ├── time.js
│ ├── trie.js
│ └── txpool.js
├── metatx/
│ ├── ERC2771Context.test.js
│ ├── ERC2771Forwarder.t.sol
│ └── ERC2771Forwarder.test.js
├── proxy/
│ ├── Clones.behaviour.js
│ ├── Clones.t.sol
│ ├── Clones.test.js
│ ├── ERC1967/
│ │ ├── ERC1967Proxy.test.js
│ │ └── ERC1967Utils.test.js
│ ├── Proxy.behaviour.js
│ ├── beacon/
│ │ ├── BeaconProxy.test.js
│ │ └── UpgradeableBeacon.test.js
│ ├── transparent/
│ │ ├── ProxyAdmin.test.js
│ │ ├── TransparentUpgradeableProxy.behaviour.js
│ │ └── TransparentUpgradeableProxy.test.js
│ └── utils/
│ ├── Initializable.test.js
│ └── UUPSUpgradeable.test.js
├── sanity.test.js
├── token/
│ ├── ERC1155/
│ │ ├── ERC1155.behavior.js
│ │ ├── ERC1155.test.js
│ │ ├── extensions/
│ │ │ ├── ERC1155Burnable.test.js
│ │ │ ├── ERC1155Crosschain.test.js
│ │ │ ├── ERC1155Pausable.test.js
│ │ │ ├── ERC1155Supply.test.js
│ │ │ └── ERC1155URIStorage.test.js
│ │ └── utils/
│ │ ├── ERC1155Holder.test.js
│ │ └── ERC1155Utils.test.js
│ ├── ERC20/
│ │ ├── ERC20.behavior.js
│ │ ├── ERC20.test.js
│ │ ├── extensions/
│ │ │ ├── ERC1363.test.js
│ │ │ ├── ERC20Burnable.test.js
│ │ │ ├── ERC20Capped.test.js
│ │ │ ├── ERC20Crosschain.test.js
│ │ │ ├── ERC20FlashMint.test.js
│ │ │ ├── ERC20Pausable.test.js
│ │ │ ├── ERC20Permit.test.js
│ │ │ ├── ERC20Votes.test.js
│ │ │ ├── ERC20Wrapper.test.js
│ │ │ ├── ERC4626.t.sol
│ │ │ ├── ERC4626.test.js
│ │ │ ├── draft-ERC20Bridgeable.test.js
│ │ │ └── draft-ERC20TemporaryApproval.test.js
│ │ └── utils/
│ │ └── SafeERC20.test.js
│ ├── ERC6909/
│ │ ├── ERC6909.behavior.js
│ │ ├── ERC6909.test.js
│ │ └── extensions/
│ │ ├── ERC6909ContentURI.test.js
│ │ ├── ERC6909Metadata.test.js
│ │ └── ERC6909TokenSupply.test.js
│ ├── ERC721/
│ │ ├── ERC721.behavior.js
│ │ ├── ERC721.test.js
│ │ ├── ERC721Enumerable.test.js
│ │ ├── extensions/
│ │ │ ├── ERC721Burnable.test.js
│ │ │ ├── ERC721Consecutive.t.sol
│ │ │ ├── ERC721Consecutive.test.js
│ │ │ ├── ERC721Crosschain.test.js
│ │ │ ├── ERC721Pausable.test.js
│ │ │ ├── ERC721Royalty.test.js
│ │ │ ├── ERC721URIStorage.test.js
│ │ │ ├── ERC721Votes.test.js
│ │ │ └── ERC721Wrapper.test.js
│ │ └── utils/
│ │ ├── ERC721Holder.test.js
│ │ └── ERC721Utils.test.js
│ └── common/
│ └── ERC2981.behavior.js
└── utils/
├── Address.test.js
├── Arrays.t.sol
├── Arrays.test.js
├── Base58.t.sol
├── Base58.test.js
├── Base64.t.sol
├── Base64.test.js
├── Blockhash.t.sol
├── Blockhash.test.js
├── Bytes.t.sol
├── Bytes.test.js
├── CAIP.test.js
├── Calldata.test.js
├── Context.behavior.js
├── Context.test.js
├── Create2.t.sol
├── Create2.test.js
├── LowLevelCall.test.js
├── Memory.t.sol
├── Memory.test.js
├── Multicall.test.js
├── Nonces.behavior.js
├── Nonces.test.js
├── NoncesKeyed.t.sol
├── NoncesKeyed.test.js
├── Packing.t.sol
├── Packing.test.js
├── Panic.test.js
├── Pausable.test.js
├── RLP.t.sol
├── RLP.test.js
├── ReentrancyGuard.test.js
├── RelayedCall.test.js
├── ShortStrings.t.sol
├── ShortStrings.test.js
├── SimulatedCall.test.js
├── SlotDerivation.t.sol
├── SlotDerivation.test.js
├── StorageSlot.test.js
├── Strings.t.sol
├── Strings.test.js
├── TransientSlot.test.js
├── cryptography/
│ ├── ECDSA.test.js
│ ├── EIP712.test.js
│ ├── ERC1271.behavior.js
│ ├── ERC7739.test.js
│ ├── ERC7739Utils.test.js
│ ├── MerkleProof.test.js
│ ├── MessageHashUtils.t.sol
│ ├── MessageHashUtils.test.js
│ ├── P256.t.sol
│ ├── P256.test.js
│ ├── RSA.helper.js
│ ├── RSA.test.js
│ ├── SigVer15_186-3.rsp
│ ├── SignatureChecker.test.js
│ ├── TrieProof.test.js
│ ├── WebAuthn.t.sol
│ └── ecdsa_secp256r1_sha256_p1363_test.json
├── draft-InteroperableAddress.t.sol
├── draft-InteroperableAddress.test.js
├── introspection/
│ ├── ERC165.test.js
│ ├── ERC165Checker.test.js
│ └── SupportsInterface.behavior.js
├── math/
│ ├── Math.t.sol
│ ├── Math.test.js
│ ├── SafeCast.test.js
│ ├── SignedMath.t.sol
│ └── SignedMath.test.js
├── structs/
│ ├── Accumulators.t.sol
│ ├── BitMap.test.js
│ ├── Checkpoints.t.sol
│ ├── Checkpoints.test.js
│ ├── CircularBuffer.test.js
│ ├── DoubleEndedQueue.test.js
│ ├── EnumerableMap.behavior.js
│ ├── EnumerableMap.test.js
│ ├── EnumerableSet.behavior.js
│ ├── EnumerableSet.test.js
│ ├── Heap.t.sol
│ ├── Heap.test.js
│ └── MerkleTree.test.js
└── types/
└── Time.test.js
SYMBOL INDEX (502 symbols across 197 files)
FILE: docs/templates/helpers.js
function getAllLinks (line 24) | function getAllLinks(items) {
FILE: hardhat/env-artifacts.js
function isExpectedError (line 3) | function isExpectedError(e, suffix) {
FILE: hardhat/ignore-unreachable-warnings.js
constant W_UNREACHABLE_CODE (line 33) | const W_UNREACHABLE_CODE = '5740';
FILE: scripts/checks/compareGasReports.js
constant BASE_TX_COST (line 26) | const BASE_TX_COST = 21000;
function sum (line 29) | function sum(...args) {
function average (line 33) | function average(...args) {
function variation (line 37) | function variation(current, previous, offset = 0) {
class Report (line 46) | class Report {
method load (line 48) | static load(filepath) {
method compare (line 53) | static compare(update, ref, opts = { hideEqual: true, strictTesting: f...
function center (line 106) | function center(text, length) {
function plusSign (line 110) | function plusSign(num) {
function formatCellShell (line 114) | function formatCellShell(cell) {
function formatCmpShell (line 123) | function formatCmpShell(rows) {
function alignPattern (line 165) | function alignPattern(align) {
function trend (line 177) | function trend(value) {
function formatCellMarkdown (line 181) | function formatCellMarkdown(cell) {
function formatCmpMarkdown (line 189) | function formatCmpMarkdown(rows) {
FILE: scripts/checks/extract-layout.js
function extractLayouts (line 11) | function extractLayouts(path) {
FILE: scripts/gen-nav.js
function getPageTitle (line 13) | function getPageTitle(directory) {
FILE: scripts/generate/format-lines.js
function formatLines (line 1) | function formatLines(...lines) {
FILE: scripts/generate/run.js
function getVersion (line 8) | function getVersion(path) {
function generateFromTemplate (line 16) | function generateFromTemplate(file, template, outputPrefix = '', lint = ...
FILE: scripts/generate/templates/Arrays.opts.js
constant TYPES (line 1) | const TYPES = [
FILE: scripts/generate/templates/Checkpoints.opts.js
constant VALUE_SIZES (line 2) | const VALUE_SIZES = [256, 224, 208, 160];
FILE: scripts/generate/templates/Enumerable.opts.js
constant SET_TYPES (line 25) | const SET_TYPES = [
constant MAP_TYPES (line 36) | const MAP_TYPES = []
FILE: scripts/generate/templates/MerkleProof.js
constant DEFAULT_HASH (line 4) | const DEFAULT_HASH = 'Hashes.commutativeKeccak256';
FILE: scripts/generate/templates/MerkleProof.opts.js
constant OPTS (line 3) | const OPTS = product(
FILE: scripts/generate/templates/SafeCast.js
constant LENGTHS (line 4) | const LENGTHS = range(8, 256, 8).reverse();
FILE: scripts/generate/templates/Slot.opts.js
constant TYPES (line 3) | const TYPES = [
FILE: scripts/generate/templates/conversion.js
function toBytes32 (line 1) | function toBytes32(type, value) {
function fromBytes32 (line 16) | function fromBytes32(type, value) {
FILE: scripts/release/format-changelog.js
constant RELEASE_LINE_REGEX (line 12) | const RELEASE_LINE_REGEX = /^- (\[#.*?\]\(.*?\))?.*?! - (.*)$/gm;
constant VERSION_TITLE_REGEX (line 15) | const VERSION_TITLE_REGEX = /^## (\d+\.\d+\.\d+(-rc\.\d+)?)$/gm;
FILE: scripts/release/synchronize-versions.js
function setVersion (line 10) | function setVersion(from, to) {
FILE: scripts/release/workflow/github-release.js
function makeWordRegExp (line 19) | function makeWordRegExp(word) {
function extractSection (line 26) | function extractSection(document, wantedHeading) {
FILE: scripts/release/workflow/state.js
function setOutput (line 10) | function setOutput(key, value) {
function shouldRunStart (line 26) | function shouldRunStart({ isMaster, isWorkflowDispatch, botRun }) {
function shouldRunPromote (line 30) | function shouldRunPromote({ isReleaseBranch, isWorkflowDispatch, botRun ...
function shouldRunChangesets (line 34) | function shouldRunChangesets({ isReleaseBranch, isPush, isWorkflowDispat...
function shouldRunPublish (line 38) | function shouldRunPublish({ isReleaseBranch, isPush, hasPendingChangeset...
function shouldRunMerge (line 42) | function shouldRunMerge({
function getState (line 53) | async function getState({ github, context, core }) {
function readChangesetState (line 93) | async function readChangesetState(cwd = process.cwd()) {
function isPublishedOnNpm (line 109) | async function isPublishedOnNpm(packageName, version) {
FILE: scripts/remove-ignored-artifacts.js
function readJSON (line 9) | function readJSON(path) {
FILE: scripts/solhint-custom/index.js
class Base (line 10) | class Base {
method constructor (line 11) | constructor(reporter, config, source, fileName) {
method require (line 20) | require(condition, node, message) {
method VariableDeclaration (line 31) | VariableDeclaration(node) {
method VariableDeclaration (line 45) | VariableDeclaration(node) {
method FunctionDefinition (line 71) | FunctionDefinition(node) {
method FunctionDefinition (line 98) | FunctionDefinition(node) {
method FunctionDefinition (line 108) | FunctionDefinition(node) {
FILE: test/access/AccessControl.behavior.js
constant DEFAULT_ADMIN_ROLE (line 8) | const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
constant ROLE (line 9) | const ROLE = ethers.id('ROLE');
constant OTHER_ROLE (line 10) | const OTHER_ROLE = ethers.id('OTHER_ROLE');
function shouldBehaveLikeAccessControl (line 12) | function shouldBehaveLikeAccessControl() {
function shouldBehaveLikeAccessControlEnumerable (line 227) | function shouldBehaveLikeAccessControlEnumerable() {
function shouldBehaveLikeAccessControlDefaultAdminRules (line 264) | function shouldBehaveLikeAccessControlDefaultAdminRules() {
FILE: test/access/AccessControl.test.js
function fixture (line 6) | async function fixture() {
FILE: test/access/Ownable.test.js
function fixture (line 5) | async function fixture() {
FILE: test/access/Ownable2Step.test.js
function fixture (line 5) | async function fixture() {
FILE: test/access/extensions/AccessControlDefaultAdminRules.test.js
function fixture (line 12) | async function fixture() {
FILE: test/access/extensions/AccessControlEnumerable.test.js
function fixture (line 10) | async function fixture() {
FILE: test/access/manager/AccessManaged.test.js
function fixture (line 8) | async function fixture() {
FILE: test/access/manager/AccessManager.behavior.js
function shouldBehaveLikeDelayedAdminOperation (line 19) | function shouldBehaveLikeDelayedAdminOperation() {
function shouldBehaveLikeNotDelayedAdminOperation (line 58) | function shouldBehaveLikeNotDelayedAdminOperation() {
function shouldBehaveLikeRoleAdminOperation (line 97) | function shouldBehaveLikeRoleAdminOperation(roleAdmin) {
function shouldBehaveLikeAManagedRestrictedOperation (line 137) | function shouldBehaveLikeAManagedRestrictedOperation() {
function shouldBehaveLikeASelfRestrictedOperation (line 194) | function shouldBehaveLikeASelfRestrictedOperation() {
FILE: test/access/manager/AccessManager.predicate.js
constant LIKE_COMMON_IS_EXECUTING (line 11) | const LIKE_COMMON_IS_EXECUTING = {
method executing (line 12) | executing() {
method notExecuting (line 17) | notExecuting() {
constant LIKE_COMMON_GET_ACCESS (line 26) | const LIKE_COMMON_GET_ACCESS = {
method beforeGrantDelay (line 30) | beforeGrantDelay() {
method beforeGrantDelay (line 40) | beforeGrantDelay() {
method afterGrantDelay (line 47) | afterGrantDelay() {
method callerHasNoExecutionDelay (line 60) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 71) | requiredRoleIsNotGranted() {
constant LIKE_COMMON_SCHEDULABLE (line 80) | const LIKE_COMMON_SCHEDULABLE = {
method before (line 82) | before() {
method after (line 89) | after() {
method expired (line 98) | expired() {
method notScheduled (line 106) | notScheduled() {
function testAsClosable (line 120) | function testAsClosable({ closed, open }) {
function testAsDelay (line 143) | function testAsDelay(type, { before, after }) {
function testAsSchedulableOperation (line 171) | function testAsSchedulableOperation({ scheduled: { before, after, expire...
function testAsRestrictedOperation (line 234) | function testAsRestrictedOperation({ callerIsTheManager: { executing, no...
function testAsDelayedOperation (line 273) | function testAsDelayedOperation() {
function testAsCanCall (line 312) | function testAsCanCall({
function testAsHasRole (line 338) | function testAsHasRole({ publicRoleIsRequired, specificRoleIsRequired }) {
function testAsGetAccess (line 364) | function testAsGetAccess({
FILE: test/access/manager/AccessManager.test.js
function fixture (line 39) | async function fixture() {
method closed (line 140) | closed() {
method executing (line 153) | executing() {
method notExecuting (line 164) | notExecuting() {
method publicRoleIsRequired (line 177) | publicRoleIsRequired() {
method notScheduled (line 254) | notScheduled() {
method callerHasAnExecutionDelay (line 298) | callerHasAnExecutionDelay() {
method callerHasNoExecutionDelay (line 309) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 322) | requiredRoleIsNotGranted() {
method closed (line 353) | closed() {
method open (line 358) | open() {
method callerHasAnExecutionDelay (line 553) | callerHasAnExecutionDelay() {
method callerHasNoExecutionDelay (line 565) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 579) | requiredRoleIsNotGranted() {
method publicRoleIsRequired (line 599) | publicRoleIsRequired() {
method callerHasAnExecutionDelay (line 651) | callerHasAnExecutionDelay() {
method callerHasNoExecutionDelay (line 658) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 667) | requiredRoleIsNotGranted() {
method notScheduled (line 718) | notScheduled() {
method closed (line 1811) | closed() {
method executing (line 1826) | executing() {
method notExecuting (line 1829) | notExecuting() {
method publicRoleIsRequired (line 1844) | publicRoleIsRequired() {
method beforeGrantDelay (line 1856) | beforeGrantDelay() {
method afterGrantDelay (line 1864) | afterGrantDelay() {
method beforeGrantDelay (line 1872) | beforeGrantDelay() {
method afterGrantDelay (line 1880) | afterGrantDelay() {
method callerHasAnExecutionDelay (line 1891) | callerHasAnExecutionDelay() {
method callerHasNoExecutionDelay (line 1903) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 1913) | requiredRoleIsNotGranted() {
method closed (line 2093) | closed() {
method executing (line 2102) | executing() {
method notExecuting (line 2107) | notExecuting() {
method publicRoleIsRequired (line 2116) | publicRoleIsRequired() {
method beforeGrantDelay (line 2125) | beforeGrantDelay() {
method beforeGrantDelay (line 2143) | beforeGrantDelay() {
method callerHasAnExecutionDelay (line 2160) | callerHasAnExecutionDelay() {
method callerHasNoExecutionDelay (line 2167) | callerHasNoExecutionDelay() {
method requiredRoleIsNotGranted (line 2174) | requiredRoleIsNotGranted() {
method before (line 2325) | before() {
method after (line 2332) | after() {
method expired (line 2342) | expired() {
method notScheduled (line 2350) | notScheduled() {
method before (line 2374) | before() {
method after (line 2403) | after() {
method expired (line 2408) | expired() {
method notScheduled (line 2414) | notScheduled() {
FILE: test/access/manager/AuthorityUtils.test.js
function fixture (line 7) | async function fixture() {
FILE: test/account/Account.behavior.js
function shouldBehaveLikeAccountCore (line 7) | function shouldBehaveLikeAccountCore() {
function shouldBehaveLikeAccountHolder (line 80) | function shouldBehaveLikeAccountHolder() {
FILE: test/account/Account.test.js
function fixture (line 13) | async function fixture() {
FILE: test/account/AccountECDSA.test.js
function fixture (line 12) | async function fixture() {
FILE: test/account/AccountEIP7702.test.js
function fixture (line 12) | async function fixture() {
FILE: test/account/AccountERC7913.test.js
function fixture (line 20) | async function fixture() {
FILE: test/account/AccountMultiSigner.test.js
function fixture (line 24) | async function fixture() {
FILE: test/account/AccountMultiSignerWeighted.test.js
function fixture (line 24) | async function fixture() {
FILE: test/account/AccountP256.test.js
function fixture (line 13) | async function fixture() {
FILE: test/account/AccountRSA.test.js
function fixture (line 13) | async function fixture() {
FILE: test/account/AccountWebAuthn.test.js
function fixture (line 16) | async function fixture() {
FILE: test/account/examples/AccountEIP7702WithModulesMock.test.js
function fixture (line 15) | async function fixture() {
FILE: test/account/extensions/AccountERC7579.behavior.js
constant CALL_TYPE_INVALID (line 23) | const CALL_TYPE_INVALID = '0x42';
constant EXEC_TYPE_INVALID (line 24) | const EXEC_TYPE_INVALID = '0x17';
constant MODULE_TYPE_INVALID (line 25) | const MODULE_TYPE_INVALID = 999n;
function shouldBehaveLikeAccountERC7579 (line 29) | function shouldBehaveLikeAccountERC7579({ withHooks = false } = {}) {
FILE: test/account/extensions/AccountERC7579.test.js
function fixture (line 12) | async function fixture() {
FILE: test/account/extensions/AccountERC7579Hooked.test.js
function fixture (line 12) | async function fixture() {
FILE: test/account/extensions/ERC7821.behavior.js
function shouldBehaveLikeERC7821 (line 6) | function shouldBehaveLikeERC7821({ deployable = true } = {}) {
FILE: test/account/utils/draft-ERC4337Utils.test.js
constant ADDRESS_ONE (line 9) | const ADDRESS_ONE = '0x0000000000000000000000000000000000000001';
FILE: test/crosschain/BridgeERC1155.behavior.js
function shouldBehaveLikeBridgeERC1155 (line 8) | function shouldBehaveLikeBridgeERC1155({ chainAIsCustodial = false, chai...
FILE: test/crosschain/BridgeERC1155.test.js
function fixture (line 10) | async function fixture() {
FILE: test/crosschain/BridgeERC20.behavior.js
function shouldBehaveLikeBridgeERC20 (line 7) | function shouldBehaveLikeBridgeERC20({ chainAIsCustodial = false, chainB...
FILE: test/crosschain/BridgeERC20.test.js
function fixture (line 10) | async function fixture() {
FILE: test/crosschain/BridgeERC721.behavior.js
function shouldBehaveLikeBridgeERC721 (line 7) | function shouldBehaveLikeBridgeERC721({ chainAIsCustodial = false, chain...
FILE: test/crosschain/BridgeERC721.test.js
function fixture (line 10) | async function fixture() {
FILE: test/crosschain/CrosschainExecutor.test.js
function fixture (line 16) | async function fixture() {
FILE: test/crosschain/ERC7786Recipient.test.js
function fixture (line 12) | async function fixture() {
FILE: test/finance/VestingWallet.behavior.js
function envSetup (line 5) | async function envSetup(mock, beneficiary, token) {
function shouldBehaveLikeVesting (line 39) | function shouldBehaveLikeVesting() {
FILE: test/finance/VestingWallet.test.js
function fixture (line 10) | async function fixture() {
FILE: test/finance/VestingWalletCliff.test.js
function fixture (line 10) | async function fixture() {
FILE: test/governance/Governor.test.js
constant TOKENS (line 13) | const TOKENS = [
function deployToken (line 31) | async function deployToken(contractName) {
function tamper (line 347) | function tamper(str, index, mask) {
function shouldPropose (line 732) | function shouldPropose() {
FILE: test/governance/TimelockController.test.js
constant MINDELAY (line 14) | const MINDELAY = time.duration.days(1);
constant DEFAULT_ADMIN_ROLE (line 15) | const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
constant PROPOSER_ROLE (line 16) | const PROPOSER_ROLE = ethers.id('PROPOSER_ROLE');
constant EXECUTOR_ROLE (line 17) | const EXECUTOR_ROLE = ethers.id('EXECUTOR_ROLE');
constant CANCELLER_ROLE (line 18) | const CANCELLER_ROLE = ethers.id('CANCELLER_ROLE');
function genOperation (line 22) | function genOperation(target, value, data, predecessor, salt) {
function genOperationBatch (line 32) | function genOperationBatch(targets, values, payloads, predecessor, salt) {
function fixture (line 42) | async function fixture() {
FILE: test/governance/extensions/GovernorCountingFractional.test.js
constant TOKENS (line 10) | const TOKENS = [
FILE: test/governance/extensions/GovernorCountingOverridable.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/extensions/GovernorCrosschain.test.js
function fixture (line 19) | async function fixture() {
FILE: test/governance/extensions/GovernorERC721.test.js
constant TOKENS (line 8) | const TOKENS = [
constant NFT0 (line 17) | const NFT0 = 0n;
constant NFT1 (line 18) | const NFT1 = 1n;
constant NFT2 (line 19) | const NFT2 = 2n;
constant NFT3 (line 20) | const NFT3 = 3n;
constant NFT4 (line 21) | const NFT4 = 4n;
FILE: test/governance/extensions/GovernorNoncesKeyed.test.js
function tamper (line 204) | function tamper(str, index, mask) {
FILE: test/governance/extensions/GovernorPreventLateQuorum.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/extensions/GovernorProposalGuardian.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/extensions/GovernorSequentialProposalId.test.js
constant TOKENS (line 10) | const TOKENS = [
function deployToken (line 24) | async function deployToken(contractName) {
FILE: test/governance/extensions/GovernorStorage.test.js
constant TOKENS (line 10) | const TOKENS = [
constant DEFAULT_ADMIN_ROLE (line 15) | const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
constant PROPOSER_ROLE (line 16) | const PROPOSER_ROLE = ethers.id('PROPOSER_ROLE');
constant EXECUTOR_ROLE (line 17) | const EXECUTOR_ROLE = ethers.id('EXECUTOR_ROLE');
constant CANCELLER_ROLE (line 18) | const CANCELLER_ROLE = ethers.id('CANCELLER_ROLE');
FILE: test/governance/extensions/GovernorSuperQuorum.test.js
constant TOKENS (line 9) | const TOKENS = [
constant DEFAULT_ADMIN_ROLE (line 14) | const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
constant PROPOSER_ROLE (line 15) | const PROPOSER_ROLE = ethers.id('PROPOSER_ROLE');
constant EXECUTOR_ROLE (line 16) | const EXECUTOR_ROLE = ethers.id('EXECUTOR_ROLE');
constant CANCELLER_ROLE (line 17) | const CANCELLER_ROLE = ethers.id('CANCELLER_ROLE');
FILE: test/governance/extensions/GovernorTimelockAccess.test.js
function prepareOperation (line 13) | function prepareOperation({ sender, target, value = 0n, data = '0x' }) {
constant TOKENS (line 21) | const TOKENS = [
FILE: test/governance/extensions/GovernorTimelockCompound.test.js
constant TOKENS (line 10) | const TOKENS = [
FILE: test/governance/extensions/GovernorTimelockControl.test.js
constant TOKENS (line 11) | const TOKENS = [
constant DEFAULT_ADMIN_ROLE (line 16) | const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
constant PROPOSER_ROLE (line 17) | const PROPOSER_ROLE = ethers.id('PROPOSER_ROLE');
constant EXECUTOR_ROLE (line 18) | const EXECUTOR_ROLE = ethers.id('EXECUTOR_ROLE');
constant CANCELLER_ROLE (line 19) | const CANCELLER_ROLE = ethers.id('CANCELLER_ROLE');
FILE: test/governance/extensions/GovernorVotesQuorumFraction.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/extensions/GovernorVotesSuperQuorumFraction.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/extensions/GovernorWithParams.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/governance/utils/ERC6372.behavior.js
function shouldBehaveLikeERC6372 (line 4) | function shouldBehaveLikeERC6372(mode = 'blocknumber') {
FILE: test/governance/utils/Votes.behavior.js
function shouldBehaveLikeVotes (line 10) | function shouldBehaveLikeVotes(tokens, { mode = 'blocknumber', fungible ...
FILE: test/governance/utils/Votes.test.js
constant MODES (line 11) | const MODES = {
constant AMOUNTS (line 16) | const AMOUNTS = [ethers.parseEther('10000000'), 10n, 20n];
FILE: test/governance/utils/VotesExtended.test.js
constant MODES (line 11) | const MODES = {
constant AMOUNTS (line 16) | const AMOUNTS = [ethers.parseEther('10000000'), 10n, 20n];
FILE: test/helpers/access-manager.js
function buildBaseRoles (line 7) | function buildBaseRoles() {
constant MINSETBACK (line 46) | const MINSETBACK = time.duration.days(5);
constant EXPIRATION (line 47) | const EXPIRATION = time.duration.weeks(1);
constant EXECUTION_ID_STORAGE_SLOT (line 49) | const EXECUTION_ID_STORAGE_SLOT = upgradeableSlot('AccessManager', 3n);
constant CONSUMING_SCHEDULE_STORAGE_SLOT (line 50) | const CONSUMING_SCHEDULE_STORAGE_SLOT = upgradeableSlot('AccessManaged',...
function prepareOperation (line 55) | async function prepareOperation(manager, { caller, target, calldata, del...
FILE: test/helpers/account.js
constant DEFAULT_BALANCE (line 5) | const DEFAULT_BALANCE = 10000n * ethers.WeiPerEther;
FILE: test/helpers/eip712.js
function getDomain (line 4) | async function getDomain(contract) {
function domainType (line 28) | function domainType(domain) {
function hashTypedData (line 32) | function hashTypedData(domain, structHash) {
FILE: test/helpers/erc4337.js
constant SIG_VALIDATION_SUCCESS (line 4) | const SIG_VALIDATION_SUCCESS = '0x00000000000000000000000000000000000000...
constant SIG_VALIDATION_FAILURE (line 5) | const SIG_VALIDATION_FAILURE = '0x00000000000000000000000000000000000000...
constant PAYMASTER_SIG_MAGIC (line 6) | const PAYMASTER_SIG_MAGIC = '0x22e325a297439656';
constant BLOCK_RANGE_FLAG (line 8) | const BLOCK_RANGE_FLAG = 0x800000000000n;
constant BLOCK_RANGE_MASK (line 9) | const BLOCK_RANGE_MASK = 0x7fffffffffffn;
function getAddress (line 11) | function getAddress(account) {
function pack (line 15) | function pack(left, right) {
function packValidationData (line 19) | function packValidationData(validAfter, validUntil, authorizer, range = ...
function packInitCode (line 40) | function packInitCode(factory, factoryData) {
function packPaymasterAndData (line 44) | function packPaymasterAndData(
class UserOperation (line 66) | class UserOperation {
method constructor (line 67) | constructor(params) {
method packed (line 86) | get packed() {
method hash (line 108) | hash(entrypoint) {
class ERC4337Helper (line 119) | class ERC4337Helper {
method constructor (line 120) | constructor() {
method wait (line 124) | async wait() {
method newAccount (line 129) | async newAccount(name, extraArgs = [], params = {}) {
class SmartAccount (line 167) | class SmartAccount extends ethers.BaseContract {
method constructor (line 168) | constructor(instance, initCode, env) {
method deploy (line 175) | async deploy(account = this.runner) {
method createUserOp (line 181) | async createUserOp(userOp = {}) {
class EIP7702SmartAccount (line 193) | class EIP7702SmartAccount extends SmartAccount {
method constructor (line 194) | constructor(instance, authorization, env) {
method deploy (line 199) | async deploy() {
class UserOperationWithContext (line 212) | class UserOperationWithContext extends UserOperation {
method constructor (line 213) | constructor(userOp, env) {
method addInitCode (line 219) | addInitCode() {
method getAuthorization (line 225) | getAuthorization() {
method hash (line 231) | hash() {
FILE: test/helpers/erc7579.js
constant MODULE_TYPE_VALIDATOR (line 3) | const MODULE_TYPE_VALIDATOR = 1;
constant MODULE_TYPE_EXECUTOR (line 4) | const MODULE_TYPE_EXECUTOR = 2;
constant MODULE_TYPE_FALLBACK (line 5) | const MODULE_TYPE_FALLBACK = 3;
constant MODULE_TYPE_HOOK (line 6) | const MODULE_TYPE_HOOK = 4;
constant EXEC_TYPE_DEFAULT (line 8) | const EXEC_TYPE_DEFAULT = '0x00';
constant EXEC_TYPE_TRY (line 9) | const EXEC_TYPE_TRY = '0x01';
constant CALL_TYPE_CALL (line 11) | const CALL_TYPE_CALL = '0x00';
constant CALL_TYPE_BATCH (line 12) | const CALL_TYPE_BATCH = '0x01';
constant CALL_TYPE_DELEGATE (line 13) | const CALL_TYPE_DELEGATE = '0xff';
FILE: test/helpers/erc7739.js
class ERC7739Signer (line 15) | class ERC7739Signer extends ethers.AbstractSigner {
method constructor (line 19) | constructor(signer, domain) {
method from (line 25) | static from(signer, domain) {
method signingKey (line 29) | get signingKey() {
method privateKey (line 33) | get privateKey() {
method getAddress (line 37) | async getAddress() {
method connect (line 41) | connect(provider) {
method signTransaction (line 45) | async signTransaction(tx) {
method signMessage (line 49) | async signMessage(message) {
method signTypedData (line 53) | async signTypedData(domain, types, value) {
class ERC4337Utils (line 70) | class ERC4337Utils {
method preparePersonalSign (line 71) | static preparePersonalSign(message) {
method prepareSignTypedData (line 81) | static prepareSignTypedData(contents, signerDomain) {
method getContentsDetail (line 92) | static getContentsDetail(contentsTypes, contentsTypeName = Object.keys...
FILE: test/helpers/governance.js
class GovernorHelper (line 10) | class GovernorHelper {
method constructor (line 11) | constructor(governor, mode = 'blocknumber') {
method connect (line 16) | connect(account) {
method setProposal (line 27) | setProposal(actions, description) {
method hash (line 39) | get hash() {
method id (line 45) | get id() {
method signatures (line 50) | get signatures() {
method descriptionHash (line 54) | get descriptionHash() {
method shortProposal (line 59) | get shortProposal() {
method fullProposal (line 64) | get fullProposal() {
method currentProposal (line 68) | get currentProposal() {
method delegate (line 73) | delegate(delegation) {
method propose (line 87) | propose() {
method queue (line 91) | queue() {
method execute (line 95) | execute() {
method cancel (line 99) | cancel(visibility = 'external') {
method vote (line 112) | async vote(vote = {}) {
method overrideVote (line 136) | async overrideVote(vote = {}) {
method waitForSnapshot (line 152) | async waitForSnapshot(offset = 0n) {
method waitForDeadline (line 157) | async waitForDeadline(offset = 0n) {
method waitForEta (line 162) | async waitForEta(offset = 0n) {
method forgeMessage (line 168) | async forgeMessage(vote = {}) {
method proposalStatesToBitMap (line 191) | static proposalStatesToBitMap(proposalStates, options = {}) {
FILE: test/helpers/math.js
function modExp (line 7) | function modExp(b, e, m) {
FILE: test/helpers/signers.js
class NonNativeSigner (line 6) | class NonNativeSigner extends ethers.AbstractSigner {
method constructor (line 9) | constructor(privateKey, provider) {
method signingKey (line 20) | get signingKey() {
method privateKey (line 23) | get privateKey() {
method getAddress (line 27) | async getAddress() {
method connect (line 31) | connect(provider) {
method signTransaction (line 35) | async signTransaction(/*tx: TransactionRequest*/) {
method signMessage (line 39) | async signMessage(message /*: string | Uint8Array*/) /*: Promise<strin...
method signTypedData (line 43) | async signTypedData(
class P256SigningKey (line 63) | class P256SigningKey {
method constructor (line 66) | constructor(privateKey) {
method random (line 70) | static random() {
method privateKey (line 74) | get privateKey() {
method publicKey (line 78) | get publicKey() {
method sign (line 86) | sign(digest /*: BytesLike*/) /*: ethers.Signature*/ {
class RSASigningKey (line 102) | class RSASigningKey {
method constructor (line 106) | constructor(keyPair) {
method random (line 112) | static random(modulusLength = 2048) {
method privateKey (line 116) | get privateKey() {
method publicKey (line 120) | get publicKey() {
method sign (line 124) | sign(digest /*: BytesLike*/) /*: ethers.Signature*/ {
class RSASHA256SigningKey (line 138) | class RSASHA256SigningKey extends RSASigningKey {
method sign (line 139) | sign(digest /*: BytesLike*/) /*: ethers.Signature*/ {
class WebAuthnSigningKey (line 145) | class WebAuthnSigningKey extends P256SigningKey {
method sign (line 146) | sign(digest /*: BytesLike*/) /*: { serialized: string } */ {
class MultiERC7913SigningKey (line 181) | class MultiERC7913SigningKey {
method constructor (line 185) | constructor(signers) {
method signers (line 199) | get signers() {
method sign (line 203) | sign(digest /*: BytesLike*/ /*: ethers.Signature*/) {
FILE: test/helpers/trie.js
class BlockTries (line 4) | class BlockTries {
method constructor (line 5) | constructor(block) {
method ready (line 28) | ready() {
method getTransactionProof (line 32) | getTransactionProof(index) {
method getReceiptProof (line 36) | getReceiptProof(index) {
method transactionTrieRoot (line 40) | get transactionTrieRoot() {
method receiptTrieRoot (line 44) | get receiptTrieRoot() {
method from (line 48) | static from(block) {
method serializeTransaction (line 53) | static serializeTransaction(tx) {
method serializeReceipt (line 58) | static serializeReceipt(receipt) {
method indexToKey (line 70) | static indexToKey(index) {
method indexToKeyBytes (line 74) | static indexToKeyBytes(index) {
FILE: test/helpers/txpool.js
function batchInBlock (line 6) | async function batchInBlock(txs, provider = network.provider) {
FILE: test/metatx/ERC2771Context.test.js
function fixture (line 11) | async function fixture() {
FILE: test/metatx/ERC2771Forwarder.test.js
function fixture (line 9) | async function fixture() {
FILE: test/proxy/Clones.test.js
function fixture (line 25) | async function fixture() {
FILE: test/proxy/ERC1967/ERC1967Utils.test.js
function fixture (line 7) | async function fixture() {
FILE: test/proxy/beacon/BeaconProxy.test.js
function fixture (line 7) | async function fixture() {
function assertInitialized (line 52) | async function assertInitialized({ value, balance }) {
FILE: test/proxy/beacon/UpgradeableBeacon.test.js
function fixture (line 5) | async function fixture() {
FILE: test/proxy/transparent/ProxyAdmin.test.js
function fixture (line 7) | async function fixture() {
FILE: test/proxy/transparent/TransparentUpgradeableProxy.test.js
function fixture (line 7) | async function fixture() {
FILE: test/proxy/utils/UUPSUpgradeable.test.js
function fixture (line 7) | async function fixture() {
FILE: test/sanity.test.js
function fixture (line 5) | async function fixture() {
FILE: test/token/ERC1155/ERC1155.behavior.js
function shouldBehaveLikeERC1155 (line 8) | function shouldBehaveLikeERC1155() {
FILE: test/token/ERC1155/ERC1155.test.js
function fixture (line 11) | async function fixture() {
FILE: test/token/ERC1155/extensions/ERC1155Burnable.test.js
function fixture (line 8) | async function fixture() {
FILE: test/token/ERC1155/extensions/ERC1155Crosschain.test.js
function fixture (line 10) | async function fixture() {
FILE: test/token/ERC1155/extensions/ERC1155Pausable.test.js
function fixture (line 5) | async function fixture() {
FILE: test/token/ERC1155/extensions/ERC1155Supply.test.js
function fixture (line 5) | async function fixture() {
FILE: test/token/ERC1155/extensions/ERC1155URIStorage.test.js
function fixture (line 12) | async function fixture() {
function fixture (line 43) | async function fixture() {
FILE: test/token/ERC1155/utils/ERC1155Holder.test.js
function fixture (line 11) | async function fixture() {
FILE: test/token/ERC1155/utils/ERC1155Utils.test.js
constant RECEIVER_SINGLE_MAGIC_VALUE (line 12) | const RECEIVER_SINGLE_MAGIC_VALUE = '0xf23a6e61';
constant RECEIVER_BATCH_MAGIC_VALUE (line 13) | const RECEIVER_BATCH_MAGIC_VALUE = '0xbc197c81';
FILE: test/token/ERC20/ERC20.behavior.js
function shouldBehaveLikeERC20 (line 4) | function shouldBehaveLikeERC20(initialSupply, opts = {}) {
function shouldBehaveLikeERC20Transfer (line 160) | function shouldBehaveLikeERC20Transfer(balance) {
function shouldBehaveLikeERC20Approve (line 209) | function shouldBehaveLikeERC20Approve(supply) {
FILE: test/token/ERC20/ERC20.test.js
constant TOKENS (line 12) | const TOKENS = [{ Token: '$ERC20' }, { Token: '$ERC20ApprovalMock', forc...
FILE: test/token/ERC20/extensions/ERC1363.test.js
function fixture (line 18) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Burnable.test.js
function fixture (line 9) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Capped.test.js
function fixture (line 9) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Crosschain.test.js
function fixture (line 11) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20FlashMint.test.js
function fixture (line 10) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Pausable.test.js
function fixture (line 9) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Permit.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC20Votes.test.js
constant TOKENS (line 11) | const TOKENS = [
FILE: test/token/ERC20/extensions/ERC20Wrapper.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC20/extensions/ERC4626.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC20/extensions/draft-ERC20Bridgeable.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC20/extensions/draft-ERC20TemporaryApproval.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC20/utils/SafeERC20.test.js
function fixture (line 10) | async function fixture() {
function shouldOnlyRevertOnErrors (line 370) | function shouldOnlyRevertOnErrors() {
FILE: test/token/ERC6909/ERC6909.behavior.js
function shouldBehaveLikeERC6909 (line 6) | function shouldBehaveLikeERC6909() {
FILE: test/token/ERC6909/ERC6909.test.js
function fixture (line 7) | async function fixture() {
FILE: test/token/ERC6909/extensions/ERC6909ContentURI.test.js
function fixture (line 6) | async function fixture() {
FILE: test/token/ERC6909/extensions/ERC6909Metadata.test.js
function fixture (line 7) | async function fixture() {
FILE: test/token/ERC6909/extensions/ERC6909TokenSupply.test.js
function fixture (line 8) | async function fixture() {
FILE: test/token/ERC721/ERC721.behavior.js
constant RECEIVER_MAGIC_VALUE (line 14) | const RECEIVER_MAGIC_VALUE = '0x150b7a02';
function shouldBehaveLikeERC721 (line 16) | function shouldBehaveLikeERC721() {
function shouldBehaveLikeERC721Enumerable (line 758) | function shouldBehaveLikeERC721Enumerable() {
function shouldBehaveLikeERC721Metadata (line 920) | function shouldBehaveLikeERC721Metadata(name, symbol) {
FILE: test/token/ERC721/ERC721.test.js
function fixture (line 9) | async function fixture() {
FILE: test/token/ERC721/ERC721Enumerable.test.js
function fixture (line 13) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Burnable.test.js
function fixture (line 11) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Consecutive.test.js
function fixture (line 13) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Crosschain.test.js
function fixture (line 10) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Pausable.test.js
function fixture (line 11) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Royalty.test.js
function fixture (line 15) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721URIStorage.test.js
function fixture (line 15) | async function fixture() {
FILE: test/token/ERC721/extensions/ERC721Votes.test.js
constant TOKENS (line 9) | const TOKENS = [
FILE: test/token/ERC721/extensions/ERC721Wrapper.test.js
function fixture (line 12) | async function fixture() {
FILE: test/token/ERC721/utils/ERC721Utils.test.js
constant RECEIVER_MAGIC_VALUE (line 9) | const RECEIVER_MAGIC_VALUE = '0x150b7a02';
FILE: test/token/common/ERC2981.behavior.js
function shouldBehaveLikeERC2981 (line 6) | function shouldBehaveLikeERC2981() {
FILE: test/utils/Address.test.js
function fixture (line 11) | async function fixture() {
FILE: test/utils/Base58.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/Base64.test.js
function fixture (line 9) | async function fixture() {
FILE: test/utils/Blockhash.test.js
constant SYSTEM_ADDRESS (line 6) | const SYSTEM_ADDRESS = '0xfffffffffffffffffffffffffffffffffffffffe';
constant HISTORY_SERVE_WINDOW (line 7) | const HISTORY_SERVE_WINDOW = 8191;
constant BLOCKHASH_SERVE_WINDOW (line 8) | const BLOCKHASH_SERVE_WINDOW = 256;
function fixture (line 10) | async function fixture() {
FILE: test/utils/Bytes.test.js
function fixture (line 14) | async function fixture() {
FILE: test/utils/Calldata.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/Context.behavior.js
function fixture (line 5) | async function fixture() {
function shouldBehaveLikeRegularContext (line 8) | function shouldBehaveLikeRegularContext() {
FILE: test/utils/Context.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/Create2.test.js
function fixture (line 8) | async function fixture() {
FILE: test/utils/LowLevelCall.test.js
function fixture (line 11) | async function fixture() {
FILE: test/utils/Memory.test.js
function fixture (line 11) | async function fixture() {
FILE: test/utils/Multicall.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/Nonces.behavior.js
function shouldBehaveLikeNonces (line 4) | function shouldBehaveLikeNonces() {
function shouldBehaveLikeNoncesKeyed (line 69) | function shouldBehaveLikeNoncesKeyed() {
FILE: test/utils/Nonces.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/NoncesKeyed.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/Packing.test.js
function fixture (line 9) | async function fixture() {
FILE: test/utils/Panic.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/Pausable.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/RLP.test.js
function fixture (line 9) | async function fixture() {
FILE: test/utils/ReentrancyGuard.test.js
function fixture (line 7) | async function fixture() {
FILE: test/utils/RelayedCall.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/ShortStrings.test.js
constant FALLBACK_SENTINEL (line 5) | const FALLBACK_SENTINEL = ethers.zeroPadValue('0xFF', 32);
function fixture (line 17) | async function fixture() {
FILE: test/utils/SimulatedCall.test.js
function fixture (line 7) | async function fixture() {
FILE: test/utils/SlotDerivation.test.js
function fixture (line 7) | async function fixture() {
FILE: test/utils/StorageSlot.test.js
constant TYPES (line 9) | const TYPES = [
function fixture (line 19) | async function fixture() {
FILE: test/utils/Strings.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/TransientSlot.test.js
constant TYPES (line 10) | const TYPES = [
function fixture (line 18) | async function fixture() {
FILE: test/utils/cryptography/ECDSA.test.js
constant TEST_MESSAGE (line 6) | const TEST_MESSAGE = ethers.id('OpenZeppelin');
constant WRONG_MESSAGE (line 7) | const WRONG_MESSAGE = ethers.id('Nope');
constant NON_HASH_MESSAGE (line 8) | const NON_HASH_MESSAGE = '0xabcd';
function fixture (line 10) | async function fixture() {
FILE: test/utils/cryptography/EIP712.test.js
constant LENGTHS (line 8) | const LENGTHS = {
FILE: test/utils/cryptography/ERC1271.behavior.js
function shouldBehaveLikeERC1271 (line 6) | function shouldBehaveLikeERC1271({ erc7739 = false } = {}) {
FILE: test/utils/cryptography/MessageHashUtils.test.js
function fixture (line 8) | async function fixture() {
FILE: test/utils/cryptography/P256.test.js
function fixture (line 25) | async function fixture() {
FILE: test/utils/cryptography/RSA.test.js
function fixture (line 8) | async function fixture() {
FILE: test/utils/cryptography/SignatureChecker.test.js
constant TEST_MESSAGE (line 8) | const TEST_MESSAGE = ethers.id('OpenZeppelin');
constant TEST_MESSAGE_HASH (line 9) | const TEST_MESSAGE_HASH = ethers.hashMessage(TEST_MESSAGE);
constant WRONG_MESSAGE (line 11) | const WRONG_MESSAGE = ethers.id('Nope');
constant WRONG_MESSAGE_HASH (line 12) | const WRONG_MESSAGE_HASH = ethers.hashMessage(WRONG_MESSAGE);
function fixture (line 17) | async function fixture() {
FILE: test/utils/cryptography/TrieProof.test.js
function fixture (line 32) | async function fixture() {
FILE: test/utils/draft-InteroperableAddress.test.js
function fixture (line 10) | async function fixture() {
FILE: test/utils/introspection/ERC165.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/introspection/ERC165Checker.test.js
constant DUMMY_ID (line 5) | const DUMMY_ID = '0xdeadbeef';
constant DUMMY_ID_2 (line 6) | const DUMMY_ID_2 = '0xcafebabe';
constant DUMMY_ID_3 (line 7) | const DUMMY_ID_3 = '0xdecafbad';
constant DUMMY_UNSUPPORTED_ID (line 8) | const DUMMY_UNSUPPORTED_ID = '0xbaddcafe';
constant DUMMY_UNSUPPORTED_ID_2 (line 9) | const DUMMY_UNSUPPORTED_ID_2 = '0xbaadcafe';
constant DUMMY_ACCOUNT (line 10) | const DUMMY_ACCOUNT = '0x1111111111111111111111111111111111111111';
function fixture (line 12) | async function fixture() {
FILE: test/utils/introspection/SupportsInterface.behavior.js
constant INVALID_ID (line 5) | const INVALID_ID = '0xffffffff';
constant GOVERNOR_INTERFACE (line 6) | const GOVERNOR_INTERFACE = [
constant SIGNATURES (line 34) | const SIGNATURES = {
constant INTERFACE_IDS (line 107) | const INTERFACE_IDS = mapValues(SIGNATURES, interfaceId);
function shouldSupportInterfaces (line 109) | function shouldSupportInterfaces(interfaces = [], signatures = SIGNATURE...
FILE: test/utils/math/Math.test.js
function fixture (line 27) | async function fixture() {
FILE: test/utils/math/SafeCast.test.js
function fixture (line 7) | async function fixture() {
FILE: test/utils/math/SignedMath.test.js
function testCommutative (line 7) | async function testCommutative(fn, lhs, rhs, expected, ...extra) {
function fixture (line 12) | async function fixture() {
FILE: test/utils/structs/BitMap.test.js
function fixture (line 5) | async function fixture() {
FILE: test/utils/structs/CircularBuffer.test.js
constant LENGTH (line 8) | const LENGTH = 4;
function fixture (line 10) | async function fixture() {
FILE: test/utils/structs/DoubleEndedQueue.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/structs/EnumerableMap.behavior.js
function shouldBehaveLikeMap (line 6) | function shouldBehaveLikeMap() {
FILE: test/utils/structs/EnumerableMap.test.js
function fixture (line 13) | async function fixture() {
FILE: test/utils/structs/EnumerableSet.behavior.js
function shouldBehaveLikeSet (line 4) | function shouldBehaveLikeSet() {
FILE: test/utils/structs/EnumerableSet.test.js
function fixture (line 18) | async function fixture() {
FILE: test/utils/structs/Heap.test.js
function fixture (line 6) | async function fixture() {
FILE: test/utils/structs/MerkleTree.test.js
constant DEPTH (line 10) | const DEPTH = 4;
constant ZERO (line 24) | const ZERO = makeTree().leafHash([ethers.ZeroHash]);
function fixture (line 26) | async function fixture() {
FILE: test/utils/types/Time.test.js
constant MAX_UINT32 (line 9) | const MAX_UINT32 = (1n << 32n) - 1n;
constant MAX_UINT48 (line 10) | const MAX_UINT48 = (1n << 48n) - 1n;
constant SOME_VALUES (line 11) | const SOME_VALUES = [0n, 1n, 2n, 15n, 16n, 17n, 42n];
function fixture (line 39) | async function fixture() {
Condensed preview — 847 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,636K chars).
[
{
"path": ".changeset/better-tires-pull.md",
"chars": 184,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`Memory`: Add a `isReserved(Slice)` function that checks if the memory occupied "
},
{
"path": ".changeset/blue-jars-lay.md",
"chars": 166,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`ERC1155Crosschain`: Added an ERC-1155 extension to embed an ERC-7786 based cros"
},
{
"path": ".changeset/bright-cooks-brush.md",
"chars": 170,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`RLP`: Perform a memory copy when decoding `bytes` objects containing a single b"
},
{
"path": ".changeset/chatty-dryers-joke.md",
"chars": 137,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`AccountERC7579Hooked`: Do not revert if hook checks fail during the hook module"
},
{
"path": ".changeset/config.json",
"chars": 263,
"preview": "{\n \"$schema\": \"https://unpkg.com/@changesets/config@2.3.0/schema.json\",\n \"changelog\": [\n \"@changesets/changelog-git"
},
{
"path": ".changeset/curly-pandas-flow.md",
"chars": 243,
"preview": "---\n'openzeppelin-solidity': patch\n---\n\nAdd ERC-165 detection for the `IERC6909ContentURI`, `IERC6909TokenSupply` and `I"
},
{
"path": ".changeset/flat-flies-hear.md",
"chars": 205,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`SimulateCall`: Add a new call simulation utilities that allow inspecting return"
},
{
"path": ".changeset/floppy-symbols-burn.md",
"chars": 157,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`CrosschainRemoteExecutor`: Add a new executor contract that relays transaction "
},
{
"path": ".changeset/fruity-coats-smash.md",
"chars": 157,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`BridgeNonFungibleCore` and `BridgeERC721`: Added bridge contracts to handle cro"
},
{
"path": ".changeset/gentle-apples-dance.md",
"chars": 132,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`Accumulator`: Check that slices being added (`shift` or `push`) are in the rese"
},
{
"path": ".changeset/happy-pants-decide.md",
"chars": 85,
"preview": "---\n'openzeppelin-solidity': patch\n---\n\nRename `BridgeERC20Core` to `BridgeFungible`\n"
},
{
"path": ".changeset/legal-cameras-sin.md",
"chars": 175,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`AccessManager`: treat `setAuthority` differently in `canCall` to prevent bypass"
},
{
"path": ".changeset/rare-bushes-march.md",
"chars": 191,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`GovernorCrosschain`: Governor module that facilitates the execution of crosscha"
},
{
"path": ".changeset/red-gifts-appear.md",
"chars": 164,
"preview": "---\n'openzeppelin-solidity': patch\n---\n\n`InteroperableAddress`: Fix overflow in the parsing functions that caused silent"
},
{
"path": ".changeset/silver-falcons-lay.md",
"chars": 162,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`Governor`: Strict enforcement of the expected proposal state depending on `prop"
},
{
"path": ".changeset/smooth-cows-notice.md",
"chars": 125,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`InteroperableAddress`: reject inputs with both chain reference and addresses em"
},
{
"path": ".changeset/some-dolls-shine.md",
"chars": 119,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`ERC2771Forwarder`: Revert the entire atomic batch if a call with value fails.\n"
},
{
"path": ".changeset/spicy-seals-bake.md",
"chars": 167,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`WebAuthn`: Verification now returns `false` instead of reverting when client da"
},
{
"path": ".changeset/sweet-houses-cheer.md",
"chars": 154,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`BridgeMultiToken` and `BridgeERC1155`: Added bridge contracts to handle crossch"
},
{
"path": ".changeset/tangy-jokes-begin.md",
"chars": 164,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`Memory`: Remove the `asBytes32` and `asPointer` function to reduce the risk of "
},
{
"path": ".changeset/tidy-turkeys-build.md",
"chars": 164,
"preview": "---\n'openzeppelin-solidity': minor\n---\n\n`ERC721Crosschain`: Added an ERC-721 extension to embed an ERC-7786 based crossc"
},
{
"path": ".codecov.yml",
"chars": 254,
"preview": "comment: off\ngithub_checks:\n annotations: false\ncoverage:\n status:\n patch:\n default:\n target: 95%\n "
},
{
"path": ".editorconfig",
"chars": 320,
"preview": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\ncharset = utf-8\nend_o"
},
{
"path": ".gitattributes",
"chars": 119,
"preview": "fv/specs/*.spec linguist-language=Solidity\nfv/specs/*.conf linguist-detectable\nfv/specs/*.conf linguist-language=JSON5\n"
},
{
"path": ".github/CODEOWNERS",
"chars": 339,
"preview": "# List of approvers/reviewers for OpenZeppelin Contracts\n#\n# Get in touch with us via the OpenZeppelin Forum\n# https://"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 843,
"preview": "---\nname: Bug report\nabout: Report a bug in OpenZeppelin Contracts\n\n---\n\n<!-- Briefly describe the issue you're experien"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 158,
"preview": "contact_links:\n - name: Questions & Support Requests\n url: https://forum.openzeppelin.com/c/support/contracts/18\n "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 464,
"preview": "---\nname: Feature request\nabout: Suggest an idea for OpenZeppelin Contracts\n\n---\n\n**🧐 Motivation**\n<!-- Is your feature "
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 737,
"preview": "<!-- Thank you for your interest in contributing to OpenZeppelin! -->\n\n<!-- Consider opening an issue for discussion pri"
},
{
"path": ".github/actions/gas-compare/action.yml",
"chars": 1831,
"preview": "name: Compare gas costs\ndescription: Compare gas costs between branches\ninputs:\n token:\n description: GitHub token, "
},
{
"path": ".github/actions/setup/action.yml",
"chars": 3854,
"preview": "name: Setup\ndescription: Common environment setup\ninputs:\n node:\n description: Whether to set up node\n required: "
},
{
"path": ".github/actions/storage-layout/action.yml",
"chars": 1993,
"preview": "name: Compare storage layouts\ndescription: Compare storage layouts between branches\ninputs:\n token:\n description: gi"
},
{
"path": ".github/workflows/actionlint.yml",
"chars": 521,
"preview": "name: lint workflows\n\non:\n pull_request:\n paths:\n - '.github/**/*.ya?ml'\n\njobs:\n lint:\n runs-on: ubuntu-lat"
},
{
"path": ".github/workflows/changeset.yml",
"chars": 659,
"preview": "name: changeset\n\non:\n pull_request:\n branches:\n - master\n types:\n - opened\n - synchronize\n - "
},
{
"path": ".github/workflows/checks.yml",
"chars": 3710,
"preview": "name: checks\n\non:\n push:\n branches:\n - master\n - next-v*\n - release-v*\n pull_request: {}\n workflow_"
},
{
"path": ".github/workflows/docs.yml",
"chars": 377,
"preview": "name: Build Docs\n\non:\n push:\n branches: [release-v*]\n\npermissions:\n contents: write\n\njobs:\n build:\n runs-on: ub"
},
{
"path": ".github/workflows/formal-verification.yml",
"chars": 2073,
"preview": "name: formal verification\n\non:\n pull_request:\n types:\n - opened\n - reopened\n - synchronize\n - la"
},
{
"path": ".github/workflows/release-cycle.yml",
"chars": 6905,
"preview": "# D: Manual Dispatch\n# M: Merge release PR\n# C: Commit\n# ┌───────────┐ ┌─────────────┐ ┌────────────────┐\n# "
},
{
"path": ".github/workflows/release-upgradeable.yml",
"chars": 3222,
"preview": "name: Release Upgradeable\n\non:\n workflow_dispatch: {}\n\njobs:\n state:\n name: Check state\n permissions:\n pull"
},
{
"path": ".github/workflows/upgradeable.yml",
"chars": 1173,
"preview": "name: Transpile upgradeable\n\non:\n push:\n branches:\n - master\n - release-v*\n\njobs:\n transpile:\n environ"
},
{
"path": ".gitignore",
"chars": 760,
"preview": "*.swp\n*.swo\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\nallFiredEvents\nscTopics\n\n# Coverage directory used by t"
},
{
"path": ".gitmodules",
"chars": 332,
"preview": "[submodule \"lib/forge-std\"]\n\tbranch = v1\n\tpath = lib/forge-std\n\turl = https://github.com/foundry-rs/forge-std\n[submodule"
},
{
"path": ".husky/pre-commit",
"chars": 40,
"preview": "npm run test:generation\nnpx lint-staged\n"
},
{
"path": ".mocharc.js",
"chars": 70,
"preview": "module.exports = {\n require: 'hardhat/register',\n timeout: 4000,\n};\n"
},
{
"path": ".prettierrc",
"chars": 256,
"preview": "{\n \"printWidth\": 120,\n \"singleQuote\": true,\n \"trailingComma\": \"all\",\n \"arrowParens\": \"avoid\",\n \"overrides\": [\n {"
},
{
"path": ".solcover.js",
"chars": 448,
"preview": "module.exports = {\n norpc: true,\n testCommand: 'npm test',\n compileCommand: 'npm run compile',\n skipFiles: ['mocks']"
},
{
"path": "CHANGELOG.md",
"chars": 145593,
"preview": "# Changelog\n\n\n## 5.6.1 (2026-02-27)\n\n- `InteroperableAddress`: Fix overflow in the parsing functions that caused silent "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3252,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 2234,
"preview": "# Contributing Guidelines\n\nThere are many ways to contribute to OpenZeppelin Contracts.\n\n## Troubleshooting\n\nYou can hel"
},
{
"path": "FUNDING.json",
"chars": 213,
"preview": "{\n \"drips\": {\n \"ethereum\": {\n \"ownedBy\": \"0xAeb37910f93486C85A1F8F994b67E8187554d664\"\n }\n },\n \"opRetro\": {"
},
{
"path": "GUIDELINES.md",
"chars": 8545,
"preview": "# Engineering Guidelines\n\n## Testing\n\nCode must be thoroughly tested with quality unit tests.\n\nWe defer to the [Moloch T"
},
{
"path": "LICENSE",
"chars": 1090,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016-2026 Zeppelin Group Ltd\n\nPermission is hereby granted, free of charge, to any "
},
{
"path": "README.md",
"chars": 9121,
"preview": "# <img src=\"logo.svg\" alt=\"OpenZeppelin\" height=\"40px\">\n\n[ (access/AccessControl.sol)\n\npragma solid"
},
{
"path": "contracts/access/IAccessControl.sol",
"chars": 3343,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma soli"
},
{
"path": "contracts/access/Ownable.sol",
"chars": 3102,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0"
},
{
"path": "contracts/access/Ownable2Step.sol",
"chars": 2476,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)\n\npragma solidi"
},
{
"path": "contracts/access/README.adoc",
"chars": 1386,
"preview": "= Access Control\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/a"
},
{
"path": "contracts/access/extensions/AccessControlDefaultAdminRules.sol",
"chars": 14737,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (access/extensions/AccessControlDefaultA"
},
{
"path": "contracts/access/extensions/AccessControlEnumerable.sol",
"chars": 3402,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (access/extensions/AccessControlEnumerab"
},
{
"path": "contracts/access/extensions/IAccessControlDefaultAdminRules.sol",
"chars": 8183,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (access/extensions/IAccessControlDefault"
},
{
"path": "contracts/access/extensions/IAccessControlEnumerable.sol",
"chars": 1279,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/extensions/IAccessControlEnumera"
},
{
"path": "contracts/access/manager/AccessManaged.sol",
"chars": 4680,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/AccessManaged.sol)\n\nprag"
},
{
"path": "contracts/access/manager/AccessManager.sol",
"chars": 30673,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (access/manager/AccessManager.sol)\n\nprag"
},
{
"path": "contracts/access/manager/AuthorityUtils.sol",
"chars": 1376,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (access/manager/AuthorityUtils.sol)\n\npra"
},
{
"path": "contracts/access/manager/IAccessManaged.sol",
"chars": 1111,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAccessManaged.sol)\n\npra"
},
{
"path": "contracts/access/manager/IAccessManager.sol",
"chars": 16635,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (access/manager/IAccessManager.sol)\n\npra"
},
{
"path": "contracts/access/manager/IAuthority.sol",
"chars": 483,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAuthority.sol)\n\npragma "
},
{
"path": "contracts/account/Account.sol",
"chars": 5555,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/Account.sol)\n\npragma solidity ^"
},
{
"path": "contracts/account/README.adoc",
"chars": 958,
"preview": "= Account\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/account\n\n"
},
{
"path": "contracts/account/extensions/draft-AccountERC7579.sol",
"chars": 19762,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/extensions/draft-AccountERC7579"
},
{
"path": "contracts/account/extensions/draft-AccountERC7579Hooked.sol",
"chars": 7360,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/extensions/draft-AccountERC7579"
},
{
"path": "contracts/account/extensions/draft-ERC7821.sol",
"chars": 2689,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (account/extensions/draft-ERC7821.sol)\n\n"
},
{
"path": "contracts/account/utils/EIP7702Utils.sol",
"chars": 722,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/utils/EIP7702Utils.sol)\n\npragma"
},
{
"path": "contracts/account/utils/draft-ERC4337Utils.sol",
"chars": 13275,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/utils/draft-ERC4337Utils.sol)\n\n"
},
{
"path": "contracts/account/utils/draft-ERC7579Utils.sol",
"chars": 11326,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (account/utils/draft-ERC7579Utils.sol)\n\n"
},
{
"path": "contracts/crosschain/CrosschainLinked.sol",
"chars": 4455,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/CrosschainLinked.sol)\n\npragm"
},
{
"path": "contracts/crosschain/CrosschainRemoteExecutor.sol",
"chars": 4040,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.27;\n\nimport {IERC7786GatewaySource} from \"../interfaces/draft-IERC"
},
{
"path": "contracts/crosschain/ERC7786Recipient.sol",
"chars": 2907,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/ERC7786Recipient.sol)\n\npragm"
},
{
"path": "contracts/crosschain/README.adoc",
"chars": 1776,
"preview": "= Cross chain interoperability\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/c"
},
{
"path": "contracts/crosschain/bridges/BridgeERC1155.sol",
"chars": 3876,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {IERC1155} from \"../../interfaces/IERC1155.sol\";\nimpor"
},
{
"path": "contracts/crosschain/bridges/BridgeERC20.sol",
"chars": 1280,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/BridgeERC20.sol)\n\npr"
},
{
"path": "contracts/crosschain/bridges/BridgeERC721.sol",
"chars": 2843,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {IERC721} from \"../../interfaces/IERC721.sol\";\nimport "
},
{
"path": "contracts/crosschain/bridges/BridgeERC7802.sol",
"chars": 1152,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/BridgeERC7802.sol)\n\n"
},
{
"path": "contracts/crosschain/bridges/abstract/BridgeFungible.sol",
"chars": 3753,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (crosschain/bridges/abstract/BridgeFungi"
},
{
"path": "contracts/crosschain/bridges/abstract/BridgeMultiToken.sol",
"chars": 3713,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {InteroperableAddress} from \"../../../utils/draft-Inte"
},
{
"path": "contracts/crosschain/bridges/abstract/BridgeNonFungible.sol",
"chars": 3160,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {InteroperableAddress} from \"../../../utils/draft-Inte"
},
{
"path": "contracts/finance/README.adoc",
"chars": 464,
"preview": "= Finance\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance\n"
},
{
"path": "contracts/finance/VestingWallet.sol",
"chars": 6057,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (finance/VestingWallet.sol)\n\npragma soli"
},
{
"path": "contracts/finance/VestingWalletCliff.sol",
"chars": 2018,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (finance/VestingWalletCliff.sol)\n\npragma"
},
{
"path": "contracts/governance/Governor.sol",
"chars": 31997,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (governance/Governor.sol)\n\npragma solidi"
},
{
"path": "contracts/governance/IGovernor.sol",
"chars": 16341,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/IGovernor.sol)\n\npragma solid"
},
{
"path": "contracts/governance/README.adoc",
"chars": 13008,
"preview": "= Governance\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/gover"
},
{
"path": "contracts/governance/TimelockController.sol",
"chars": 16260,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (governance/TimelockController.sol)\n\npra"
},
{
"path": "contracts/governance/extensions/GovernorCountingFractional.sol",
"chars": 9318,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingF"
},
{
"path": "contracts/governance/extensions/GovernorCountingOverridable.sol",
"chars": 8692,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingO"
},
{
"path": "contracts/governance/extensions/GovernorCountingSimple.sol",
"chars": 3249,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorCountingS"
},
{
"path": "contracts/governance/extensions/GovernorCrosschain.sol",
"chars": 1261,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {Governor} from \"../Governor.sol\";\nimport {Mode} from "
},
{
"path": "contracts/governance/extensions/GovernorNoncesKeyed.sol",
"chars": 3442,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorNoncesKey"
},
{
"path": "contracts/governance/extensions/GovernorPreventLateQuorum.sol",
"chars": 4120,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorPreventLa"
},
{
"path": "contracts/governance/extensions/GovernorProposalGuardian.sol",
"chars": 2274,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorProposalG"
},
{
"path": "contracts/governance/extensions/GovernorSequentialProposalId.sol",
"chars": 2823,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorSequentia"
},
{
"path": "contracts/governance/extensions/GovernorSettings.sol",
"chars": 3554,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorSettings."
},
{
"path": "contracts/governance/extensions/GovernorStorage.sol",
"chars": 4584,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (governance/extensions/GovernorStorage.s"
},
{
"path": "contracts/governance/extensions/GovernorSuperQuorum.sol",
"chars": 3071,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorSuperQuor"
},
{
"path": "contracts/governance/extensions/GovernorTimelockAccess.sol",
"chars": 16249,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorTimelockA"
},
{
"path": "contracts/governance/extensions/GovernorTimelockCompound.sol",
"chars": 6261,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorTimelockC"
},
{
"path": "contracts/governance/extensions/GovernorTimelockControl.sol",
"chars": 6619,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorTimelockC"
},
{
"path": "contracts/governance/extensions/GovernorVotes.sol",
"chars": 1992,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (governance/extensions/GovernorVotes.sol"
},
{
"path": "contracts/governance/extensions/GovernorVotesQuorumFraction.sol",
"chars": 4183,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorVotesQuor"
},
{
"path": "contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol",
"chars": 5626,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/extensions/GovernorVotesSupe"
},
{
"path": "contracts/governance/utils/IVotes.sol",
"chars": 2323,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (governance/utils/IVotes.sol)\n\npragma so"
},
{
"path": "contracts/governance/utils/Votes.sol",
"chars": 9712,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (governance/utils/Votes.sol)\n\npragma sol"
},
{
"path": "contracts/governance/utils/VotesExtended.sol",
"chars": 3729,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (governance/utils/VotesExtended.sol)\n\npr"
},
{
"path": "contracts/interfaces/IERC1155.sol",
"chars": 189,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1155.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC1155MetadataURI.sol",
"chars": 233,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1155MetadataURI.sol)\n\npr"
},
{
"path": "contracts/interfaces/IERC1155Receiver.sol",
"chars": 213,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1155Receiver.sol)\n\npragm"
},
{
"path": "contracts/interfaces/IERC1271.sol",
"chars": 656,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1271.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC1363.sol",
"chars": 4454,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC1363Receiver.sol",
"chars": 1316,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363Receiver.sol)\n\npragm"
},
{
"path": "contracts/interfaces/IERC1363Spender.sol",
"chars": 1119,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363Spender.sol)\n\npragma"
},
{
"path": "contracts/interfaces/IERC165.sol",
"chars": 193,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidit"
},
{
"path": "contracts/interfaces/IERC1820Implementer.sol",
"chars": 768,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1820Implementer.sol)\n\npr"
},
{
"path": "contracts/interfaces/IERC1820Registry.sol",
"chars": 4836,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1820Registry.sol)\n\npragm"
},
{
"path": "contracts/interfaces/IERC1967.sol",
"chars": 637,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1967.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC20.sol",
"chars": 182,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity"
},
{
"path": "contracts/interfaces/IERC20Metadata.sol",
"chars": 216,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20Metadata.sol)\n\npragma "
},
{
"path": "contracts/interfaces/IERC2309.sol",
"chars": 533,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC2309.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC2612.sol",
"chars": 245,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC2612.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC2981.sol",
"chars": 1114,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC2981.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC3156.sol",
"chars": 263,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC3156.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC3156FlashBorrower.sol",
"chars": 900,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC3156FlashBorrower.sol)\n\n"
},
{
"path": "contracts/interfaces/IERC3156FlashLender.sol",
"chars": 1451,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC3156FlashLender.sol)\n\npr"
},
{
"path": "contracts/interfaces/IERC4626.sol",
"chars": 12182,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC4626.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC4906.sol",
"chars": 841,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC4906.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC5267.sol",
"chars": 740,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC5267.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC5313.sol",
"chars": 435,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC5313.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC5805.sol",
"chars": 272,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC5805.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC6372.sol",
"chars": 520,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC6372.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC6909.sol",
"chars": 4033,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC6909.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC721.sol",
"chars": 185,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC721.sol)\n\npragma solidit"
},
{
"path": "contracts/interfaces/IERC721Enumerable.sol",
"chars": 226,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC721Enumerable.sol)\n\nprag"
},
{
"path": "contracts/interfaces/IERC721Metadata.sol",
"chars": 220,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC721Metadata.sol)\n\npragma"
},
{
"path": "contracts/interfaces/IERC721Receiver.sol",
"chars": 209,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC721Receiver.sol)\n\npragma"
},
{
"path": "contracts/interfaces/IERC7751.sol",
"chars": 391,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC7751.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/IERC777.sol",
"chars": 6733,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC777.sol)\n\npragma solidit"
},
{
"path": "contracts/interfaces/IERC777Recipient.sol",
"chars": 1269,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC777Recipient.sol)\n\npragm"
},
{
"path": "contracts/interfaces/IERC777Sender.sol",
"chars": 1278,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC777Sender.sol)\n\npragma s"
},
{
"path": "contracts/interfaces/IERC7913.sol",
"chars": 674,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC7913.sol)\n\npragma solidi"
},
{
"path": "contracts/interfaces/README.adoc",
"chars": 2028,
"preview": "= Interfaces\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/inter"
},
{
"path": "contracts/interfaces/draft-IERC1822.sol",
"chars": 882,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC1822.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC4337.sol",
"chars": 10520,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (interfaces/draft-IERC4337.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC6093.sol",
"chars": 6534,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC7579.sol",
"chars": 8976,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (interfaces/draft-IERC7579.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC7674.sol",
"chars": 567,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC7674.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC7786.sol",
"chars": 2290,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC7786.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC7802.sol",
"chars": 1487,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC7802.sol)\n\npragma "
},
{
"path": "contracts/interfaces/draft-IERC7821.sol",
"chars": 1758,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC7821.sol)\n\npragma "
},
{
"path": "contracts/metatx/ERC2771Context.sol",
"chars": 3621,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (metatx/ERC2771Context.sol)\n\npragma soli"
},
{
"path": "contracts/metatx/ERC2771Forwarder.sol",
"chars": 17210,
"preview": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (metatx/ERC2771Forwarder.sol)\n\npragma so"
},
{
"path": "contracts/metatx/README.adoc",
"chars": 711,
"preview": "= Meta Transactions\n\n[.readme-notice]\nNOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/ap"
},
{
"path": "contracts/mocks/AccessManagedTarget.sol",
"chars": 1036,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {AccessManaged} from \"../access/manager/AccessManaged."
},
{
"path": "contracts/mocks/AccessManagerMock.sol",
"chars": 528,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {AccessManager} from \"../access/manager/AccessManager."
},
{
"path": "contracts/mocks/ArraysMock.sol",
"chars": 4386,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Arrays} from \"../utils/Arrays.sol\";\n\ncontract Uint256"
},
{
"path": "contracts/mocks/AuthorityMock.sol",
"chars": 1918,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {IAccessManaged} from \"../access/manager/IAccessManage"
},
{
"path": "contracts/mocks/Base64Dirty.sol",
"chars": 399,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Base64} from \"../utils/Base64.sol\";\n\ncontract Base64D"
},
{
"path": "contracts/mocks/BatchCaller.sol",
"chars": 568,
"preview": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Address} from \"../utils/Address.sol\";\n\ncontract BatchC"
},
{
"path": "contracts/mocks/CallReceiverMock.sol",
"chars": 2965,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallReceiverMock {\n event MockFunctionCalled();\n "
},
{
"path": "contracts/mocks/ConstructorMock.sol",
"chars": 929,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract ConstructorMock {\n bool foo;\n\n enum RevertType"
},
{
"path": "contracts/mocks/ContextMock.sol",
"chars": 862,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\ncontract Conte"
},
{
"path": "contracts/mocks/DummyImplementation.sol",
"chars": 1553,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.21;\n\nimport {ERC1967Utils} from \"../proxy/ERC1967/ERC1967Utils.sol"
},
{
"path": "contracts/mocks/EIP712Verifier.sol",
"chars": 632,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.24;\n\nimport {ECDSA} from \"../utils/cryptography/ECDSA.sol\";\nimport"
},
{
"path": "contracts/mocks/ERC1271WalletMock.sol",
"chars": 834,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Ownable} from \"../access/Ownable.sol\";\nimport {IERC12"
},
{
"path": "contracts/mocks/ERC165Mock.sol",
"chars": 3223,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n\n"
},
{
"path": "contracts/mocks/ERC2771ContextMock.sol",
"chars": 1120,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {ContextMock} from \"./ContextMock.sol\";\nimport {Contex"
},
{
"path": "contracts/mocks/ERC3156FlashBorrowerMock.sol",
"chars": 1876,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\nimport {IER"
},
{
"path": "contracts/mocks/EtherReceiverMock.sol",
"chars": 320,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract EtherReceiverMock {\n bool private _acceptEther;\n\n"
},
{
"path": "contracts/mocks/InitializableMock.sol",
"chars": 2955,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Initializable} from \"../proxy/utils/Initializable.sol"
},
{
"path": "contracts/mocks/MerkleProofCustomHashMock.sol",
"chars": 2330,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {MerkleProof} from \"../utils/cryptography/MerkleProof."
},
{
"path": "contracts/mocks/MerkleTreeMock.sol",
"chars": 1635,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {MerkleTree} from \"../utils/structs/MerkleTree.sol\";\n\n"
},
{
"path": "contracts/mocks/MulticallHelper.sol",
"chars": 737,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {ERC20MulticallMock} from \"./token/ERC20MulticallMock."
},
{
"path": "contracts/mocks/MultipleInheritanceInitializableMocks.sol",
"chars": 3881,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Initializable} from \"../proxy/utils/Initializable.sol"
},
{
"path": "contracts/mocks/PausableMock.sol",
"chars": 583,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Pausable} from \"../utils/Pausable.sol\";\n\ncontract Pau"
},
{
"path": "contracts/mocks/ReentrancyAttack.sol",
"chars": 507,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\ncontract Reent"
},
{
"path": "contracts/mocks/ReentrancyMock.sol",
"chars": 1555,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {ReentrancyGuard} from \"../utils/ReentrancyGuard.sol\";"
},
{
"path": "contracts/mocks/ReentrancyTransientMock.sol",
"chars": 1600,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.24;\n\nimport {ReentrancyGuardTransient} from \"../utils/ReentrancyGu"
},
{
"path": "contracts/mocks/RegressionImplementation.sol",
"chars": 1283,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Initializable} from \"../proxy/utils/Initializable.sol"
},
{
"path": "contracts/mocks/SingleInheritanceInitializableMocks.sol",
"chars": 1173,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport {Initializable} from \"../proxy/utils/Initializable.sol"
},
{
"path": "contracts/mocks/Stateless.sol",
"chars": 3397,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\n// We keep these imports and a dummy contract just to we can "
},
{
"path": "contracts/mocks/StorageSlotMock.sol",
"chars": 2682,
"preview": "// SPDX-License-Identifier: MIT\n// This file was procedurally generated from scripts/generate/templates/StorageSlotMock."
},
{
"path": "contracts/mocks/TimelockReentrant.sol",
"chars": 623,
"preview": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Address} from \"../utils/Address.sol\";\n\ncontract Timelo"
},
{
"path": "contracts/mocks/TransientSlotMock.sol",
"chars": 1694,
"preview": "// SPDX-License-Identifier: MIT\n// This file was procedurally generated from scripts/generate/templates/TransientSlotMoc"
},
{
"path": "contracts/mocks/UpgradeableBeaconMock.sol",
"chars": 807,
"preview": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IBeacon} from \"../proxy/beacon/IBeacon.sol\";\n\ncontract"
},
{
"path": "contracts/mocks/VotesExtendedMock.sol",
"chars": 1297,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.24;\n\nimport {VotesExtended} from \"../governance/utils/VotesExtende"
},
{
"path": "contracts/mocks/VotesMock.sol",
"chars": 1249,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.24;\n\nimport {Votes} from \"../governance/utils/Votes.sol\";\n\nabstrac"
},
{
"path": "contracts/mocks/account/AccountMock.sol",
"chars": 7559,
"preview": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.26;\n\nimport {Account} from \"../../account/Account.sol\";\nimport {Ac"
}
]
// ... and 647 more files (download for full content)
About this extraction
This page contains the full source code of the OpenZeppelin/openzeppelin-contracts GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 847 files (5.2 MB), approximately 1.4M tokens, and a symbol index with 502 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.