├── .env.example ├── .gitignore ├── .gitmodules ├── 4naly3er-report.md ├── README.md ├── bot-report.md ├── broadcast └── PrelaunchPoints.s.sol │ └── 11155111 │ ├── run-1710540529.json │ ├── run-1710540542.json │ ├── run-1710540544.json │ └── run-latest.json ├── discord-export ├── Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html ├── Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files │ ├── 0-EB806.png │ ├── 01fe66bc1531b9b6fdd9f09f90bcbd2e-502DF.png │ ├── 045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png │ ├── 0a5b81e8ff98ab58e60348fe5b2f58af-AEB0A.png │ ├── 0b8eb95ae05f7d8b62136d857c324c66-088A8.png │ ├── 0f36a5475c53b3d40679e2bea614f4b0-715EB.png │ ├── 0x-social-card-A8A19.jpg │ ├── 1-B2132.png │ ├── 1083068770823721071-EE4F6.png │ ├── 1221921733343313970-67A62.png │ ├── 1233479995633172584-BBE31.png │ ├── 178dabd907133bbea3b2d27c723cb8c7-134C8.png │ ├── 1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png │ ├── 1f197-BB9F1.svg │ ├── 1f389-5C738.svg │ ├── 1f3c1-445DC.svg │ ├── 1f3c6-621A1.svg │ ├── 1f43a-EB486.svg │ ├── 1f440-6C64D.svg │ ├── 1f44b-8A059.svg │ ├── 1f44d-1f3fb-ED2AA.svg │ ├── 1f44d-1f3fc-EAB0D.svg │ ├── 1f44d-27259.svg │ ├── 1f480-94524.svg │ ├── 1f4af-4CFF5.svg │ ├── 1f4b8-E3468.svg │ ├── 1f4c6-44E30.svg │ ├── 1f4dc-AC641.svg │ ├── 1f50d-195C0.svg │ ├── 1f525-8FE4F.svg │ ├── 1f601-4E9BD.svg │ ├── 1f602-168C5.svg │ ├── 1f604-BF863.svg │ ├── 1f605-42B43.svg │ ├── 1f606-BE94E.svg │ ├── 1f62d-02603.svg │ ├── 1f62f-F0C30.svg │ ├── 1f642-83E8A.svg │ ├── 1f649-4AFB6.svg │ ├── 1f64c-7C820.svg │ ├── 1f64f-22B8D.svg │ ├── 1f6a8-A8AB3.svg │ ├── 1f910-EF6B5.svg │ ├── 1f911-F346C.svg │ ├── 1f918-D4EDF.svg │ ├── 1f923-5854E.svg │ ├── 1f9d1-5BC80.svg │ ├── 1fae1-B19DE.svg │ ├── 1fae3-64122.svg │ ├── 2-ADBB4.png │ ├── 218f5d0995fb0d2950c720df6ebf895c-4019B.png │ ├── 258efb44a5e3f3ccd0db6c4b11462ff2-08900.png │ ├── 2696-15F4A.svg │ ├── 2705-0589F.svg │ ├── 274c-EA1F1.svg │ ├── 2764-A3D25.svg │ ├── 276b6c6135d0ffb29c95a4366a16bf54-4CBDC.png │ ├── 277c35746a6efc1e31ff5f87cd24563c-FAB75.png │ ├── 2a9faff195fe333526cfe6ae6fce1420-49B98.png │ ├── 2b2699f6d9ac3249e20b27eee4a1094c-B4AF0.png │ ├── 2b9111ed71f4fcddef7237dc6d3d145f-6E3E5.png │ ├── 3-FB033.png │ ├── 30efe1cd919bb13e321e625aaebe1765-EF419.png │ ├── 356e7fb4efc19f760e0524ae11c49385-41889.png │ ├── 357510ed1e5265aafb02bc7942ddaa82-01F7E.png │ ├── 38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png │ ├── 3f30ac0da6a33abd185bfea2e6eee89e-05EDC.png │ ├── 4-4551A.png │ ├── 402b68164a51455e395a06ad04fc04b5-D7A38.png │ ├── 4300144ca69d0a514c0680d966674c41-CD85B.png │ ├── 4a2a17744e3ee8a7b65abec8bc524164-2CAEB.png │ ├── 4eaf99d01e4b5042454b4a6a8809687a-B4B63.png │ ├── 5-E9BDB.png │ ├── 52e0e075ef280a5ad933899699a41793-BE2A1.png │ ├── 5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png │ ├── 64dece2e745cb69151368b54011d24fc-4C294.png │ ├── 6678d08791c986738fd9018c9cb8212b-D895F.png │ ├── 67594ee4b4d1fc03bca468327a0d145b-BD76A.png │ ├── 6ad45b567924a4707a438b35b9e74ccd-D91F1.png │ ├── 6e22e8b65ff7478b41cd31dd23221860-0545A.png │ ├── 6f2a3ea61567a15118a40295b419e980-D16C2.png │ ├── 701300a5bdd3bf5640bd1370251533e2-0DC47.png │ ├── 7adb62bd26616b991ac3e0e8987a60a7-CE8BC.png │ ├── 8043f1de89cc1387981f4990ad574c08-78DE7.png │ ├── 816cfc933746a8ffd61a8a93193028c5-41002.png │ ├── 826b4ead4bcad3aab4d17c7b104be4cf-A978B.png │ ├── 851893827027075142-F23DF.png │ ├── 851893827089727568-5FD38.png │ ├── 851893827315826708-F59C0.png │ ├── 89bb6d73275e5d80160cc28ab2354cea-4DB27.png │ ├── 9220a9ff683f654eaf5151b8663e8b53-22007.png │ ├── 93cd04e099447b2dd6674750784ef3f3-A3AD5.png │ ├── 941f1ad9358cf44bc600bfc61f3676b7-D4CBF.png │ ├── 9547c61f37c121beb37e61cee0c642be-BB96A.png │ ├── 970d2e2f00cd7ef2134a1a3f21326349-404EA.png │ ├── 977133670429261884-CA8EA.png │ ├── Screenshot_2024-05-16_at_11.21.05_AM-B3930.png │ ├── Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png │ ├── ac62849a9dbfad8ba63ab7ba65d01721-D6406.png │ ├── adddc7313b30a4e8b5329894bf2034ab-5B4E5.png │ ├── afca0e84e90e7172fdf16a089da1d694-947DB.png │ ├── b3f2b967b0bc6fcce6f518017cffd5d7-4A2C9.png │ ├── b4d7a645168af7ded893be9676d772fb-AC409.png │ ├── be9987c9961dd69a2a92391ca8e066b0-FB276.png │ ├── c9cb30134c634c9e02d0c64df4922803-98E33.png │ ├── cc9f21fe341cb39a7e936e9a8cd086ff-D2A7E.png │ ├── ce33938a6121cd196500c7b573fba65a-15E3D.png │ ├── cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C │ ├── d4881bb27043538c26e7b31a7f8b85d2-5DA7D.png │ ├── d8e05392a6dee96280405f9825554ff7-54BEB.png │ ├── db37a44fec3e7215df0fd640d3fe1e71-83EA5.png │ ├── db9bd8eb8be80a2e24737a46dcfc3b59-AD4C4.png │ ├── dc6e0072c993da12b699bb569417b6d1-25F7D.png │ ├── e62e325ddc1b1e595c6c52bb00b320c7-4CF2E.png │ ├── eab28c7ae4cd4131118e9011baa36f05-B2B8D.png │ ├── ece049bda85fdcdb08ba4595daf9e38a-48509.png │ ├── ed8ca5426b369ee7b42e106702b856d0-031D9.png │ ├── ee41bea48415e2258c18604aa1be6af7-31DE8.png │ ├── efc72d9e28a1eacd5ec86918b3dde6cd-8ED8F.png │ ├── f0d30211d09440164c1c1dc9237c959d-D8BF9.png │ ├── f7110af75e4ab630e47f509ae07920e6-909F7.png │ ├── fa83a21e53b67793e5252e2f7d940789-B0928.png │ ├── fb2b0ed14eeeeeb4914fed72cb845463-6C767.png │ ├── ggsans-italic-400-E988B.woff2 │ ├── ggsans-italic-500-0777F.woff2 │ ├── ggsans-italic-600-CB411.woff2 │ ├── ggsans-italic-700-891AC.woff2 │ ├── ggsans-italic-800-D36B0.woff2 │ ├── ggsans-normal-400-1456D.woff2 │ ├── ggsans-normal-500-89CE5.woff2 │ ├── ggsans-normal-600-C1EA8.woff2 │ ├── ggsans-normal-700-1949A.woff2 │ ├── ggsans-normal-800-58487.woff2 │ ├── highlight.min-D8D27.js │ ├── if-not-now-when-act-now-FA31F.mp4 │ ├── image-5B2FB.png │ ├── image-E69E8.png │ ├── loop_prev_1-918A2.JPG │ ├── loop_prev_2-370FA.JPG │ ├── lottie.min-99657.js │ ├── og-F493A.jpg │ ├── solarized-dark.min-BA98F.css │ └── tracer-A97BB.png ├── Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt └── Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files │ ├── 0x-social-card-A8A19.jpg │ ├── Screenshot_2024-05-16_at_11.21.05_AM-B3930.png │ ├── Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png │ ├── cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C │ ├── if-not-now-when-act-now-FA31F.mp4 │ ├── image-5B2FB.png │ ├── image-E69E8.png │ ├── loop_prev_1-918A2.JPG │ ├── loop_prev_2-370FA.JPG │ ├── og-F493A.jpg │ └── tracer-A97BB.png ├── foundry.toml ├── hardhat.config.ts ├── img └── icon-loop.png ├── lib ├── forge-std │ ├── .gitattributes │ ├── .github │ │ └── workflows │ │ │ ├── ci.yml │ │ │ └── sync.yml │ ├── .gitignore │ ├── .gitmodules │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ ├── foundry.toml │ ├── lib │ │ └── ds-test │ │ │ ├── .github │ │ │ └── workflows │ │ │ │ └── build.yml │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── default.nix │ │ │ ├── demo │ │ │ └── demo.sol │ │ │ ├── package.json │ │ │ └── src │ │ │ ├── test.sol │ │ │ └── test.t.sol │ ├── package.json │ ├── scripts │ │ └── vm.py │ ├── src │ │ ├── Base.sol │ │ ├── Script.sol │ │ ├── StdAssertions.sol │ │ ├── StdChains.sol │ │ ├── StdCheats.sol │ │ ├── StdError.sol │ │ ├── StdInvariant.sol │ │ ├── StdJson.sol │ │ ├── StdMath.sol │ │ ├── StdStorage.sol │ │ ├── StdStyle.sol │ │ ├── StdUtils.sol │ │ ├── Test.sol │ │ ├── Vm.sol │ │ ├── console.sol │ │ ├── console2.sol │ │ ├── interfaces │ │ │ ├── IERC1155.sol │ │ │ ├── IERC165.sol │ │ │ ├── IERC20.sol │ │ │ ├── IERC4626.sol │ │ │ ├── IERC721.sol │ │ │ └── IMulticall3.sol │ │ ├── mocks │ │ │ ├── MockERC20.sol │ │ │ └── MockERC721.sol │ │ └── safeconsole.sol │ └── test │ │ ├── StdAssertions.t.sol │ │ ├── StdChains.t.sol │ │ ├── StdCheats.t.sol │ │ ├── StdError.t.sol │ │ ├── StdMath.t.sol │ │ ├── StdStorage.t.sol │ │ ├── StdStyle.t.sol │ │ ├── StdUtils.t.sol │ │ ├── Vm.t.sol │ │ ├── compilation │ │ ├── CompilationScript.sol │ │ ├── CompilationScriptBase.sol │ │ ├── CompilationTest.sol │ │ └── CompilationTestBase.sol │ │ ├── fixtures │ │ └── broadcast.log.json │ │ └── mocks │ │ ├── MockERC20.t.sol │ │ └── MockERC721.t.sol └── openzeppelin-contracts │ ├── .changeset │ └── config.json │ ├── .codecov.yml │ ├── .editorconfig │ ├── .eslintrc │ ├── .github │ ├── 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 │ │ └── upgradeable.yml │ ├── .gitignore │ ├── .gitmodules │ ├── .mocharc.js │ ├── .prettierrc │ ├── .solcover.js │ ├── CHANGELOG.md │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── GUIDELINES.md │ ├── LICENSE │ ├── README.md │ ├── RELEASING.md │ ├── SECURITY.md │ ├── audits │ ├── 2017-03.md │ ├── 2018-10.pdf │ ├── 2022-10-Checkpoints.pdf │ ├── 2022-10-ERC4626.pdf │ ├── 2023-05-v4.9.pdf │ ├── 2023-10-v5.0.pdf │ └── README.md │ ├── certora │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── diff │ │ └── access_manager_AccessManager.sol.patch │ ├── harnesses │ │ ├── AccessControlDefaultAdminRulesHarness.sol │ │ ├── AccessControlHarness.sol │ │ ├── DoubleEndedQueueHarness.sol │ │ ├── ERC20FlashMintHarness.sol │ │ ├── ERC20PermitHarness.sol │ │ ├── ERC20WrapperHarness.sol │ │ ├── ERC3156FlashBorrowerHarness.sol │ │ ├── ERC721Harness.sol │ │ ├── ERC721ReceiverHarness.sol │ │ ├── EnumerableMapHarness.sol │ │ ├── EnumerableSetHarness.sol │ │ ├── InitializableHarness.sol │ │ ├── Ownable2StepHarness.sol │ │ ├── OwnableHarness.sol │ │ ├── PausableHarness.sol │ │ └── TimelockControllerHarness.sol │ ├── reports │ │ ├── 2021-10.pdf │ │ ├── 2022-03.pdf │ │ └── 2022-05.pdf │ ├── run.js │ ├── specs.json │ └── specs │ │ ├── AccessControl.spec │ │ ├── AccessControlDefaultAdminRules.spec │ │ ├── DoubleEndedQueue.spec │ │ ├── ERC20.spec │ │ ├── ERC20FlashMint.spec │ │ ├── ERC20Wrapper.spec │ │ ├── ERC721.spec │ │ ├── EnumerableMap.spec │ │ ├── EnumerableSet.spec │ │ ├── Initializable.spec │ │ ├── Ownable.spec │ │ ├── Ownable2Step.spec │ │ ├── Pausable.spec │ │ ├── TimelockController.spec │ │ ├── helpers │ │ └── helpers.spec │ │ └── methods │ │ ├── IAccessControl.spec │ │ ├── IAccessControlDefaultAdminRules.spec │ │ ├── IERC20.spec │ │ ├── IERC2612.spec │ │ ├── IERC3156FlashBorrower.spec │ │ ├── IERC3156FlashLender.spec │ │ ├── IERC5313.spec │ │ ├── IERC721.spec │ │ ├── IERC721Receiver.spec │ │ ├── IOwnable.spec │ │ └── IOwnable2Step.spec │ ├── 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 │ ├── finance │ │ ├── README.adoc │ │ └── VestingWallet.sol │ ├── governance │ │ ├── Governor.sol │ │ ├── IGovernor.sol │ │ ├── README.adoc │ │ ├── TimelockController.sol │ │ ├── extensions │ │ │ ├── GovernorCountingSimple.sol │ │ │ ├── GovernorPreventLateQuorum.sol │ │ │ ├── GovernorSettings.sol │ │ │ ├── GovernorStorage.sol │ │ │ ├── GovernorTimelockAccess.sol │ │ │ ├── GovernorTimelockCompound.sol │ │ │ ├── GovernorTimelockControl.sol │ │ │ ├── GovernorVotes.sol │ │ │ └── GovernorVotesQuorumFraction.sol │ │ └── utils │ │ │ ├── IVotes.sol │ │ │ └── Votes.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 │ │ ├── IERC721.sol │ │ ├── IERC721Enumerable.sol │ │ ├── IERC721Metadata.sol │ │ ├── IERC721Receiver.sol │ │ ├── IERC777.sol │ │ ├── IERC777Recipient.sol │ │ ├── IERC777Sender.sol │ │ ├── README.adoc │ │ ├── draft-IERC1822.sol │ │ └── draft-IERC6093.sol │ ├── metatx │ │ ├── ERC2771Context.sol │ │ ├── ERC2771Forwarder.sol │ │ └── README.adoc │ ├── mocks │ │ ├── AccessManagedTarget.sol │ │ ├── ArraysMock.sol │ │ ├── AuthorityMock.sol │ │ ├── Base64Dirty.sol │ │ ├── CallReceiverMock.sol │ │ ├── ContextMock.sol │ │ ├── DummyImplementation.sol │ │ ├── EIP712Verifier.sol │ │ ├── ERC1271WalletMock.sol │ │ ├── ERC165 │ │ │ ├── ERC165InterfacesSupported.sol │ │ │ ├── ERC165MaliciousData.sol │ │ │ ├── ERC165MissingData.sol │ │ │ ├── ERC165NotSupported.sol │ │ │ └── ERC165ReturnBomb.sol │ │ ├── ERC2771ContextMock.sol │ │ ├── ERC3156FlashBorrowerMock.sol │ │ ├── EtherReceiverMock.sol │ │ ├── InitializableMock.sol │ │ ├── MulticallTest.sol │ │ ├── MultipleInheritanceInitializableMocks.sol │ │ ├── PausableMock.sol │ │ ├── ReentrancyAttack.sol │ │ ├── ReentrancyMock.sol │ │ ├── RegressionImplementation.sol │ │ ├── SingleInheritanceInitializableMocks.sol │ │ ├── Stateless.sol │ │ ├── StorageSlotMock.sol │ │ ├── TimelockReentrant.sol │ │ ├── UpgradeableBeaconMock.sol │ │ ├── VotesMock.sol │ │ ├── compound │ │ │ └── CompTimelock.sol │ │ ├── governance │ │ │ ├── GovernorMock.sol │ │ │ ├── GovernorPreventLateQuorumMock.sol │ │ │ ├── GovernorStorageMock.sol │ │ │ ├── GovernorTimelockAccessMock.sol │ │ │ ├── GovernorTimelockCompoundMock.sol │ │ │ ├── GovernorTimelockControlMock.sol │ │ │ ├── GovernorVoteMock.sol │ │ │ └── GovernorWithParamsMock.sol │ │ ├── proxy │ │ │ ├── BadBeacon.sol │ │ │ ├── ClashingImplementation.sol │ │ │ └── UUPSUpgradeableMock.sol │ │ └── token │ │ │ ├── ERC1155ReceiverMock.sol │ │ │ ├── ERC20ApprovalMock.sol │ │ │ ├── ERC20DecimalsMock.sol │ │ │ ├── ERC20ExcessDecimalsMock.sol │ │ │ ├── ERC20FlashMintMock.sol │ │ │ ├── ERC20ForceApproveMock.sol │ │ │ ├── ERC20Mock.sol │ │ │ ├── ERC20MulticallMock.sol │ │ │ ├── ERC20NoReturnMock.sol │ │ │ ├── ERC20Reentrant.sol │ │ │ ├── ERC20ReturnFalseMock.sol │ │ │ ├── ERC20VotesLegacyMock.sol │ │ │ ├── ERC4626LimitsMock.sol │ │ │ ├── ERC4626Mock.sol │ │ │ ├── ERC4626OffsetMock.sol │ │ │ ├── ERC4646FeesMock.sol │ │ │ ├── ERC721ConsecutiveEnumerableMock.sol │ │ │ ├── ERC721ConsecutiveMock.sol │ │ │ ├── ERC721ReceiverMock.sol │ │ │ ├── ERC721URIStorageMock.sol │ │ │ └── VotesTimestamp.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 │ │ │ │ ├── ERC1155Pausable.sol │ │ │ │ ├── ERC1155Supply.sol │ │ │ │ ├── ERC1155URIStorage.sol │ │ │ │ └── IERC1155MetadataURI.sol │ │ │ └── utils │ │ │ │ └── ERC1155Holder.sol │ │ ├── ERC20 │ │ │ ├── ERC20.sol │ │ │ ├── IERC20.sol │ │ │ ├── README.adoc │ │ │ ├── extensions │ │ │ │ ├── ERC20Burnable.sol │ │ │ │ ├── ERC20Capped.sol │ │ │ │ ├── ERC20FlashMint.sol │ │ │ │ ├── ERC20Pausable.sol │ │ │ │ ├── ERC20Permit.sol │ │ │ │ ├── ERC20Votes.sol │ │ │ │ ├── ERC20Wrapper.sol │ │ │ │ ├── ERC4626.sol │ │ │ │ ├── IERC20Metadata.sol │ │ │ │ └── IERC20Permit.sol │ │ │ └── utils │ │ │ │ └── SafeERC20.sol │ │ ├── ERC721 │ │ │ ├── ERC721.sol │ │ │ ├── IERC721.sol │ │ │ ├── IERC721Receiver.sol │ │ │ ├── README.adoc │ │ │ ├── extensions │ │ │ │ ├── ERC721Burnable.sol │ │ │ │ ├── ERC721Consecutive.sol │ │ │ │ ├── ERC721Enumerable.sol │ │ │ │ ├── ERC721Pausable.sol │ │ │ │ ├── ERC721Royalty.sol │ │ │ │ ├── ERC721URIStorage.sol │ │ │ │ ├── ERC721Votes.sol │ │ │ │ ├── ERC721Wrapper.sol │ │ │ │ ├── IERC721Enumerable.sol │ │ │ │ └── IERC721Metadata.sol │ │ │ └── utils │ │ │ │ └── ERC721Holder.sol │ │ └── common │ │ │ ├── ERC2981.sol │ │ │ └── README.adoc │ ├── utils │ │ ├── Address.sol │ │ ├── Arrays.sol │ │ ├── Base64.sol │ │ ├── Context.sol │ │ ├── Create2.sol │ │ ├── Multicall.sol │ │ ├── Nonces.sol │ │ ├── Pausable.sol │ │ ├── README.adoc │ │ ├── ReentrancyGuard.sol │ │ ├── ShortStrings.sol │ │ ├── StorageSlot.sol │ │ ├── Strings.sol │ │ ├── cryptography │ │ │ ├── ECDSA.sol │ │ │ ├── EIP712.sol │ │ │ ├── MerkleProof.sol │ │ │ ├── MessageHashUtils.sol │ │ │ └── SignatureChecker.sol │ │ ├── introspection │ │ │ ├── ERC165.sol │ │ │ ├── ERC165Checker.sol │ │ │ └── IERC165.sol │ │ ├── math │ │ │ ├── Math.sol │ │ │ ├── SafeCast.sol │ │ │ └── SignedMath.sol │ │ ├── structs │ │ │ ├── BitMaps.sol │ │ │ ├── Checkpoints.sol │ │ │ ├── DoubleEndedQueue.sol │ │ │ ├── EnumerableMap.sol │ │ │ └── EnumerableSet.sol │ │ └── types │ │ │ └── Time.sol │ └── vendor │ │ └── compound │ │ ├── ICompoundTimelock.sol │ │ └── LICENSE │ ├── foundry.toml │ ├── hardhat.config.js │ ├── hardhat │ ├── env-artifacts.js │ ├── env-contract.js │ ├── ignore-unreachable-warnings.js │ ├── skip-foundry-tests.js │ └── task-test-get-files.js │ ├── lib │ ├── erc4626-tests │ │ ├── ERC4626.prop.sol │ │ ├── ERC4626.test.sol │ │ ├── LICENSE │ │ └── README.md │ └── forge-std │ │ ├── .github │ │ └── workflows │ │ │ └── ci.yml │ │ ├── .gitignore │ │ ├── .gitmodules │ │ ├── LICENSE-APACHE │ │ ├── LICENSE-MIT │ │ ├── README.md │ │ ├── foundry.toml │ │ ├── lib │ │ └── ds-test │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── default.nix │ │ │ ├── demo │ │ │ └── demo.sol │ │ │ ├── package.json │ │ │ └── src │ │ │ └── test.sol │ │ ├── package.json │ │ ├── src │ │ ├── Base.sol │ │ ├── Script.sol │ │ ├── StdAssertions.sol │ │ ├── StdChains.sol │ │ ├── StdCheats.sol │ │ ├── StdError.sol │ │ ├── StdJson.sol │ │ ├── StdMath.sol │ │ ├── StdStorage.sol │ │ ├── StdUtils.sol │ │ ├── Test.sol │ │ ├── Vm.sol │ │ ├── console.sol │ │ ├── console2.sol │ │ └── interfaces │ │ │ ├── IERC1155.sol │ │ │ ├── IERC165.sol │ │ │ ├── IERC20.sol │ │ │ ├── IERC4626.sol │ │ │ └── IERC721.sol │ │ └── test │ │ ├── StdAssertions.t.sol │ │ ├── StdChains.t.sol │ │ ├── StdCheats.t.sol │ │ ├── StdError.t.sol │ │ ├── StdMath.t.sol │ │ ├── StdStorage.t.sol │ │ ├── StdUtils.t.sol │ │ ├── compilation │ │ ├── CompilationScript.sol │ │ ├── CompilationScriptBase.sol │ │ ├── CompilationTest.sol │ │ └── CompilationTestBase.sol │ │ └── fixtures │ │ └── broadcast.log.json │ ├── logo.svg │ ├── netlify.toml │ ├── package-lock.json │ ├── package.json │ ├── remappings.txt │ ├── renovate.json │ ├── requirements.txt │ ├── scripts │ ├── checks │ │ ├── compare-layout.js │ │ ├── compareGasReports.js │ │ ├── extract-layout.js │ │ ├── generation.sh │ │ └── inheritance-ordering.js │ ├── gen-nav.js │ ├── generate │ │ ├── format-lines.js │ │ ├── run.js │ │ └── templates │ │ │ ├── Checkpoints.js │ │ │ ├── Checkpoints.opts.js │ │ │ ├── Checkpoints.t.js │ │ │ ├── EnumerableMap.js │ │ │ ├── EnumerableSet.js │ │ │ ├── SafeCast.js │ │ │ ├── StorageSlot.js │ │ │ └── conversion.js │ ├── git-user-config.sh │ ├── helpers.js │ ├── prepack.sh │ ├── prepare-docs.sh │ ├── release │ │ ├── format-changelog.js │ │ ├── synchronize-versions.js │ │ ├── update-comment.js │ │ ├── version.sh │ │ └── workflow │ │ │ ├── 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 │ ├── solhint-custom │ │ ├── index.js │ │ └── package.json │ ├── update-docs-branch.js │ └── upgradeable │ │ ├── README.md │ │ ├── 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.test.js │ │ └── AuthorityUtils.test.js │ ├── finance │ ├── VestingWallet.behavior.js │ └── VestingWallet.test.js │ ├── governance │ ├── Governor.t.sol │ ├── Governor.test.js │ ├── TimelockController.test.js │ ├── extensions │ │ ├── GovernorERC721.test.js │ │ ├── GovernorPreventLateQuorum.test.js │ │ ├── GovernorStorage.test.js │ │ ├── GovernorTimelockAccess.test.js │ │ ├── GovernorTimelockCompound.test.js │ │ ├── GovernorTimelockControl.test.js │ │ ├── GovernorVotesQuorumFraction.test.js │ │ └── GovernorWithParams.test.js │ └── utils │ │ ├── EIP6372.behavior.js │ │ ├── Votes.behavior.js │ │ └── Votes.test.js │ ├── helpers │ ├── access-manager.js │ ├── account.js │ ├── chainid.js │ ├── constants.js │ ├── create.js │ ├── customError.js │ ├── eip712.js │ ├── enums.js │ ├── erc1967.js │ ├── governance.js │ ├── iterate.js │ ├── math.js │ ├── methods.js │ ├── sign.js │ ├── time.js │ └── txpool.js │ ├── metatx │ ├── ERC2771Context.test.js │ ├── ERC2771Forwarder.t.sol │ └── ERC2771Forwarder.test.js │ ├── proxy │ ├── Clones.behaviour.js │ ├── 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 │ ├── token │ ├── ERC1155 │ │ ├── ERC1155.behavior.js │ │ ├── ERC1155.test.js │ │ ├── extensions │ │ │ ├── ERC1155Burnable.test.js │ │ │ ├── ERC1155Pausable.test.js │ │ │ ├── ERC1155Supply.test.js │ │ │ └── ERC1155URIStorage.test.js │ │ └── utils │ │ │ └── ERC1155Holder.test.js │ ├── ERC20 │ │ ├── ERC20.behavior.js │ │ ├── ERC20.test.js │ │ ├── extensions │ │ │ ├── ERC20Burnable.behavior.js │ │ │ ├── ERC20Burnable.test.js │ │ │ ├── ERC20Capped.behavior.js │ │ │ ├── ERC20Capped.test.js │ │ │ ├── ERC20FlashMint.test.js │ │ │ ├── ERC20Pausable.test.js │ │ │ ├── ERC20Permit.test.js │ │ │ ├── ERC20Votes.test.js │ │ │ ├── ERC20Wrapper.test.js │ │ │ ├── ERC4626.t.sol │ │ │ └── ERC4626.test.js │ │ └── utils │ │ │ └── SafeERC20.test.js │ ├── ERC721 │ │ ├── ERC721.behavior.js │ │ ├── ERC721.test.js │ │ ├── ERC721Enumerable.test.js │ │ ├── extensions │ │ │ ├── ERC721Burnable.test.js │ │ │ ├── ERC721Consecutive.t.sol │ │ │ ├── ERC721Consecutive.test.js │ │ │ ├── ERC721Pausable.test.js │ │ │ ├── ERC721Royalty.test.js │ │ │ ├── ERC721URIStorage.test.js │ │ │ ├── ERC721Votes.test.js │ │ │ └── ERC721Wrapper.test.js │ │ └── utils │ │ │ └── ERC721Holder.test.js │ └── common │ │ └── ERC2981.behavior.js │ └── utils │ ├── Address.test.js │ ├── Arrays.test.js │ ├── Base64.test.js │ ├── Context.behavior.js │ ├── Context.test.js │ ├── Create2.test.js │ ├── Multicall.test.js │ ├── Nonces.test.js │ ├── Pausable.test.js │ ├── ReentrancyGuard.test.js │ ├── ShortStrings.t.sol │ ├── ShortStrings.test.js │ ├── StorageSlot.test.js │ ├── Strings.test.js │ ├── cryptography │ ├── ECDSA.test.js │ ├── EIP712.test.js │ ├── MerkleProof.test.js │ ├── MessageHashUtils.test.js │ └── SignatureChecker.test.js │ ├── introspection │ ├── ERC165.test.js │ ├── ERC165Checker.test.js │ └── SupportsInterface.behavior.js │ ├── math │ ├── Math.t.sol │ ├── Math.test.js │ ├── SafeCast.test.js │ └── SignedMath.test.js │ ├── structs │ ├── BitMap.test.js │ ├── Checkpoints.t.sol │ ├── Checkpoints.test.js │ ├── DoubleEndedQueue.test.js │ ├── EnumerableMap.behavior.js │ ├── EnumerableMap.test.js │ ├── EnumerableSet.behavior.js │ └── EnumerableSet.test.js │ └── types │ └── Time.test.js ├── out_of_scope.txt ├── package.json ├── remappings.txt ├── scope.txt ├── screenshot_1.png ├── screenshot_2.JPG ├── screenshot_2.png ├── screenshot_3.JPG ├── screenshot_3.png ├── screenshot_4.JPG ├── screenshot_4.png ├── script └── PrelaunchPoints.s.sol ├── src ├── PrelaunchPoints.sol ├── interfaces │ ├── ILpETH.sol │ ├── ILpETHVault.sol │ └── IWETH.sol └── mock │ ├── AttackContract.sol │ ├── MockERC20.sol │ ├── MockLRT.sol │ ├── MockLpETH.sol │ └── MockLpETHVault.sol ├── test ├── PrelaunchPoints.t.sol └── PrelaunchPoints0x.test.ts ├── tsconfig.json └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | RPC_URL= 2 | ETHERSCAN_API_KEY= 3 | PRIVATE_KEY= 4 | ZEROX_API_KEY= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiler files 2 | cache/ 3 | out/ 4 | 5 | # Ignores development broadcast logs 6 | !/broadcast 7 | /broadcast/*/31337/ 8 | /broadcast/**/dry-run/ 9 | 10 | # Docs 11 | docs/ 12 | 13 | # Dotenv file 14 | .env 15 | 16 | # Workspace VSCode 17 | .vscode 18 | 19 | # Libs 20 | node_modules 21 | 22 | # Hardhat 23 | cache_hardhat 24 | artifacts 25 | typechain 26 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/forge-std"] 2 | path = lib/forge-std 3 | url = https://github.com/foundry-rs/forge-std 4 | [submodule "lib/openzeppelin-contracts"] 5 | path = lib/openzeppelin-contracts 6 | url = https://github.com/OpenZeppelin/openzeppelin-contracts 7 | -------------------------------------------------------------------------------- /bot-report.md: -------------------------------------------------------------------------------- 1 | # Nothing to see here… *yet* 2 | 3 | If you're seeing this text, it's because the winning bot report has not yet been selected. 4 | 5 | This placeholder file will be replaced with the [automated findings report](https://docs.code4rena.com/roles/wardens/submission-policy#automated-findings-considered-known-issues) as soon as the bot race for this audit has been judged -- typically it's posted 24 hours or less after the audit starts. 6 | 7 | ## More info 8 | 9 | - [What's an automated findings report?]([url](https://docs.code4rena.com/roles/wardens/submission-policy#automated-findings-considered-known-issues)https://docs.code4rena.com/roles/wardens/submission-policy#automated-findings-considered-known-issues) 10 | - [What's a bot race? ]([url](https://code4rena.com/register/bot)https://code4rena.com/register/bot) 11 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0-EB806.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0-EB806.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/01fe66bc1531b9b6fdd9f09f90bcbd2e-502DF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/01fe66bc1531b9b6fdd9f09f90bcbd2e-502DF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0a5b81e8ff98ab58e60348fe5b2f58af-AEB0A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0a5b81e8ff98ab58e60348fe5b2f58af-AEB0A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0b8eb95ae05f7d8b62136d857c324c66-088A8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0b8eb95ae05f7d8b62136d857c324c66-088A8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0f36a5475c53b3d40679e2bea614f4b0-715EB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0f36a5475c53b3d40679e2bea614f4b0-715EB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0x-social-card-A8A19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/0x-social-card-A8A19.jpg -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1-B2132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1-B2132.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1083068770823721071-EE4F6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1083068770823721071-EE4F6.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1221921733343313970-67A62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1221921733343313970-67A62.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1233479995633172584-BBE31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1233479995633172584-BBE31.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/178dabd907133bbea3b2d27c723cb8c7-134C8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/178dabd907133bbea3b2d27c723cb8c7-134C8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f197-BB9F1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f440-6C64D.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f480-94524.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f4dc-AC641.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f50d-195C0.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f525-8FE4F.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f604-BF863.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f605-42B43.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f606-BE94E.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f62f-F0C30.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f642-83E8A.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f6a8-A8AB3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/1f910-EF6B5.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2-ADBB4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2-ADBB4.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/218f5d0995fb0d2950c720df6ebf895c-4019B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/218f5d0995fb0d2950c720df6ebf895c-4019B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/258efb44a5e3f3ccd0db6c4b11462ff2-08900.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/258efb44a5e3f3ccd0db6c4b11462ff2-08900.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2705-0589F.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/274c-EA1F1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2764-A3D25.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/276b6c6135d0ffb29c95a4366a16bf54-4CBDC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/276b6c6135d0ffb29c95a4366a16bf54-4CBDC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/277c35746a6efc1e31ff5f87cd24563c-FAB75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/277c35746a6efc1e31ff5f87cd24563c-FAB75.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2a9faff195fe333526cfe6ae6fce1420-49B98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2a9faff195fe333526cfe6ae6fce1420-49B98.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2b2699f6d9ac3249e20b27eee4a1094c-B4AF0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2b2699f6d9ac3249e20b27eee4a1094c-B4AF0.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2b9111ed71f4fcddef7237dc6d3d145f-6E3E5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/2b9111ed71f4fcddef7237dc6d3d145f-6E3E5.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/3-FB033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/3-FB033.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/30efe1cd919bb13e321e625aaebe1765-EF419.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/30efe1cd919bb13e321e625aaebe1765-EF419.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/356e7fb4efc19f760e0524ae11c49385-41889.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/356e7fb4efc19f760e0524ae11c49385-41889.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/357510ed1e5265aafb02bc7942ddaa82-01F7E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/357510ed1e5265aafb02bc7942ddaa82-01F7E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/3f30ac0da6a33abd185bfea2e6eee89e-05EDC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/3f30ac0da6a33abd185bfea2e6eee89e-05EDC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4-4551A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4-4551A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/402b68164a51455e395a06ad04fc04b5-D7A38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/402b68164a51455e395a06ad04fc04b5-D7A38.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4300144ca69d0a514c0680d966674c41-CD85B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4300144ca69d0a514c0680d966674c41-CD85B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4a2a17744e3ee8a7b65abec8bc524164-2CAEB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4a2a17744e3ee8a7b65abec8bc524164-2CAEB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4eaf99d01e4b5042454b4a6a8809687a-B4B63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/4eaf99d01e4b5042454b4a6a8809687a-B4B63.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/5-E9BDB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/5-E9BDB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/52e0e075ef280a5ad933899699a41793-BE2A1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/52e0e075ef280a5ad933899699a41793-BE2A1.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/64dece2e745cb69151368b54011d24fc-4C294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/64dece2e745cb69151368b54011d24fc-4C294.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6678d08791c986738fd9018c9cb8212b-D895F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6678d08791c986738fd9018c9cb8212b-D895F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/67594ee4b4d1fc03bca468327a0d145b-BD76A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/67594ee4b4d1fc03bca468327a0d145b-BD76A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6ad45b567924a4707a438b35b9e74ccd-D91F1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6ad45b567924a4707a438b35b9e74ccd-D91F1.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6e22e8b65ff7478b41cd31dd23221860-0545A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6e22e8b65ff7478b41cd31dd23221860-0545A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6f2a3ea61567a15118a40295b419e980-D16C2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/6f2a3ea61567a15118a40295b419e980-D16C2.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/701300a5bdd3bf5640bd1370251533e2-0DC47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/701300a5bdd3bf5640bd1370251533e2-0DC47.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/7adb62bd26616b991ac3e0e8987a60a7-CE8BC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/7adb62bd26616b991ac3e0e8987a60a7-CE8BC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/8043f1de89cc1387981f4990ad574c08-78DE7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/8043f1de89cc1387981f4990ad574c08-78DE7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/816cfc933746a8ffd61a8a93193028c5-41002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/816cfc933746a8ffd61a8a93193028c5-41002.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/826b4ead4bcad3aab4d17c7b104be4cf-A978B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/826b4ead4bcad3aab4d17c7b104be4cf-A978B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827027075142-F23DF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827027075142-F23DF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827089727568-5FD38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827089727568-5FD38.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827315826708-F59C0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/851893827315826708-F59C0.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/89bb6d73275e5d80160cc28ab2354cea-4DB27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/89bb6d73275e5d80160cc28ab2354cea-4DB27.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/9220a9ff683f654eaf5151b8663e8b53-22007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/9220a9ff683f654eaf5151b8663e8b53-22007.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/93cd04e099447b2dd6674750784ef3f3-A3AD5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/93cd04e099447b2dd6674750784ef3f3-A3AD5.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/941f1ad9358cf44bc600bfc61f3676b7-D4CBF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/941f1ad9358cf44bc600bfc61f3676b7-D4CBF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/9547c61f37c121beb37e61cee0c642be-BB96A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/9547c61f37c121beb37e61cee0c642be-BB96A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/970d2e2f00cd7ef2134a1a3f21326349-404EA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/970d2e2f00cd7ef2134a1a3f21326349-404EA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/977133670429261884-CA8EA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/977133670429261884-CA8EA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/Screenshot_2024-05-16_at_11.21.05_AM-B3930.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/Screenshot_2024-05-16_at_11.21.05_AM-B3930.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ac62849a9dbfad8ba63ab7ba65d01721-D6406.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ac62849a9dbfad8ba63ab7ba65d01721-D6406.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/adddc7313b30a4e8b5329894bf2034ab-5B4E5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/adddc7313b30a4e8b5329894bf2034ab-5B4E5.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/afca0e84e90e7172fdf16a089da1d694-947DB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/afca0e84e90e7172fdf16a089da1d694-947DB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/b3f2b967b0bc6fcce6f518017cffd5d7-4A2C9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/b3f2b967b0bc6fcce6f518017cffd5d7-4A2C9.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/b4d7a645168af7ded893be9676d772fb-AC409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/b4d7a645168af7ded893be9676d772fb-AC409.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/be9987c9961dd69a2a92391ca8e066b0-FB276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/be9987c9961dd69a2a92391ca8e066b0-FB276.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/c9cb30134c634c9e02d0c64df4922803-98E33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/c9cb30134c634c9e02d0c64df4922803-98E33.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/cc9f21fe341cb39a7e936e9a8cd086ff-D2A7E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/cc9f21fe341cb39a7e936e9a8cd086ff-D2A7E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ce33938a6121cd196500c7b573fba65a-15E3D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ce33938a6121cd196500c7b573fba65a-15E3D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/d4881bb27043538c26e7b31a7f8b85d2-5DA7D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/d4881bb27043538c26e7b31a7f8b85d2-5DA7D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/d8e05392a6dee96280405f9825554ff7-54BEB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/d8e05392a6dee96280405f9825554ff7-54BEB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/db37a44fec3e7215df0fd640d3fe1e71-83EA5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/db37a44fec3e7215df0fd640d3fe1e71-83EA5.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/db9bd8eb8be80a2e24737a46dcfc3b59-AD4C4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/db9bd8eb8be80a2e24737a46dcfc3b59-AD4C4.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/dc6e0072c993da12b699bb569417b6d1-25F7D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/dc6e0072c993da12b699bb569417b6d1-25F7D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/e62e325ddc1b1e595c6c52bb00b320c7-4CF2E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/e62e325ddc1b1e595c6c52bb00b320c7-4CF2E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/eab28c7ae4cd4131118e9011baa36f05-B2B8D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/eab28c7ae4cd4131118e9011baa36f05-B2B8D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ece049bda85fdcdb08ba4595daf9e38a-48509.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ece049bda85fdcdb08ba4595daf9e38a-48509.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ed8ca5426b369ee7b42e106702b856d0-031D9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ed8ca5426b369ee7b42e106702b856d0-031D9.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ee41bea48415e2258c18604aa1be6af7-31DE8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ee41bea48415e2258c18604aa1be6af7-31DE8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/efc72d9e28a1eacd5ec86918b3dde6cd-8ED8F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/efc72d9e28a1eacd5ec86918b3dde6cd-8ED8F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/f0d30211d09440164c1c1dc9237c959d-D8BF9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/f0d30211d09440164c1c1dc9237c959d-D8BF9.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/f7110af75e4ab630e47f509ae07920e6-909F7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/f7110af75e4ab630e47f509ae07920e6-909F7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/fa83a21e53b67793e5252e2f7d940789-B0928.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/fa83a21e53b67793e5252e2f7d940789-B0928.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/fb2b0ed14eeeeeb4914fed72cb845463-6C767.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/fb2b0ed14eeeeeb4914fed72cb845463-6C767.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-400-E988B.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-400-E988B.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-500-0777F.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-500-0777F.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-600-CB411.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-600-CB411.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-700-891AC.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-700-891AC.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-800-D36B0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-italic-800-D36B0.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-400-1456D.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-400-1456D.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-500-89CE5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-500-89CE5.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-600-C1EA8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-600-C1EA8.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-700-1949A.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-700-1949A.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-800-58487.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/ggsans-normal-800-58487.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/if-not-now-when-act-now-FA31F.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/if-not-now-when-act-now-FA31F.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/image-5B2FB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/image-5B2FB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/image-E69E8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/image-E69E8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/loop_prev_1-918A2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/loop_prev_1-918A2.JPG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/loop_prev_2-370FA.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/loop_prev_2-370FA.JPG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/og-F493A.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/og-F493A.jpg -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/solarized-dark.min-BA98F.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-keyword,.hljs-selector-tag,.hljs-addition{color:#859900}.hljs-number,.hljs-string,.hljs-meta .hljs-meta-string,.hljs-literal,.hljs-doctag,.hljs-regexp{color:#2aa198}.hljs-title,.hljs-section,.hljs-name,.hljs-selector-id,.hljs-selector-class{color:#268bd2}.hljs-attribute,.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-class .hljs-title,.hljs-type{color:#b58900}.hljs-symbol,.hljs-bullet,.hljs-subst,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-link{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/tracer-A97BB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].html_Files/tracer-A97BB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/0x-social-card-A8A19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/0x-social-card-A8A19.jpg -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/Screenshot_2024-05-16_at_11.21.05_AM-B3930.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/Screenshot_2024-05-16_at_11.21.05_AM-B3930.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/Screenshot_2024-06-19_at_11.20.50_AM-44DB7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/cf95abe2-acee-4af0-a162-aad606d6ee45-16C5C -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/if-not-now-when-act-now-FA31F.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/if-not-now-when-act-now-FA31F.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/image-5B2FB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/image-5B2FB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/image-E69E8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/image-E69E8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/loop_prev_1-918A2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/loop_prev_1-918A2.JPG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/loop_prev_2-370FA.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/loop_prev_2-370FA.JPG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/og-F493A.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/og-F493A.jpg -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/tracer-A97BB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/discord-export/Code4rena - ARCHIVE-Q2-2024 - loop-may01 [1234489629848240161].txt_Files/tracer-A97BB.png -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = "src" 3 | out = "out" 4 | libs = ["lib"] 5 | # Compilation 6 | solc_version = "0.8.20" 7 | optimizer = true 8 | optimizer_runs = 100 9 | 10 | # See more config options https://github.com/foundry-rs/foundry/tree/master/config 11 | -------------------------------------------------------------------------------- /hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import { HardhatUserConfig } from "hardhat/config" 2 | import "@nomicfoundation/hardhat-ethers" 3 | import "@nomicfoundation/hardhat-toolbox" 4 | import "@nomicfoundation/hardhat-foundry" 5 | import "hardhat-tracer" 6 | 7 | import "dotenv/config" 8 | 9 | const RPC_URL = process.env.RPC_URL || "https://ethereum-rpc.publicnode.com" 10 | 11 | const config: HardhatUserConfig = { 12 | solidity: "0.8.20", 13 | networks: { 14 | hardhat: { 15 | forking: { 16 | url: RPC_URL, 17 | }, 18 | }, 19 | }, 20 | 21 | typechain: { 22 | outDir: "typechain", 23 | target: "ethers-v6", 24 | }, 25 | } 26 | 27 | export default config 28 | -------------------------------------------------------------------------------- /img/icon-loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/img/icon-loop.png -------------------------------------------------------------------------------- /lib/forge-std/.gitattributes: -------------------------------------------------------------------------------- 1 | src/Vm.sol linguist-generated 2 | -------------------------------------------------------------------------------- /lib/forge-std/.github/workflows/sync.yml: -------------------------------------------------------------------------------- 1 | name: Sync Release Branch 2 | 3 | on: 4 | release: 5 | types: 6 | - created 7 | 8 | jobs: 9 | sync-release-branch: 10 | runs-on: ubuntu-latest 11 | if: startsWith(github.event.release.tag_name, 'v1') 12 | steps: 13 | - name: Check out the repo 14 | uses: actions/checkout@v3 15 | with: 16 | fetch-depth: 0 17 | ref: v1 18 | 19 | - name: Configure Git 20 | run: | 21 | git config user.name github-actions[bot] 22 | git config user.email 41898282+github-actions[bot]@users.noreply.github.com 23 | 24 | - name: Sync Release Branch 25 | run: | 26 | git fetch --tags 27 | git checkout v1 28 | git reset --hard ${GITHUB_REF} 29 | git push --force 30 | -------------------------------------------------------------------------------- /lib/forge-std/.gitignore: -------------------------------------------------------------------------------- 1 | cache/ 2 | out/ 3 | .vscode 4 | .idea 5 | -------------------------------------------------------------------------------- /lib/forge-std/.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/ds-test"] 2 | path = lib/ds-test 3 | url = https://github.com/dapphub/ds-test 4 | -------------------------------------------------------------------------------- /lib/forge-std/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright Contributors to Forge Standard Library 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE.R 26 | -------------------------------------------------------------------------------- /lib/forge-std/foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | fs_permissions = [{ access = "read-write", path = "./"}] 3 | 4 | [rpc_endpoints] 5 | # The RPC URLs are modified versions of the default for testing initialization. 6 | mainnet = "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3" # Different API key. 7 | optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash. 8 | arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash. 9 | needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" 10 | 11 | [fmt] 12 | # These are all the `forge fmt` defaults. 13 | line_length = 120 14 | tab_width = 4 15 | bracket_spacing = false 16 | int_types = 'long' 17 | multiline_func_header = 'attributes_first' 18 | quote_style = 'double' 19 | number_underscore = 'preserve' 20 | single_line_statement_blocks = 'preserve' 21 | ignore = ["src/console.sol", "src/console2.sol"] -------------------------------------------------------------------------------- /lib/forge-std/lib/ds-test/.gitignore: -------------------------------------------------------------------------------- 1 | /.dapple 2 | /build 3 | /out 4 | /cache/ 5 | -------------------------------------------------------------------------------- /lib/forge-std/lib/ds-test/Makefile: -------------------------------------------------------------------------------- 1 | all:; dapp build 2 | 3 | test: 4 | -dapp --use solc:0.4.23 build 5 | -dapp --use solc:0.4.26 build 6 | -dapp --use solc:0.5.17 build 7 | -dapp --use solc:0.6.12 build 8 | -dapp --use solc:0.7.5 build 9 | 10 | demo: 11 | DAPP_SRC=demo dapp --use solc:0.7.5 build 12 | -hevm dapp-test --verbose 3 13 | 14 | .PHONY: test demo 15 | -------------------------------------------------------------------------------- /lib/forge-std/lib/ds-test/default.nix: -------------------------------------------------------------------------------- 1 | { solidityPackage, dappsys }: solidityPackage { 2 | name = "ds-test"; 3 | src = ./src; 4 | } 5 | -------------------------------------------------------------------------------- /lib/forge-std/lib/ds-test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ds-test", 3 | "version": "1.0.0", 4 | "description": "Assertions, equality checks and other test helpers ", 5 | "bugs": "https://github.com/dapphub/ds-test/issues", 6 | "license": "GPL-3.0", 7 | "author": "Contributors to ds-test", 8 | "files": [ 9 | "src/*" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/dapphub/ds-test.git" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/forge-std/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-std", 3 | "version": "1.7.6", 4 | "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", 5 | "homepage": "https://book.getfoundry.sh/forge/forge-std", 6 | "bugs": "https://github.com/foundry-rs/forge-std/issues", 7 | "license": "(Apache-2.0 OR MIT)", 8 | "author": "Contributors to Forge Standard Library", 9 | "files": [ 10 | "src/**/*" 11 | ], 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/foundry-rs/forge-std.git" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/forge-std/src/Script.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | // 💬 ABOUT 5 | // Forge Std's default Script. 6 | 7 | // 🧩 MODULES 8 | import {console} from "./console.sol"; 9 | import {console2} from "./console2.sol"; 10 | import {safeconsole} from "./safeconsole.sol"; 11 | import {StdChains} from "./StdChains.sol"; 12 | import {StdCheatsSafe} from "./StdCheats.sol"; 13 | import {stdJson} from "./StdJson.sol"; 14 | import {stdMath} from "./StdMath.sol"; 15 | import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; 16 | import {StdStyle} from "./StdStyle.sol"; 17 | import {StdUtils} from "./StdUtils.sol"; 18 | import {VmSafe} from "./Vm.sol"; 19 | 20 | // 📦 BOILERPLATE 21 | import {ScriptBase} from "./Base.sol"; 22 | 23 | // ⭐️ SCRIPT 24 | abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { 25 | // Note: IS_SCRIPT() must return true. 26 | bool public IS_SCRIPT = true; 27 | } 28 | -------------------------------------------------------------------------------- /lib/forge-std/src/StdError.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test 3 | pragma solidity >=0.6.2 <0.9.0; 4 | 5 | library stdError { 6 | bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); 7 | bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); 8 | bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); 9 | bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); 10 | bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); 11 | bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); 12 | bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); 13 | bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); 14 | bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); 15 | } 16 | -------------------------------------------------------------------------------- /lib/forge-std/src/interfaces/IERC165.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2; 3 | 4 | interface IERC165 { 5 | /// @notice Query if a contract implements an interface 6 | /// @param interfaceID The interface identifier, as specified in ERC-165 7 | /// @dev Interface identification is specified in ERC-165. This function 8 | /// uses less than 30,000 gas. 9 | /// @return `true` if the contract implements `interfaceID` and 10 | /// `interfaceID` is not 0xffffffff, `false` otherwise 11 | function supportsInterface(bytes4 interfaceID) external view returns (bool); 12 | } 13 | -------------------------------------------------------------------------------- /lib/forge-std/test/Vm.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.8.0 <0.9.0; 3 | 4 | import {Test} from "../src/Test.sol"; 5 | import {Vm, VmSafe} from "../src/Vm.sol"; 6 | 7 | contract VmTest is Test { 8 | // This test ensures that functions are never accidentally removed from a Vm interface, or 9 | // inadvertently moved between Vm and VmSafe. This test must be updated each time a function is 10 | // added to or removed from Vm or VmSafe. 11 | function test_interfaceId() public { 12 | assertEq(type(VmSafe).interfaceId, bytes4(0x01ec102d), "VmSafe"); 13 | assertEq(type(Vm).interfaceId, bytes4(0xa63eed6b), "Vm"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/forge-std/test/compilation/CompilationScript.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Script.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationScript is Script {} 11 | -------------------------------------------------------------------------------- /lib/forge-std/test/compilation/CompilationScriptBase.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Script.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationScriptBase is ScriptBase {} 11 | -------------------------------------------------------------------------------- /lib/forge-std/test/compilation/CompilationTest.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Test.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationTest is Test {} 11 | -------------------------------------------------------------------------------- /lib/forge-std/test/compilation/CompilationTestBase.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Test.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationTestBase is TestBase {} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { 6 | "repo": "OpenZeppelin/openzeppelin-contracts" 7 | } 8 | ], 9 | "commit": false, 10 | "access": "public", 11 | "baseBranch": "master" 12 | } 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.codecov.yml: -------------------------------------------------------------------------------- 1 | comment: off 2 | github_checks: 3 | annotations: false 4 | coverage: 5 | status: 6 | patch: 7 | default: 8 | target: 95% 9 | only_pulls: true 10 | project: 11 | default: 12 | threshold: 1% 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | end_of_line = lf 9 | indent_style = space 10 | insert_final_newline = true 11 | trim_trailing_whitespace = false 12 | max_line_length = 120 13 | 14 | [*.sol] 15 | indent_size = 4 16 | 17 | [*.js] 18 | indent_size = 2 19 | 20 | [*.{adoc,md}] 21 | max_line_length = 0 22 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends" : [ 4 | "eslint:recommended", 5 | "prettier", 6 | ], 7 | "env": { 8 | "es2022": true, 9 | "browser": true, 10 | "node": true, 11 | "mocha": true, 12 | }, 13 | "globals" : { 14 | "artifacts": "readonly", 15 | "contract": "readonly", 16 | "web3": "readonly", 17 | "extendEnvironment": "readonly", 18 | "expect": "readonly", 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report a bug in OpenZeppelin Contracts 4 | 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | **💻 Environment** 12 | 13 | 14 | 15 | **📝 Details** 16 | 17 | 18 | 19 | **🔢 Code to reproduce bug** 20 | 21 | 22 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | contact_links: 2 | - name: Questions & Support Requests 3 | url: https://forum.openzeppelin.com/c/support/contracts/18 4 | about: Ask in the OpenZeppelin Forum 5 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for OpenZeppelin Contracts 4 | 5 | --- 6 | 7 | **🧐 Motivation** 8 | 9 | 10 | **📝 Details** 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Fixes #???? 7 | 8 | 9 | 10 | 11 | 12 | #### PR Checklist 13 | 14 | 15 | 16 | 17 | 18 | - [ ] Tests 19 | - [ ] Documentation 20 | - [ ] Changeset entry (run `npx changeset add`) 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/actions/setup/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup 2 | 3 | runs: 4 | using: composite 5 | steps: 6 | - uses: actions/setup-node@v3 7 | with: 8 | node-version: 16.x 9 | - uses: actions/cache@v3 10 | id: cache 11 | with: 12 | path: '**/node_modules' 13 | key: npm-v3-${{ hashFiles('**/package-lock.json') }} 14 | - name: Install dependencies 15 | run: npm ci 16 | shell: bash 17 | if: steps.cache.outputs.cache-hit != 'true' 18 | - name: Install Foundry 19 | uses: foundry-rs/foundry-toolchain@v1 20 | with: 21 | version: nightly 22 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/workflows/actionlint.yml: -------------------------------------------------------------------------------- 1 | name: lint workflows 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - '.github/**/*.ya?ml' 7 | 8 | jobs: 9 | lint: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - name: Add problem matchers 14 | run: | 15 | # https://github.com/rhysd/actionlint/blob/3a2f2c7/docs/usage.md#problem-matchers 16 | curl -LO https://raw.githubusercontent.com/rhysd/actionlint/main/.github/actionlint-matcher.json 17 | echo "::add-matcher::actionlint-matcher.json" 18 | - uses: docker://rhysd/actionlint:latest 19 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/workflows/changeset.yml: -------------------------------------------------------------------------------- 1 | name: changeset 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | types: 8 | - opened 9 | - synchronize 10 | - labeled 11 | - unlabeled 12 | 13 | concurrency: 14 | group: changeset-${{ github.ref }} 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | check: 19 | runs-on: ubuntu-latest 20 | if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changeset') }} 21 | steps: 22 | - uses: actions/checkout@v4 23 | with: 24 | fetch-depth: 0 # Include history so Changesets finds merge-base 25 | - name: Set up environment 26 | uses: ./.github/actions/setup 27 | - name: Check changeset 28 | run: npx changeset status --since=origin/${{ github.base_ref }} 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Build Docs 2 | 3 | on: 4 | push: 5 | branches: [release-v*] 6 | 7 | permissions: 8 | contents: write 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Set up environment 16 | uses: ./.github/actions/setup 17 | - run: bash scripts/git-user-config.sh 18 | - run: node scripts/update-docs-branch.js 19 | - run: git push --all origin 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.swo 3 | 4 | # Logs 5 | logs 6 | *.log 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | allFiredEvents 13 | scTopics 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | coverage.json 18 | coverageEnv 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Dependency directory 24 | node_modules 25 | 26 | # Debug log from npm 27 | npm-debug.log 28 | 29 | # local env variables 30 | .env 31 | 32 | # truffle build directory 33 | build/ 34 | 35 | # macOS 36 | .DS_Store 37 | 38 | # truffle 39 | .node-xmlhttprequest-* 40 | 41 | # IntelliJ IDE 42 | .idea 43 | 44 | # docs artifacts 45 | docs/modules/api 46 | 47 | # only used to package @openzeppelin/contracts 48 | contracts/build/ 49 | contracts/README.md 50 | 51 | # temporary artifact from solidity-coverage 52 | allFiredEvents 53 | .coverage_artifacts 54 | .coverage_cache 55 | .coverage_contracts 56 | 57 | # hardat-exposed 58 | contracts-exposed 59 | 60 | # Hardhat 61 | /cache 62 | /artifacts 63 | 64 | # Foundry 65 | /out 66 | /cache_forge 67 | 68 | # Certora 69 | .certora* 70 | .last_confs 71 | certora_* 72 | .zip-output-url.txt 73 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/forge-std"] 2 | branch = v1 3 | path = lib/forge-std 4 | url = https://github.com/foundry-rs/forge-std 5 | [submodule "lib/erc4626-tests"] 6 | path = lib/erc4626-tests 7 | url = https://github.com/a16z/erc4626-tests.git 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.mocharc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | require: 'hardhat/register', 3 | timeout: 4000, 4 | }; 5 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true, 4 | "trailingComma": "all", 5 | "arrowParens": "avoid", 6 | "overrides": [ 7 | { 8 | "files": "*.sol", 9 | "options": { 10 | "singleQuote": false 11 | } 12 | } 13 | ], 14 | "plugins": ["prettier-plugin-solidity"] 15 | } 16 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/.solcover.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | norpc: true, 3 | testCommand: 'npm test', 4 | compileCommand: 'npm run compile', 5 | skipFiles: ['mocks'], 6 | providerOptions: { 7 | default_balance_ether: '10000000000000000000000000', 8 | }, 9 | mocha: { 10 | fgrep: '[skip-on-coverage]', 11 | invert: true, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/audits/2018-10.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/audits/2018-10.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/.gitignore: -------------------------------------------------------------------------------- 1 | patched 2 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/AccessControlHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {AccessControl} from "../patched/access/AccessControl.sol"; 5 | 6 | contract AccessControlHarness is AccessControl {} 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/ERC20PermitHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {ERC20Permit, ERC20} from "../patched/token/ERC20/extensions/ERC20Permit.sol"; 5 | 6 | contract ERC20PermitHarness is ERC20Permit { 7 | constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {} 8 | 9 | function mint(address account, uint256 amount) external { 10 | _mint(account, amount); 11 | } 12 | 13 | function burn(address account, uint256 amount) external { 14 | _burn(account, amount); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/ERC3156FlashBorrowerHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | import {IERC3156FlashBorrower} from "../patched/interfaces/IERC3156FlashBorrower.sol"; 4 | 5 | pragma solidity ^0.8.20; 6 | 7 | contract ERC3156FlashBorrowerHarness is IERC3156FlashBorrower { 8 | bytes32 somethingToReturn; 9 | 10 | function onFlashLoan(address, address, uint256, uint256, bytes calldata) external view override returns (bytes32) { 11 | return somethingToReturn; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/ERC721Harness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC721} from "../patched/token/ERC721/ERC721.sol"; 6 | 7 | contract ERC721Harness is ERC721 { 8 | constructor(string memory name, string memory symbol) ERC721(name, symbol) {} 9 | 10 | function mint(address account, uint256 tokenId) external { 11 | _mint(account, tokenId); 12 | } 13 | 14 | function safeMint(address to, uint256 tokenId) external { 15 | _safeMint(to, tokenId); 16 | } 17 | 18 | function safeMint(address to, uint256 tokenId, bytes memory data) external { 19 | _safeMint(to, tokenId, data); 20 | } 21 | 22 | function burn(uint256 tokenId) external { 23 | _burn(tokenId); 24 | } 25 | 26 | function unsafeOwnerOf(uint256 tokenId) external view returns (address) { 27 | return _ownerOf(tokenId); 28 | } 29 | 30 | function unsafeGetApproved(uint256 tokenId) external view returns (address) { 31 | return _getApproved(tokenId); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/ERC721ReceiverHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import "../patched/interfaces/IERC721Receiver.sol"; 6 | 7 | contract ERC721ReceiverHarness is IERC721Receiver { 8 | function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) { 9 | return this.onERC721Received.selector; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/EnumerableSetHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {EnumerableSet} from "../patched/utils/structs/EnumerableSet.sol"; 6 | 7 | contract EnumerableSetHarness { 8 | using EnumerableSet for EnumerableSet.Bytes32Set; 9 | 10 | EnumerableSet.Bytes32Set private _set; 11 | 12 | function add(bytes32 value) public returns (bool) { 13 | return _set.add(value); 14 | } 15 | 16 | function remove(bytes32 value) public returns (bool) { 17 | return _set.remove(value); 18 | } 19 | 20 | function contains(bytes32 value) public view returns (bool) { 21 | return _set.contains(value); 22 | } 23 | 24 | function length() public view returns (uint256) { 25 | return _set.length(); 26 | } 27 | 28 | function at_(uint256 index) public view returns (bytes32) { 29 | return _set.at(index); 30 | } 31 | 32 | function _indexOf(bytes32 value) public view returns (uint256) { 33 | return _set._inner._indexes[value]; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/InitializableHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {Initializable} from "../patched/proxy/utils/Initializable.sol"; 5 | 6 | contract InitializableHarness is Initializable { 7 | function initialize() public initializer {} 8 | function reinitialize(uint64 n) public reinitializer(n) {} 9 | function disable() public { _disableInitializers(); } 10 | 11 | function nested_init_init() public initializer { initialize(); } 12 | function nested_init_reinit(uint64 m) public initializer { reinitialize(m); } 13 | function nested_reinit_init(uint64 n) public reinitializer(n) { initialize(); } 14 | function nested_reinit_reinit(uint64 n, uint64 m) public reinitializer(n) { reinitialize(m); } 15 | 16 | function version() public view returns (uint64) { 17 | return _getInitializedVersion(); 18 | } 19 | 20 | function initializing() public view returns (bool) { 21 | return _isInitializing(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/Ownable2StepHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {Ownable2Step, Ownable} from "../patched/access/Ownable2Step.sol"; 5 | 6 | contract Ownable2StepHarness is Ownable2Step { 7 | constructor(address initialOwner) Ownable(initialOwner) {} 8 | 9 | function restricted() external onlyOwner {} 10 | } 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/OwnableHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {Ownable} from "../patched/access/Ownable.sol"; 5 | 6 | contract OwnableHarness is Ownable { 7 | constructor(address initialOwner) Ownable(initialOwner) {} 8 | 9 | function restricted() external onlyOwner {} 10 | } 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/PausableHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {Pausable} from "../patched/utils/Pausable.sol"; 5 | 6 | contract PausableHarness is Pausable { 7 | function pause() external { 8 | _pause(); 9 | } 10 | 11 | function unpause() external { 12 | _unpause(); 13 | } 14 | 15 | function onlyWhenPaused() external whenPaused {} 16 | 17 | function onlyWhenNotPaused() external whenNotPaused {} 18 | } 19 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/harnesses/TimelockControllerHarness.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {TimelockController} from "../patched/governance/TimelockController.sol"; 5 | 6 | contract TimelockControllerHarness is TimelockController { 7 | constructor( 8 | uint256 minDelay, 9 | address[] memory proposers, 10 | address[] memory executors, 11 | address admin 12 | ) TimelockController(minDelay, proposers, executors, admin) {} 13 | } 14 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/reports/2021-10.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/certora/reports/2021-10.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/reports/2022-03.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/certora/reports/2022-03.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/reports/2022-05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/lib/openzeppelin-contracts/certora/reports/2022-05.pdf -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec: -------------------------------------------------------------------------------- 1 | // environment 2 | definition nonpayable(env e) returns bool = e.msg.value == 0; 3 | definition nonzerosender(env e) returns bool = e.msg.sender != 0; 4 | 5 | // math 6 | definition min(mathint a, mathint b) returns mathint = a < b ? a : b; 7 | definition max(mathint a, mathint b) returns mathint = a > b ? a : b; 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function DEFAULT_ADMIN_ROLE() external returns (bytes32) envfree; 3 | function hasRole(bytes32, address) external returns(bool) envfree; 4 | function getRoleAdmin(bytes32) external returns(bytes32) envfree; 5 | function grantRole(bytes32, address) external; 6 | function revokeRole(bytes32, address) external; 7 | function renounceRole(bytes32, address) external; 8 | } 9 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function name() external returns (string) envfree; 3 | function symbol() external returns (string) envfree; 4 | function decimals() external returns (uint8) envfree; 5 | function totalSupply() external returns (uint256) envfree; 6 | function balanceOf(address) external returns (uint256) envfree; 7 | function allowance(address,address) external returns (uint256) envfree; 8 | function approve(address,uint256) external returns (bool); 9 | function transfer(address,uint256) external returns (bool); 10 | function transferFrom(address,address,uint256) external returns (bool); 11 | } 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function permit(address,address,uint256,uint256,uint8,bytes32,bytes32) external; 3 | function nonces(address) external returns (uint256) envfree; 4 | function DOMAIN_SEPARATOR() external returns (bytes32) envfree; 5 | } 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function _.onFlashLoan(address,address,uint256,uint256,bytes) external => DISPATCHER(true); 3 | } 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function maxFlashLoan(address) external returns (uint256) envfree; 3 | function flashFee(address,uint256) external returns (uint256) envfree; 4 | function flashLoan(address,address,uint256,bytes) external returns (bool); 5 | } 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function owner() external returns (address) envfree; 3 | } 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | // IERC721 3 | function balanceOf(address) external returns (uint256) envfree; 4 | function ownerOf(uint256) external returns (address) envfree; 5 | function getApproved(uint256) external returns (address) envfree; 6 | function isApprovedForAll(address,address) external returns (bool) envfree; 7 | function safeTransferFrom(address,address,uint256,bytes) external; 8 | function safeTransferFrom(address,address,uint256) external; 9 | function transferFrom(address,address,uint256) external; 10 | function approve(address,uint256) external; 11 | function setApprovalForAll(address,bool) external; 12 | 13 | // IERC721Metadata 14 | function name() external returns (string); 15 | function symbol() external returns (string); 16 | function tokenURI(uint256) external returns (string); 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function _.onERC721Received(address,address,uint256,bytes) external => DISPATCHER(true); 3 | } 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function owner() external returns (address) envfree; 3 | function transferOwnership(address) external; 4 | function renounceOwnership() external; 5 | } 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec: -------------------------------------------------------------------------------- 1 | methods { 2 | function owner() external returns (address) envfree; 3 | function pendingOwner() external returns (address) envfree; 4 | function transferOwnership(address) external; 5 | function acceptOwnership() external; 6 | function renounceOwnership() external; 7 | } 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (access/manager/IAuthority.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Standard interface for permissioning originally defined in Dappsys. 8 | */ 9 | interface IAuthority { 10 | /** 11 | * @dev Returns true if the caller can invoke on a target the function identified by a function selector. 12 | */ 13 | function canCall(address caller, address target, bytes4 selector) external view returns (bool allowed); 14 | } 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/finance/README.adoc: -------------------------------------------------------------------------------- 1 | = Finance 2 | 3 | [.readme-notice] 4 | NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance 5 | 6 | This directory includes primitives for financial systems: 7 | 8 | - {VestingWallet} handles the vesting of Ether and ERC20 tokens for a given beneficiary. Custody of multiple tokens can 9 | be given to this contract, which will release the token to the beneficiary following a given, customizable, vesting 10 | schedule. 11 | 12 | == Contracts 13 | 14 | {{VestingWallet}} 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1155.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC1155} from "../token/ERC1155/IERC1155.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1155MetadataURI.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC1155MetadataURI} from "../token/ERC1155/extensions/IERC1155MetadataURI.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1155Receiver.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC1155Receiver} from "../token/ERC1155/IERC1155Receiver.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1271.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Interface of the ERC1271 standard signature validation method for 8 | * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. 9 | */ 10 | interface IERC1271 { 11 | /** 12 | * @dev Should return whether the signature provided is valid for the provided data 13 | * @param hash Hash of the data to be signed 14 | * @param signature Signature byte array associated with _data 15 | */ 16 | function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC165} from "../utils/introspection/IERC165.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1820Implementer.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Interface for an ERC1820 implementer, as defined in the 8 | * https://eips.ethereum.org/EIPS/eip-1820#interface-implementation-erc1820implementerinterface[EIP]. 9 | * Used by contracts that will be registered as implementers in the 10 | * {IERC1820Registry}. 11 | */ 12 | interface IERC1820Implementer { 13 | /** 14 | * @dev Returns a special value (`ERC1820_ACCEPT_MAGIC`) if this contract 15 | * implements `interfaceHash` for `account`. 16 | * 17 | * See {IERC1820Registry-setInterfaceImplementer}. 18 | */ 19 | function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) external view returns (bytes32); 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. 8 | */ 9 | interface IERC1967 { 10 | /** 11 | * @dev Emitted when the implementation is upgraded. 12 | */ 13 | event Upgraded(address indexed implementation); 14 | 15 | /** 16 | * @dev Emitted when the admin account has changed. 17 | */ 18 | event AdminChanged(address previousAdmin, address newAdmin); 19 | 20 | /** 21 | * @dev Emitted when the beacon is changed. 22 | */ 23 | event BeaconUpgraded(address indexed beacon); 24 | } 25 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC20} from "../token/ERC20/IERC20.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20Metadata.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2309.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev ERC-2309: ERC-721 Consecutive Transfer Extension. 8 | */ 9 | interface IERC2309 { 10 | /** 11 | * @dev Emitted when the tokens from `fromTokenId` to `toTokenId` are transferred from `fromAddress` to `toAddress`. 12 | */ 13 | event ConsecutiveTransfer( 14 | uint256 indexed fromTokenId, 15 | uint256 toTokenId, 16 | address indexed fromAddress, 17 | address indexed toAddress 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2612.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC20Permit} from "../token/ERC20/extensions/IERC20Permit.sol"; 7 | 8 | interface IERC2612 is IERC20Permit {} 9 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC165} from "../utils/introspection/IERC165.sol"; 7 | 8 | /** 9 | * @dev Interface for the NFT Royalty Standard. 10 | * 11 | * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal 12 | * support for royalty payments across all NFT marketplaces and ecosystem participants. 13 | */ 14 | interface IERC2981 is IERC165 { 15 | /** 16 | * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of 17 | * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. 18 | */ 19 | function royaltyInfo( 20 | uint256 tokenId, 21 | uint256 salePrice 22 | ) external view returns (address receiver, uint256 royaltyAmount); 23 | } 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC3156.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC3156FlashBorrower} from "./IERC3156FlashBorrower.sol"; 7 | import {IERC3156FlashLender} from "./IERC3156FlashLender.sol"; 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC3156FlashBorrower.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Interface of the ERC3156 FlashBorrower, as defined in 8 | * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. 9 | */ 10 | interface IERC3156FlashBorrower { 11 | /** 12 | * @dev Receive a flash loan. 13 | * @param initiator The initiator of the loan. 14 | * @param token The loan currency. 15 | * @param amount The amount of tokens lent. 16 | * @param fee The additional amount of tokens to repay. 17 | * @param data Arbitrary data structure, intended to contain user-defined parameters. 18 | * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" 19 | */ 20 | function onFlashLoan( 21 | address initiator, 22 | address token, 23 | uint256 amount, 24 | uint256 fee, 25 | bytes calldata data 26 | ) external returns (bytes32); 27 | } 28 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC165} from "./IERC165.sol"; 7 | import {IERC721} from "./IERC721.sol"; 8 | 9 | /// @title EIP-721 Metadata Update Extension 10 | interface IERC4906 is IERC165, IERC721 { 11 | /// @dev This event emits when the metadata of a token is changed. 12 | /// So that the third-party platforms such as NFT market could 13 | /// timely update the images and related attributes of the NFT. 14 | event MetadataUpdate(uint256 _tokenId); 15 | 16 | /// @dev This event emits when the metadata of a range of tokens is changed. 17 | /// So that the third-party platforms such as NFT market could 18 | /// timely update the images and related attributes of the NFTs. 19 | event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | interface IERC5267 { 7 | /** 8 | * @dev MAY be emitted to signal that the domain could have changed. 9 | */ 10 | event EIP712DomainChanged(); 11 | 12 | /** 13 | * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 14 | * signature. 15 | */ 16 | function eip712Domain() 17 | external 18 | view 19 | returns ( 20 | bytes1 fields, 21 | string memory name, 22 | string memory version, 23 | uint256 chainId, 24 | address verifyingContract, 25 | bytes32 salt, 26 | uint256[] memory extensions 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5313.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Interface for the Light Contract Ownership Standard. 8 | * 9 | * A standardized minimal interface required to identify an account that controls a contract 10 | */ 11 | interface IERC5313 { 12 | /** 13 | * @dev Gets the address of the owner. 14 | */ 15 | function owner() external view returns (address); 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5805.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IVotes} from "../governance/utils/IVotes.sol"; 7 | import {IERC6372} from "./IERC6372.sol"; 8 | 9 | interface IERC5805 is IERC6372, IVotes {} 10 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC6372.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | interface IERC6372 { 7 | /** 8 | * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). 9 | */ 10 | function clock() external view returns (uint48); 11 | 12 | /** 13 | * @dev Description of the clock 14 | */ 15 | // solhint-disable-next-line func-name-mixedcase 16 | function CLOCK_MODE() external view returns (string memory); 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721} from "../token/ERC721/IERC721.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721Enumerable.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721Enumerable} from "../token/ERC721/extensions/IERC721Enumerable.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721Metadata.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721Metadata} from "../token/ERC721/extensions/IERC721Metadata.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721Receiver.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721Receiver} from "../token/ERC721/IERC721Receiver.sol"; 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified 8 | * proxy whose upgrades are fully controlled by the current implementation. 9 | */ 10 | interface IERC1822Proxiable { 11 | /** 12 | * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation 13 | * address. 14 | * 15 | * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks 16 | * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this 17 | * function revert if invoked through a proxy. 18 | */ 19 | function proxiableUUID() external view returns (bytes32); 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/metatx/README.adoc: -------------------------------------------------------------------------------- 1 | = Meta Transactions 2 | 3 | [.readme-notice] 4 | NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/metatx 5 | 6 | This directory includes contracts for adding meta-transaction capabilities (i.e. abstracting the execution context from the transaction origin) following the https://eips.ethereum.org/EIPS/eip-2771[ERC-2771 specification]. 7 | 8 | - {ERC2771Context}: Provides a mechanism to override the sender and calldata of the execution context (`msg.sender` and `msg.data`) with a custom value specified by a trusted forwarder. 9 | - {ERC2771Forwarder}: A production-ready forwarder that relays operation requests signed off-chain by an EOA. 10 | 11 | == Core 12 | 13 | {{ERC2771Context}} 14 | 15 | == Utils 16 | 17 | {{ERC2771Forwarder}} 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Base64} from "../utils/Base64.sol"; 6 | 7 | contract Base64Dirty { 8 | struct A { 9 | uint256 value; 10 | } 11 | 12 | function encode(bytes memory input) public pure returns (string memory) { 13 | A memory unused = A({value: type(uint256).max}); 14 | // To silence warning 15 | unused; 16 | 17 | return Base64.encode(input); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Context} from "../utils/Context.sol"; 6 | 7 | contract ContextMock is Context { 8 | event Sender(address sender); 9 | 10 | function msgSender() public { 11 | emit Sender(_msgSender()); 12 | } 13 | 14 | event Data(bytes data, uint256 integerValue, string stringValue); 15 | 16 | function msgData(uint256 integerValue, string memory stringValue) public { 17 | emit Data(_msgData(), integerValue, stringValue); 18 | } 19 | 20 | event DataShort(bytes data); 21 | 22 | function msgDataShort() public { 23 | emit DataShort(_msgData()); 24 | } 25 | } 26 | 27 | contract ContextMockCaller { 28 | function callSender(ContextMock context) public { 29 | context.msgSender(); 30 | } 31 | 32 | function callData(ContextMock context, uint256 integerValue, string memory stringValue) public { 33 | context.msgData(integerValue, stringValue); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ECDSA} from "../utils/cryptography/ECDSA.sol"; 6 | import {EIP712} from "../utils/cryptography/EIP712.sol"; 7 | 8 | abstract contract EIP712Verifier is EIP712 { 9 | function verify(bytes memory signature, address signer, address mailTo, string memory mailContents) external view { 10 | bytes32 digest = _hashTypedDataV4( 11 | keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents)))) 12 | ); 13 | address recoveredSigner = ECDSA.recover(digest, signature); 14 | require(recoveredSigner == signer); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Ownable} from "../access/Ownable.sol"; 6 | import {IERC1271} from "../interfaces/IERC1271.sol"; 7 | import {ECDSA} from "../utils/cryptography/ECDSA.sol"; 8 | 9 | contract ERC1271WalletMock is Ownable, IERC1271 { 10 | constructor(address originalOwner) Ownable(originalOwner) {} 11 | 12 | function isValidSignature(bytes32 hash, bytes memory signature) public view returns (bytes4 magicValue) { 13 | return ECDSA.recover(hash, signature) == owner() ? this.isValidSignature.selector : bytes4(0); 14 | } 15 | } 16 | 17 | contract ERC1271MaliciousMock is IERC1271 { 18 | function isValidSignature(bytes32, bytes memory) public pure returns (bytes4) { 19 | assembly { 20 | mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) 21 | return(0, 32) 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract ERC165MaliciousData { 6 | function supportsInterface(bytes4) public pure returns (bool) { 7 | assembly { 8 | mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) 9 | return(0, 32) 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract ERC165MissingData { 6 | function supportsInterface(bytes4 interfaceId) public view {} // missing return 7 | } 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract ERC165NotSupported {} 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {IERC165} from "../../utils/introspection/IERC165.sol"; 6 | 7 | contract ERC165ReturnBombMock is IERC165 { 8 | function supportsInterface(bytes4 interfaceId) public pure override returns (bool) { 9 | if (interfaceId == type(IERC165).interfaceId) { 10 | assembly { 11 | mstore(0, 1) 12 | } 13 | } 14 | assembly { 15 | return(0, 101500) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract EtherReceiverMock { 6 | bool private _acceptEther; 7 | 8 | function setAcceptEther(bool acceptEther) public { 9 | _acceptEther = acceptEther; 10 | } 11 | 12 | receive() external payable { 13 | if (!_acceptEther) { 14 | revert(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20MulticallMock} from "./token/ERC20MulticallMock.sol"; 6 | 7 | contract MulticallTest { 8 | function checkReturnValues( 9 | ERC20MulticallMock multicallToken, 10 | address[] calldata recipients, 11 | uint256[] calldata amounts 12 | ) external { 13 | bytes[] memory calls = new bytes[](recipients.length); 14 | for (uint256 i = 0; i < recipients.length; i++) { 15 | calls[i] = abi.encodeCall(multicallToken.transfer, (recipients[i], amounts[i])); 16 | } 17 | 18 | bytes[] memory results = multicallToken.multicall(calls); 19 | for (uint256 i = 0; i < results.length; i++) { 20 | require(abi.decode(results[i], (bool))); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Pausable} from "../utils/Pausable.sol"; 6 | 7 | contract PausableMock is Pausable { 8 | bool public drasticMeasureTaken; 9 | uint256 public count; 10 | 11 | constructor() { 12 | drasticMeasureTaken = false; 13 | count = 0; 14 | } 15 | 16 | function normalProcess() external whenNotPaused { 17 | count++; 18 | } 19 | 20 | function drasticMeasure() external whenPaused { 21 | drasticMeasureTaken = true; 22 | } 23 | 24 | function pause() external { 25 | _pause(); 26 | } 27 | 28 | function unpause() external { 29 | _unpause(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Context} from "../utils/Context.sol"; 6 | 7 | contract ReentrancyAttack is Context { 8 | function callSender(bytes calldata data) public { 9 | (bool success, ) = _msgSender().call(data); 10 | require(success, "ReentrancyAttack: failed call"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {Address} from "../utils/Address.sol"; 5 | 6 | contract TimelockReentrant { 7 | address private _reenterTarget; 8 | bytes private _reenterData; 9 | bool _reentered; 10 | 11 | function disableReentrancy() external { 12 | _reentered = true; 13 | } 14 | 15 | function enableRentrancy(address target, bytes calldata data) external { 16 | _reenterTarget = target; 17 | _reenterData = data; 18 | } 19 | 20 | function reenter() external { 21 | if (!_reentered) { 22 | _reentered = true; 23 | Address.functionCall(_reenterTarget, _reenterData); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {IBeacon} from "../proxy/beacon/IBeacon.sol"; 5 | 6 | contract UpgradeableBeaconMock is IBeacon { 7 | address public implementation; 8 | 9 | constructor(address impl) { 10 | implementation = impl; 11 | } 12 | } 13 | 14 | interface IProxyExposed { 15 | // solhint-disable-next-line func-name-mixedcase 16 | function $getBeacon() external view returns (address); 17 | } 18 | 19 | contract UpgradeableBeaconReentrantMock is IBeacon { 20 | error BeaconProxyBeaconSlotAddress(address beacon); 21 | 22 | function implementation() external view override returns (address) { 23 | // Revert with the beacon seen in the proxy at the moment of calling to check if it's 24 | // set before the call. 25 | revert BeaconProxyBeaconSlotAddress(IProxyExposed(msg.sender).$getBeacon()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {Governor} from "../../governance/Governor.sol"; 6 | import {GovernorSettings} from "../../governance/extensions/GovernorSettings.sol"; 7 | import {GovernorCountingSimple} from "../../governance/extensions/GovernorCountingSimple.sol"; 8 | import {GovernorVotesQuorumFraction} from "../../governance/extensions/GovernorVotesQuorumFraction.sol"; 9 | 10 | abstract contract GovernorMock is GovernorSettings, GovernorVotesQuorumFraction, GovernorCountingSimple { 11 | function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { 12 | return super.proposalThreshold(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {GovernorCountingSimple} from "../../governance/extensions/GovernorCountingSimple.sol"; 6 | import {GovernorVotes} from "../../governance/extensions/GovernorVotes.sol"; 7 | 8 | abstract contract GovernorVoteMocks is GovernorVotes, GovernorCountingSimple { 9 | function quorum(uint256) public pure override returns (uint256) { 10 | return 0; 11 | } 12 | 13 | function votingDelay() public pure override returns (uint256) { 14 | return 4; 15 | } 16 | 17 | function votingPeriod() public pure override returns (uint256) { 18 | return 16; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract BadBeaconNoImpl {} 6 | 7 | contract BadBeaconNotContract { 8 | function implementation() external pure returns (address) { 9 | return address(0x1); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | /** 6 | * @dev Implementation contract with a payable changeAdmin(address) function made to clash with 7 | * TransparentUpgradeableProxy's to test correct functioning of the Transparent Proxy feature. 8 | */ 9 | contract ClashingImplementation { 10 | event ClashingImplementationCall(); 11 | 12 | function upgradeToAndCall(address, bytes calldata) external payable { 13 | emit ClashingImplementationCall(); 14 | } 15 | 16 | function delegatedFunction() external pure returns (bool) { 17 | return true; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 5 | 6 | abstract contract ERC20ApprovalMock is ERC20 { 7 | function _approve(address owner, address spender, uint256 amount, bool) internal virtual override { 8 | super._approve(owner, spender, amount, true); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 6 | 7 | abstract contract ERC20DecimalsMock is ERC20 { 8 | uint8 private immutable _decimals; 9 | 10 | constructor(uint8 decimals_) { 11 | _decimals = decimals_; 12 | } 13 | 14 | function decimals() public view override returns (uint8) { 15 | return _decimals; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | contract ERC20ExcessDecimalsMock { 6 | function decimals() public pure returns (uint256) { 7 | return type(uint256).max; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20FlashMint} from "../../token/ERC20/extensions/ERC20FlashMint.sol"; 6 | 7 | abstract contract ERC20FlashMintMock is ERC20FlashMint { 8 | uint256 _flashFeeAmount; 9 | address _flashFeeReceiverAddress; 10 | 11 | function setFlashFee(uint256 amount) public { 12 | _flashFeeAmount = amount; 13 | } 14 | 15 | function _flashFee(address, uint256) internal view override returns (uint256) { 16 | return _flashFeeAmount; 17 | } 18 | 19 | function setFlashFeeReceiver(address receiver) public { 20 | _flashFeeReceiverAddress = receiver; 21 | } 22 | 23 | function _flashFeeReceiver() internal view override returns (address) { 24 | return _flashFeeReceiverAddress; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 6 | 7 | // contract that replicate USDT (0xdac17f958d2ee523a2206206994597c13d831ec7) approval behavior 8 | abstract contract ERC20ForceApproveMock is ERC20 { 9 | function approve(address spender, uint256 amount) public virtual override returns (bool) { 10 | require(amount == 0 || allowance(msg.sender, spender) == 0, "USDT approval failure"); 11 | return super.approve(spender, amount); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 5 | 6 | contract ERC20Mock is ERC20 { 7 | constructor() ERC20("ERC20Mock", "E20M") {} 8 | 9 | function mint(address account, uint256 amount) external { 10 | _mint(account, amount); 11 | } 12 | 13 | function burn(address account, uint256 amount) external { 14 | _burn(account, amount); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 6 | import {Multicall} from "../../utils/Multicall.sol"; 7 | 8 | abstract contract ERC20MulticallMock is ERC20, Multicall {} 9 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 6 | 7 | abstract contract ERC20NoReturnMock is ERC20 { 8 | function transfer(address to, uint256 amount) public override returns (bool) { 9 | super.transfer(to, amount); 10 | assembly { 11 | return(0, 0) 12 | } 13 | } 14 | 15 | function transferFrom(address from, address to, uint256 amount) public override returns (bool) { 16 | super.transferFrom(from, to, amount); 17 | assembly { 18 | return(0, 0) 19 | } 20 | } 21 | 22 | function approve(address spender, uint256 amount) public override returns (bool) { 23 | super.approve(spender, amount); 24 | assembly { 25 | return(0, 0) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20} from "../../token/ERC20/ERC20.sol"; 6 | 7 | abstract contract ERC20ReturnFalseMock is ERC20 { 8 | function transfer(address, uint256) public pure override returns (bool) { 9 | return false; 10 | } 11 | 12 | function transferFrom(address, address, uint256) public pure override returns (bool) { 13 | return false; 14 | } 15 | 16 | function approve(address, uint256) public pure override returns (bool) { 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC4626} from "../../token/ERC20/extensions/ERC4626.sol"; 6 | 7 | abstract contract ERC4626LimitsMock is ERC4626 { 8 | uint256 _maxDeposit; 9 | uint256 _maxMint; 10 | 11 | constructor() { 12 | _maxDeposit = 100 ether; 13 | _maxMint = 100 ether; 14 | } 15 | 16 | function maxDeposit(address) public view override returns (uint256) { 17 | return _maxDeposit; 18 | } 19 | 20 | function maxMint(address) public view override returns (uint256) { 21 | return _maxMint; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | import {IERC20, ERC20} from "../../token/ERC20/ERC20.sol"; 5 | import {ERC4626} from "../../token/ERC20/extensions/ERC4626.sol"; 6 | 7 | contract ERC4626Mock is ERC4626 { 8 | constructor(address underlying) ERC20("ERC4626Mock", "E4626M") ERC4626(IERC20(underlying)) {} 9 | 10 | function mint(address account, uint256 amount) external { 11 | _mint(account, amount); 12 | } 13 | 14 | function burn(address account, uint256 amount) external { 15 | _burn(account, amount); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC4626} from "../../token/ERC20/extensions/ERC4626.sol"; 6 | 7 | abstract contract ERC4626OffsetMock is ERC4626 { 8 | uint8 private immutable _offset; 9 | 10 | constructor(uint8 offset_) { 11 | _offset = offset_; 12 | } 13 | 14 | function _decimalsOffset() internal view virtual override returns (uint8) { 15 | return _offset; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC721URIStorage} from "../../token/ERC721/extensions/ERC721URIStorage.sol"; 6 | 7 | abstract contract ERC721URIStorageMock is ERC721URIStorage { 8 | string private _baseTokenURI; 9 | 10 | function _baseURI() internal view virtual override returns (string memory) { 11 | return _baseTokenURI; 12 | } 13 | 14 | function setBaseURI(string calldata newBaseTokenURI) public { 15 | _baseTokenURI = newBaseTokenURI; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/mocks/token/VotesTimestamp.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.20; 4 | 5 | import {ERC20Votes} from "../../token/ERC20/extensions/ERC20Votes.sol"; 6 | import {ERC721Votes} from "../../token/ERC721/extensions/ERC721Votes.sol"; 7 | import {SafeCast} from "../../utils/math/SafeCast.sol"; 8 | 9 | abstract contract ERC20VotesTimestampMock is ERC20Votes { 10 | function clock() public view virtual override returns (uint48) { 11 | return SafeCast.toUint48(block.timestamp); 12 | } 13 | 14 | // solhint-disable-next-line func-name-mixedcase 15 | function CLOCK_MODE() public view virtual override returns (string memory) { 16 | return "mode=timestamp"; 17 | } 18 | } 19 | 20 | abstract contract ERC721VotesTimestampMock is ERC721Votes { 21 | function clock() public view virtual override returns (uint48) { 22 | return SafeCast.toUint48(block.timestamp); 23 | } 24 | 25 | // solhint-disable-next-line func-name-mixedcase 26 | function CLOCK_MODE() public view virtual override returns (string memory) { 27 | return "mode=timestamp"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@openzeppelin/contracts", 3 | "description": "Secure Smart Contract library for Solidity", 4 | "version": "5.0.2", 5 | "files": [ 6 | "**/*.sol", 7 | "/build/contracts/*.json", 8 | "!/mocks/**/*" 9 | ], 10 | "scripts": { 11 | "prepack": "bash ../scripts/prepack.sh", 12 | "prepare-docs": "cd ..; npm run prepare-docs" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/OpenZeppelin/openzeppelin-contracts.git" 17 | }, 18 | "keywords": [ 19 | "solidity", 20 | "ethereum", 21 | "smart", 22 | "contracts", 23 | "security", 24 | "zeppelin" 25 | ], 26 | "author": "OpenZeppelin Community ", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/OpenZeppelin/openzeppelin-contracts/issues" 30 | }, 31 | "homepage": "https://openzeppelin.com/contracts/" 32 | } 33 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev This is the interface that {BeaconProxy} expects of its beacon. 8 | */ 9 | interface IBeacon { 10 | /** 11 | * @dev Must return an address that can be used as a delegate call target. 12 | * 13 | * {UpgradeableBeacon} will check that this address is a contract. 14 | */ 15 | function implementation() external view returns (address); 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/ERC1155Burnable.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {ERC1155} from "../ERC1155.sol"; 7 | 8 | /** 9 | * @dev Extension of {ERC1155} that allows token holders to destroy both their 10 | * own tokens and those that they have been approved to use. 11 | */ 12 | abstract contract ERC1155Burnable is ERC1155 { 13 | function burn(address account, uint256 id, uint256 value) public virtual { 14 | if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) { 15 | revert ERC1155MissingApprovalForAll(_msgSender(), account); 16 | } 17 | 18 | _burn(account, id, value); 19 | } 20 | 21 | function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual { 22 | if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) { 23 | revert ERC1155MissingApprovalForAll(_msgSender(), account); 24 | } 25 | 26 | _burnBatch(account, ids, values); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC1155} from "../IERC1155.sol"; 7 | 8 | /** 9 | * @dev Interface of the optional ERC1155MetadataExtension interface, as defined 10 | * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. 11 | */ 12 | interface IERC1155MetadataURI is IERC1155 { 13 | /** 14 | * @dev Returns the URI for token type `id`. 15 | * 16 | * If the `\{id\}` substring is present in the URI, it must be replaced by 17 | * clients with the actual token type ID. 18 | */ 19 | function uri(uint256 id) external view returns (string memory); 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC20} from "../IERC20.sol"; 7 | 8 | /** 9 | * @dev Interface for the optional metadata functions from the ERC20 standard. 10 | */ 11 | interface IERC20Metadata is IERC20 { 12 | /** 13 | * @dev Returns the name of the token. 14 | */ 15 | function name() external view returns (string memory); 16 | 17 | /** 18 | * @dev Returns the symbol of the token. 19 | */ 20 | function symbol() external view returns (string memory); 21 | 22 | /** 23 | * @dev Returns the decimals places of the token. 24 | */ 25 | function decimals() external view returns (uint8); 26 | } 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @title ERC721 token receiver interface 8 | * @dev Interface for any contract that wants to support safeTransfers 9 | * from ERC721 asset contracts. 10 | */ 11 | interface IERC721Receiver { 12 | /** 13 | * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} 14 | * by `operator` from `from`, this function is called. 15 | * 16 | * It must return its Solidity selector to confirm the token transfer. 17 | * If any other value is returned or the interface is not implemented by the recipient, the transfer will be 18 | * reverted. 19 | * 20 | * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. 21 | */ 22 | function onERC721Received( 23 | address operator, 24 | address from, 25 | uint256 tokenId, 26 | bytes calldata data 27 | ) external returns (bytes4); 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721Burnable.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {ERC721} from "../ERC721.sol"; 7 | import {Context} from "../../../utils/Context.sol"; 8 | 9 | /** 10 | * @title ERC721 Burnable Token 11 | * @dev ERC721 Token that can be burned (destroyed). 12 | */ 13 | abstract contract ERC721Burnable is Context, ERC721 { 14 | /** 15 | * @dev Burns `tokenId`. See {ERC721-_burn}. 16 | * 17 | * Requirements: 18 | * 19 | * - The caller must own `tokenId` or be an approved operator. 20 | */ 21 | function burn(uint256 tokenId) public virtual { 22 | // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists 23 | // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. 24 | _update(address(0), tokenId, _msgSender()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721} from "../IERC721.sol"; 7 | 8 | /** 9 | * @title ERC-721 Non-Fungible Token Standard, optional metadata extension 10 | * @dev See https://eips.ethereum.org/EIPS/eip-721 11 | */ 12 | interface IERC721Metadata is IERC721 { 13 | /** 14 | * @dev Returns the token collection name. 15 | */ 16 | function name() external view returns (string memory); 17 | 18 | /** 19 | * @dev Returns the token collection symbol. 20 | */ 21 | function symbol() external view returns (string memory); 22 | 23 | /** 24 | * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. 25 | */ 26 | function tokenURI(uint256 tokenId) external view returns (string memory); 27 | } 28 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC721Receiver} from "../IERC721Receiver.sol"; 7 | 8 | /** 9 | * @dev Implementation of the {IERC721Receiver} interface. 10 | * 11 | * Accepts all token transfers. 12 | * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or 13 | * {IERC721-setApprovalForAll}. 14 | */ 15 | abstract contract ERC721Holder is IERC721Receiver { 16 | /** 17 | * @dev See {IERC721Receiver-onERC721Received}. 18 | * 19 | * Always returns `IERC721Receiver.onERC721Received.selector`. 20 | */ 21 | function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) { 22 | return this.onERC721Received.selector; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/token/common/README.adoc: -------------------------------------------------------------------------------- 1 | = Common (Tokens) 2 | 3 | Functionality that is common to multiple token standards. 4 | 5 | * {ERC2981}: NFT Royalties compatible with both ERC721 and ERC1155. 6 | ** For ERC721 consider {ERC721Royalty} which clears the royalty information from storage on burn. 7 | 8 | == Contracts 9 | 10 | {{ERC2981}} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/utils/Context.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Provides information about the current execution context, including the 8 | * sender of the transaction and its data. While these are generally available 9 | * via msg.sender and msg.data, they should not be accessed in such a direct 10 | * manner, since when dealing with meta-transactions the account sending and 11 | * paying for execution may not be the actual sender (as far as an application 12 | * is concerned). 13 | * 14 | * This contract is only required for intermediate, library-like contracts. 15 | */ 16 | abstract contract Context { 17 | function _msgSender() internal view virtual returns (address) { 18 | return msg.sender; 19 | } 20 | 21 | function _msgData() internal view virtual returns (bytes calldata) { 22 | return msg.data; 23 | } 24 | 25 | function _contextSuffixLength() internal view virtual returns (uint256) { 26 | return 0; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | import {IERC165} from "./IERC165.sol"; 7 | 8 | /** 9 | * @dev Implementation of the {IERC165} interface. 10 | * 11 | * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check 12 | * for the additional interface id that will be supported. For example: 13 | * 14 | * ```solidity 15 | * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { 16 | * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); 17 | * } 18 | * ``` 19 | */ 20 | abstract contract ERC165 is IERC165 { 21 | /** 22 | * @dev See {IERC165-supportsInterface}. 23 | */ 24 | function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { 25 | return interfaceId == type(IERC165).interfaceId; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) 3 | 4 | pragma solidity ^0.8.20; 5 | 6 | /** 7 | * @dev Interface of the ERC165 standard, as defined in the 8 | * https://eips.ethereum.org/EIPS/eip-165[EIP]. 9 | * 10 | * Implementers can declare support of contract interfaces, which can then be 11 | * queried by others ({ERC165Checker}). 12 | * 13 | * For an implementation, see {ERC165}. 14 | */ 15 | interface IERC165 { 16 | /** 17 | * @dev Returns true if this contract implements the interface defined by 18 | * `interfaceId`. See the corresponding 19 | * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] 20 | * to learn more about how these ids are created. 21 | * 22 | * This function call must use less than 30 000 gas. 23 | */ 24 | function supportsInterface(bytes4 interfaceId) external view returns (bool); 25 | } 26 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = 'contracts' 3 | out = 'out' 4 | libs = ['node_modules', 'lib'] 5 | test = 'test' 6 | cache_path = 'cache_forge' 7 | 8 | [fuzz] 9 | runs = 10000 10 | max_test_rejects = 150000 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/hardhat/env-artifacts.js: -------------------------------------------------------------------------------- 1 | const { HardhatError } = require('hardhat/internal/core/errors'); 2 | 3 | // Modifies `artifacts.require(X)` so that instead of X it loads the XUpgradeable contract. 4 | // This allows us to run the same test suite on both the original and the transpiled and renamed Upgradeable contracts. 5 | 6 | extendEnvironment(env => { 7 | const artifactsRequire = env.artifacts.require; 8 | 9 | env.artifacts.require = name => { 10 | for (const suffix of ['UpgradeableWithInit', 'Upgradeable', '']) { 11 | try { 12 | return artifactsRequire(name + suffix); 13 | } catch (e) { 14 | // HH700: Artifact not found - from https://hardhat.org/hardhat-runner/docs/errors#HH700 15 | if (HardhatError.isHardhatError(e) && e.number === 700 && suffix !== '') { 16 | continue; 17 | } else { 18 | throw e; 19 | } 20 | } 21 | } 22 | throw new Error('Unreachable'); 23 | }; 24 | }); 25 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/hardhat/env-contract.js: -------------------------------------------------------------------------------- 1 | extendEnvironment(env => { 2 | const { contract } = env; 3 | 4 | env.contract = function (name, body) { 5 | const { takeSnapshot } = require('@nomicfoundation/hardhat-network-helpers'); 6 | 7 | contract(name, accounts => { 8 | // reset the state of the chain in between contract test suites 9 | let snapshot; 10 | 11 | before(async function () { 12 | snapshot = await takeSnapshot(); 13 | }); 14 | 15 | after(async function () { 16 | await snapshot.restore(); 17 | }); 18 | 19 | // remove the default account from the accounts list used in tests, in order 20 | // to protect tests against accidentally passing due to the contract 21 | // deployer being used subsequently as function caller 22 | body(accounts.slice(1)); 23 | }); 24 | }; 25 | }); 26 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js: -------------------------------------------------------------------------------- 1 | const { subtask } = require('hardhat/config'); 2 | const { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } = require('hardhat/builtin-tasks/task-names'); 3 | 4 | subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, __, runSuper) => 5 | (await runSuper()).filter(path => !path.endsWith('.t.sol')), 6 | ); 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/hardhat/task-test-get-files.js: -------------------------------------------------------------------------------- 1 | const { internalTask } = require('hardhat/config'); 2 | const { TASK_TEST_GET_TEST_FILES } = require('hardhat/builtin-tasks/task-names'); 3 | 4 | // Modifies `hardhat test` to skip the proxy tests after proxies are removed by the transpiler for upgradeability. 5 | 6 | internalTask(TASK_TEST_GET_TEST_FILES).setAction(async (args, hre, runSuper) => { 7 | const path = require('path'); 8 | const { promises: fs } = require('fs'); 9 | 10 | const hasProxies = await fs 11 | .access(path.join(hre.config.paths.sources, 'proxy/Proxy.sol')) 12 | .then(() => true) 13 | .catch(() => false); 14 | 15 | const ignoredIfProxy = [ 16 | 'proxy/beacon/BeaconProxy.test.js', 17 | 'proxy/beacon/UpgradeableBeacon.test.js', 18 | 'proxy/ERC1967/ERC1967Proxy.test.js', 19 | 'proxy/transparent/ProxyAdmin.test.js', 20 | 'proxy/transparent/TransparentUpgradeableProxy.test.js', 21 | 'proxy/utils/UUPSUpgradeable.test.js', 22 | ].map(p => path.join(hre.config.paths.tests, p)); 23 | 24 | return (await runSuper(args)).filter(file => hasProxies || !ignoredIfProxy.includes(file)); 25 | }); 26 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/.gitignore: -------------------------------------------------------------------------------- 1 | cache/ 2 | out/ 3 | .vscode 4 | .idea 5 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/ds-test"] 2 | path = lib/ds-test 3 | url = https://github.com/dapphub/ds-test 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | fs_permissions = [{ access = "read-write", path = "./"}] 3 | 4 | [rpc_endpoints] 5 | # The RPC URLs are modified versions of the default for testing initialization. 6 | mainnet = "https://mainnet.infura.io/v3/7a8769b798b642f6933f2ed52042bd70" # Different API key. 7 | optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash. 8 | arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash. 9 | needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" 10 | 11 | [fmt] 12 | # These are all the `forge fmt` defaults. 13 | line_length = 120 14 | tab_width = 4 15 | bracket_spacing = false 16 | int_types = 'long' 17 | multiline_func_header = 'attributes_first' 18 | quote_style = 'double' 19 | number_underscore = 'preserve' 20 | single_line_statement_blocks = 'preserve' 21 | ignore = ["src/console.sol", "src/console2.sol"] -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/.gitignore: -------------------------------------------------------------------------------- 1 | /.dapple 2 | /build 3 | /out 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/Makefile: -------------------------------------------------------------------------------- 1 | all:; dapp build 2 | 3 | test: 4 | -dapp --use solc:0.4.23 build 5 | -dapp --use solc:0.4.26 build 6 | -dapp --use solc:0.5.17 build 7 | -dapp --use solc:0.6.12 build 8 | -dapp --use solc:0.7.5 build 9 | 10 | demo: 11 | DAPP_SRC=demo dapp --use solc:0.7.5 build 12 | -hevm dapp-test --verbose 3 13 | 14 | .PHONY: test demo 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/default.nix: -------------------------------------------------------------------------------- 1 | { solidityPackage, dappsys }: solidityPackage { 2 | name = "ds-test"; 3 | src = ./src; 4 | } 5 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ds-test", 3 | "version": "1.0.0", 4 | "description": "Assertions, equality checks and other test helpers ", 5 | "bugs": "https://github.com/dapphub/ds-test/issues", 6 | "license": "GPL-3.0", 7 | "author": "Contributors to ds-test", 8 | "files": [ 9 | "src/*" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/dapphub/ds-test.git" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-std", 3 | "version": "1.2.0", 4 | "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", 5 | "homepage": "https://book.getfoundry.sh/forge/forge-std", 6 | "bugs": "https://github.com/foundry-rs/forge-std/issues", 7 | "license": "(Apache-2.0 OR MIT)", 8 | "author": "Contributors to Forge Standard Library", 9 | "files": [ 10 | "src/*" 11 | ], 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/foundry-rs/forge-std.git" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/src/Script.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | // 💬 ABOUT 5 | // Standard Library's default Script. 6 | 7 | // 🧩 MODULES 8 | import {ScriptBase} from "./Base.sol"; 9 | import {console} from "./console.sol"; 10 | import {console2} from "./console2.sol"; 11 | import {StdChains} from "./StdChains.sol"; 12 | import {StdCheatsSafe} from "./StdCheats.sol"; 13 | import {stdJson} from "./StdJson.sol"; 14 | import {stdMath} from "./StdMath.sol"; 15 | import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; 16 | import {StdUtils} from "./StdUtils.sol"; 17 | import {VmSafe} from "./Vm.sol"; 18 | 19 | // 📦 BOILERPLATE 20 | import {ScriptBase} from "./Base.sol"; 21 | 22 | // ⭐️ SCRIPT 23 | abstract contract Script is StdChains, StdCheatsSafe, StdUtils, ScriptBase { 24 | // Note: IS_SCRIPT() must return true. 25 | bool public IS_SCRIPT = true; 26 | } 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test 3 | pragma solidity >=0.6.2 <0.9.0; 4 | 5 | library stdError { 6 | bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); 7 | bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); 8 | bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); 9 | bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); 10 | bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); 11 | bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); 12 | bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); 13 | bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); 14 | bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); 15 | } 16 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/src/Test.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | // 💬 ABOUT 5 | // Standard Library's default Test 6 | 7 | // 🧩 MODULES 8 | import {console} from "./console.sol"; 9 | import {console2} from "./console2.sol"; 10 | import {StdAssertions} from "./StdAssertions.sol"; 11 | import {StdChains} from "./StdChains.sol"; 12 | import {StdCheats} from "./StdCheats.sol"; 13 | import {stdError} from "./StdError.sol"; 14 | import {stdJson} from "./StdJson.sol"; 15 | import {stdMath} from "./StdMath.sol"; 16 | import {StdStorage, stdStorage} from "./StdStorage.sol"; 17 | import {StdUtils} from "./StdUtils.sol"; 18 | import {Vm} from "./Vm.sol"; 19 | 20 | // 📦 BOILERPLATE 21 | import {TestBase} from "./Base.sol"; 22 | import {DSTest} from "ds-test/test.sol"; 23 | 24 | // ⭐️ TEST 25 | abstract contract Test is DSTest, StdAssertions, StdChains, StdCheats, StdUtils, TestBase { 26 | // Note: IS_TEST() must return true. 27 | // Note: Must have failure system, https://github.com/dapphub/ds-test/blob/cd98eff28324bfac652e63a239a60632a761790b/src/test.sol#L39-L76. 28 | } 29 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2; 3 | 4 | interface IERC165 { 5 | /// @notice Query if a contract implements an interface 6 | /// @param interfaceID The interface identifier, as specified in ERC-165 7 | /// @dev Interface identification is specified in ERC-165. This function 8 | /// uses less than 30,000 gas. 9 | /// @return `true` if the contract implements `interfaceID` and 10 | /// `interfaceID` is not 0xffffffff, `false` otherwise 11 | function supportsInterface(bytes4 interfaceID) external view returns (bool); 12 | } 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Script.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationScript is Script {} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Script.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationScriptBase is ScriptBase {} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Test.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationTest is Test {} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.6.2 <0.9.0; 3 | 4 | pragma experimental ABIEncoderV2; 5 | 6 | import "../../src/Test.sol"; 7 | 8 | // The purpose of this contract is to benchmark compilation time to avoid accidentally introducing 9 | // a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 10 | contract CompilationTestBase is TestBase {} 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run docs" 3 | publish = "build/site" 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/remappings.txt: -------------------------------------------------------------------------------- 1 | @openzeppelin/contracts/=contracts/ 2 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["github>OpenZeppelin/configs"], 3 | "labels": ["ignore-changeset"] 4 | } 5 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/requirements.txt: -------------------------------------------------------------------------------- 1 | certora-cli==4.8.0 2 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/checks/compare-layout.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const { getStorageUpgradeReport } = require('@openzeppelin/upgrades-core/dist/storage'); 3 | 4 | const { ref, head } = require('yargs').argv; 5 | 6 | const oldLayout = JSON.parse(fs.readFileSync(ref)); 7 | const newLayout = JSON.parse(fs.readFileSync(head)); 8 | 9 | for (const name in oldLayout) { 10 | if (name in newLayout) { 11 | const report = getStorageUpgradeReport(oldLayout[name], newLayout[name], {}); 12 | if (!report.ok) { 13 | console.log(`Storage layout incompatilibity found in ${name}:`); 14 | console.log(report.explain()); 15 | process.exitCode = 1; 16 | } 17 | } else { 18 | console.log(`WARNING: ${name} is missing from the current branch`); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/checks/generation.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | npm run generate 6 | git diff -R --exit-code 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/generate/format-lines.js: -------------------------------------------------------------------------------- 1 | function formatLines(...lines) { 2 | return [...indentEach(0, lines)].join('\n') + '\n'; 3 | } 4 | 5 | function* indentEach(indent, lines) { 6 | for (const line of lines) { 7 | if (Array.isArray(line)) { 8 | yield* indentEach(indent + 1, line); 9 | } else { 10 | const padding = ' '.repeat(indent); 11 | yield* line.split('\n').map(subline => (subline === '' ? '' : padding + subline)); 12 | } 13 | } 14 | } 15 | 16 | module.exports = formatLines; 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js: -------------------------------------------------------------------------------- 1 | // OPTIONS 2 | const VALUE_SIZES = [224, 208, 160]; 3 | 4 | const defaultOpts = size => ({ 5 | historyTypeName: `Trace${size}`, 6 | checkpointTypeName: `Checkpoint${size}`, 7 | checkpointFieldName: '_checkpoints', 8 | keyTypeName: `uint${256 - size}`, 9 | keyFieldName: '_key', 10 | valueTypeName: `uint${size}`, 11 | valueFieldName: '_value', 12 | }); 13 | 14 | module.exports = { 15 | VALUE_SIZES, 16 | OPTS: VALUE_SIZES.map(size => defaultOpts(size)), 17 | }; 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/generate/templates/conversion.js: -------------------------------------------------------------------------------- 1 | function toBytes32(type, value) { 2 | switch (type) { 3 | case 'bytes32': 4 | return value; 5 | case 'uint256': 6 | return `bytes32(${value})`; 7 | case 'address': 8 | return `bytes32(uint256(uint160(${value})))`; 9 | default: 10 | throw new Error(`Conversion from ${type} to bytes32 not supported`); 11 | } 12 | } 13 | 14 | function fromBytes32(type, value) { 15 | switch (type) { 16 | case 'bytes32': 17 | return value; 18 | case 'uint256': 19 | return `uint256(${value})`; 20 | case 'address': 21 | return `address(uint160(uint256(${value})))`; 22 | default: 23 | throw new Error(`Conversion from bytes32 to ${type} not supported`); 24 | } 25 | } 26 | 27 | module.exports = { 28 | toBytes32, 29 | fromBytes32, 30 | }; 31 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/git-user-config.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail -x 4 | 5 | git config user.name 'github-actions' 6 | git config user.email '41898282+github-actions[bot]@users.noreply.github.com' 7 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/helpers.js: -------------------------------------------------------------------------------- 1 | function chunk(array, size = 1) { 2 | return Array.range(Math.ceil(array.length / size)).map(i => array.slice(i * size, i * size + size)); 3 | } 4 | 5 | function range(start, stop = undefined, step = 1) { 6 | if (!stop) { 7 | stop = start; 8 | start = 0; 9 | } 10 | return start < stop 11 | ? Array(Math.ceil((stop - start) / step)) 12 | .fill() 13 | .map((_, i) => start + i * step) 14 | : []; 15 | } 16 | 17 | function unique(array, op = x => x) { 18 | return array.filter((obj, i) => array.findIndex(entry => op(obj) === op(entry)) === i); 19 | } 20 | 21 | function zip(...args) { 22 | return Array(Math.max(...args.map(arg => arg.length))) 23 | .fill(null) 24 | .map((_, i) => args.map(arg => arg[i])); 25 | } 26 | 27 | function capitalize(str) { 28 | return str.charAt(0).toUpperCase() + str.slice(1); 29 | } 30 | 31 | module.exports = { 32 | chunk, 33 | range, 34 | unique, 35 | zip, 36 | capitalize, 37 | }; 38 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/prepack.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | shopt -s globstar 5 | 6 | # cross platform `mkdir -p` 7 | mkdirp() { 8 | node -e "fs.mkdirSync('$1', { recursive: true })" 9 | } 10 | 11 | # cd to the root of the repo 12 | cd "$(git rev-parse --show-toplevel)" 13 | 14 | npm run clean 15 | 16 | env COMPILE_MODE=production npm run compile 17 | 18 | mkdirp contracts/build/contracts 19 | cp artifacts/contracts/**/*.json contracts/build/contracts 20 | rm contracts/build/contracts/*.dbg.json 21 | node scripts/remove-ignored-artifacts.js 22 | 23 | cp README.md contracts/ 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/prepare-docs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | shopt -s globstar 5 | 6 | OUTDIR="$(node -p 'require("./docs/config.js").outputDir')" 7 | 8 | if [ ! -d node_modules ]; then 9 | npm ci 10 | fi 11 | 12 | rm -rf "$OUTDIR" 13 | 14 | hardhat docgen 15 | 16 | # copy examples and adjust imports 17 | examples_source_dir="contracts/mocks/docs" 18 | examples_target_dir="docs/modules/api/examples" 19 | 20 | for f in "$examples_source_dir"/**/*.sol; do 21 | name="${f/#"$examples_source_dir/"/}" 22 | mkdir -p "$examples_target_dir/$(dirname "$name")" 23 | sed -Ee '/^import/s|"(\.\./)+|"@openzeppelin/contracts/|' "$f" > "$examples_target_dir/$name" 24 | done 25 | 26 | node scripts/gen-nav.js "$OUTDIR" > "$OUTDIR/../nav.adoc" 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/synchronize-versions.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Synchronizes the version in contracts/package.json with the one in package.json. 4 | // This is run automatically when npm version is run. 5 | 6 | const fs = require('fs'); 7 | 8 | setVersion('package.json', 'contracts/package.json'); 9 | 10 | function setVersion(from, to) { 11 | const fromJson = JSON.parse(fs.readFileSync(from)); 12 | const toJson = JSON.parse(fs.readFileSync(to)); 13 | toJson.version = fromJson.version; 14 | fs.writeFileSync(to, JSON.stringify(toJson, null, 2) + '\n'); 15 | } 16 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/version.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | changeset version 6 | 7 | scripts/release/format-changelog.js 8 | scripts/release/synchronize-versions.js 9 | scripts/release/update-comment.js 10 | 11 | oz-docs update-version 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | npx changeset pre exit rc 6 | git add . 7 | git commit -m "Exit release candidate" 8 | git push origin 9 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | CHECKSUMS="$RUNNER_TEMP/checksums.txt" 6 | 7 | # Extract tarball content into a tmp directory 8 | tar xf "$TARBALL" -C "$RUNNER_TEMP" 9 | 10 | # Move to extracted directory 11 | cd "$RUNNER_TEMP/package" 12 | 13 | # Checksum all Solidity files 14 | find . -type f -name "*.sol" | xargs shasum > "$CHECKSUMS" 15 | 16 | # Back to directory with git contents 17 | cd "$GITHUB_WORKSPACE/contracts" 18 | 19 | # Check against tarball contents 20 | shasum -c "$CHECKSUMS" 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/pack.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | dist_tag() { 6 | PACKAGE_JSON_NAME="$(jq -r .name ./package.json)" 7 | LATEST_NPM_VERSION="$(npm info "$PACKAGE_JSON_NAME" version)" 8 | PACKAGE_JSON_VERSION="$(jq -r .version ./package.json)" 9 | 10 | if [ "$PRERELEASE" = "true" ]; then 11 | echo "next" 12 | elif npx semver -r ">$LATEST_NPM_VERSION" "$PACKAGE_JSON_VERSION" > /dev/null; then 13 | echo "latest" 14 | else 15 | # This is a patch for an older version 16 | # npm can't publish without a tag 17 | echo "tmp" 18 | fi 19 | } 20 | 21 | cd contracts 22 | TARBALL="$(npm pack | tee /dev/stderr | tail -1)" 23 | echo "tarball_name=$TARBALL" >> $GITHUB_OUTPUT 24 | echo "tarball=$(pwd)/$TARBALL" >> $GITHUB_OUTPUT 25 | echo "tag=$(dist_tag)" >> $GITHUB_OUTPUT 26 | cd .. 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/publish.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | PACKAGE_JSON_NAME="$(tar xfO "$TARBALL" package/package.json | jq -r .name)" 6 | PACKAGE_JSON_VERSION="$(tar xfO "$TARBALL" package/package.json | jq -r .version)" 7 | 8 | # Intentionally escape $ to avoid interpolation and writing the token to disk 9 | echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc 10 | 11 | # Actual publish 12 | npm publish "$TARBALL" --tag "$TAG" 13 | 14 | # Clean up tags 15 | delete_tag() { 16 | npm dist-tag rm "$PACKAGE_JSON_NAME" "$1" 17 | } 18 | 19 | if [ "$TAG" = tmp ]; then 20 | delete_tag "$TAG" 21 | elif [ "$TAG" = latest ]; then 22 | # Delete the next tag if it exists and is a prerelease for what is currently being published 23 | if npm dist-tag ls "$PACKAGE_JSON_NAME" | grep -q "next: $PACKAGE_JSON_VERSION"; then 24 | delete_tag next 25 | fi 26 | fi 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/rerun.js: -------------------------------------------------------------------------------- 1 | module.exports = ({ github, context }) => 2 | github.rest.actions.createWorkflowDispatch({ 3 | owner: context.repo.owner, 4 | repo: context.repo.repo, 5 | workflow_id: 'release-cycle.yml', 6 | ref: process.env.REF || process.env.GITHUB_REF_NAME, 7 | }); 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js: -------------------------------------------------------------------------------- 1 | const { coerce, inc, rsort } = require('semver'); 2 | const { join } = require('path'); 3 | const { version } = require(join(__dirname, '../../../package.json')); 4 | 5 | module.exports = async ({ core }) => { 6 | // Variables not in the context 7 | const refName = process.env.GITHUB_REF_NAME; 8 | 9 | // Compare package.json version's next patch vs. first version patch 10 | // A recently opened branch will give the next patch for the previous minor 11 | // So, we get the max against the patch 0 of the release branch's version 12 | const branchPatch0 = coerce(refName.replace('release-v', '')).version; 13 | const packageJsonNextPatch = inc(version, 'patch'); 14 | const [nextVersion] = rsort([branchPatch0, packageJsonNextPatch], false); 15 | 16 | core.exportVariable('TITLE', `Release v${nextVersion}`); 17 | }; 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/solhint-custom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solhint-plugin-openzeppelin", 3 | "version": "0.0.0", 4 | "private": true 5 | } 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | DIRNAME="$(dirname -- "${BASH_SOURCE[0]}")" 6 | PATCH="$DIRNAME/upgradeable.patch" 7 | 8 | error() { 9 | echo Error: "$*" >&2 10 | exit 1 11 | } 12 | 13 | if ! git diff-files --quiet ":!$PATCH" || ! git diff-index --quiet HEAD ":!$PATCH"; then 14 | error "Repository must have no staged or unstaged changes" 15 | fi 16 | 17 | if ! git apply -3 "$PATCH"; then 18 | error "Fix conflicts and run $DIRNAME/patch-save.sh" 19 | fi 20 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | DIRNAME="$(dirname -- "${BASH_SOURCE[0]}")" 6 | PATCH="$DIRNAME/upgradeable.patch" 7 | 8 | error() { 9 | echo Error: "$*" >&2 10 | exit 1 11 | } 12 | 13 | if ! git diff-files --quiet ":!$PATCH"; then 14 | error "Unstaged changes. Stage to include in patch or temporarily stash." 15 | fi 16 | 17 | git diff-index --cached --patch --output="$PATCH" HEAD 18 | git restore --staged --worktree ":!$PATCH" 19 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/slither.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "detectors_to_run": "arbitrary-send-erc20,array-by-reference,incorrect-shift,name-reused,rtlo,suicidal,uninitialized-state,uninitialized-storage,arbitrary-send-erc20-permit,controlled-array-length,controlled-delegatecall,delegatecall-loop,msg-value-loop,reentrancy-eth,unchecked-transfer,weak-prng,domain-separator-collision,erc20-interface,erc721-interface,locked-ether,mapping-deletion,shadowing-abstract,tautology,write-after-write,boolean-cst,reentrancy-no-eth,reused-constructor,tx-origin,unchecked-lowlevel,unchecked-send,variable-scope,void-cst,events-access,events-maths,incorrect-unary,boolean-equal,cyclomatic-complexity,deprecated-standards,erc20-indexed,function-init-state,pragma,unused-state,reentrancy-unlimited-gas,constable-states,immutable-states,var-read-using-this", 3 | "filter_paths": "contracts/mocks,contracts-exposed", 4 | "compile_force_framework": "hardhat" 5 | } 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/solhint.config.js: -------------------------------------------------------------------------------- 1 | const customRules = require('./scripts/solhint-custom'); 2 | 3 | const rules = [ 4 | 'no-unused-vars', 5 | 'const-name-snakecase', 6 | 'contract-name-camelcase', 7 | 'event-name-camelcase', 8 | 'func-name-mixedcase', 9 | 'func-param-name-mixedcase', 10 | 'modifier-name-mixedcase', 11 | 'var-name-mixedcase', 12 | 'imports-on-top', 13 | 'no-global-import', 14 | ...customRules.map(r => `openzeppelin/${r.ruleId}`), 15 | ]; 16 | 17 | module.exports = { 18 | plugins: ['openzeppelin'], 19 | rules: Object.fromEntries(rules.map(r => [r, 'error'])), 20 | }; 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/TESTING.md: -------------------------------------------------------------------------------- 1 | ## Testing 2 | 3 | Unit test are critical to OpenZeppelin Contracts. They help ensure code quality and mitigate against security vulnerabilities. The directory structure within the `/test` directory corresponds to the `/contracts` directory. 4 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/access/AccessControl.test.js: -------------------------------------------------------------------------------- 1 | const { DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl } = require('./AccessControl.behavior.js'); 2 | 3 | const AccessControl = artifacts.require('$AccessControl'); 4 | 5 | contract('AccessControl', function (accounts) { 6 | beforeEach(async function () { 7 | this.accessControl = await AccessControl.new({ from: accounts[0] }); 8 | await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, accounts[0]); 9 | }); 10 | 11 | shouldBehaveLikeAccessControl(...accounts); 12 | }); 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/access/extensions/AccessControlDefaultAdminRules.test.js: -------------------------------------------------------------------------------- 1 | const { time, constants, expectRevert } = require('@openzeppelin/test-helpers'); 2 | const { 3 | shouldBehaveLikeAccessControl, 4 | shouldBehaveLikeAccessControlDefaultAdminRules, 5 | } = require('../AccessControl.behavior.js'); 6 | 7 | const AccessControlDefaultAdminRules = artifacts.require('$AccessControlDefaultAdminRules'); 8 | 9 | contract('AccessControlDefaultAdminRules', function (accounts) { 10 | const delay = web3.utils.toBN(time.duration.hours(10)); 11 | 12 | beforeEach(async function () { 13 | this.accessControl = await AccessControlDefaultAdminRules.new(delay, accounts[0], { from: accounts[0] }); 14 | }); 15 | 16 | it('initial admin not zero', async function () { 17 | await expectRevert( 18 | AccessControlDefaultAdminRules.new(delay, constants.ZERO_ADDRESS), 19 | 'AccessControlInvalidDefaultAdmin', 20 | [constants.ZERO_ADDRESS], 21 | ); 22 | }); 23 | 24 | shouldBehaveLikeAccessControl(...accounts); 25 | shouldBehaveLikeAccessControlDefaultAdminRules(delay, ...accounts); 26 | }); 27 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/access/extensions/AccessControlEnumerable.test.js: -------------------------------------------------------------------------------- 1 | const { 2 | DEFAULT_ADMIN_ROLE, 3 | shouldBehaveLikeAccessControl, 4 | shouldBehaveLikeAccessControlEnumerable, 5 | } = require('../AccessControl.behavior.js'); 6 | 7 | const AccessControlEnumerable = artifacts.require('$AccessControlEnumerable'); 8 | 9 | contract('AccessControlEnumerable', function (accounts) { 10 | beforeEach(async function () { 11 | this.accessControl = await AccessControlEnumerable.new({ from: accounts[0] }); 12 | await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, accounts[0]); 13 | }); 14 | 15 | shouldBehaveLikeAccessControl(...accounts); 16 | shouldBehaveLikeAccessControlEnumerable(...accounts); 17 | }); 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/governance/utils/EIP6372.behavior.js: -------------------------------------------------------------------------------- 1 | const { clock } = require('../../helpers/time'); 2 | 3 | function shouldBehaveLikeEIP6372(mode = 'blocknumber') { 4 | describe('should implement EIP6372', function () { 5 | beforeEach(async function () { 6 | this.mock = this.mock ?? this.token ?? this.votes; 7 | }); 8 | 9 | it('clock is correct', async function () { 10 | expect(await this.mock.clock()).to.be.bignumber.equal(await clock[mode]().then(web3.utils.toBN)); 11 | }); 12 | 13 | it('CLOCK_MODE is correct', async function () { 14 | const params = new URLSearchParams(await this.mock.CLOCK_MODE()); 15 | expect(params.get('mode')).to.be.equal(mode); 16 | expect(params.get('from')).to.be.equal(mode == 'blocknumber' ? 'default' : null); 17 | }); 18 | }); 19 | } 20 | 21 | module.exports = { 22 | shouldBehaveLikeEIP6372, 23 | }; 24 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/account.js: -------------------------------------------------------------------------------- 1 | const { web3 } = require('hardhat'); 2 | const { impersonateAccount, setBalance } = require('@nomicfoundation/hardhat-network-helpers'); 3 | 4 | // Hardhat default balance 5 | const DEFAULT_BALANCE = web3.utils.toBN('10000000000000000000000'); 6 | 7 | async function impersonate(account, balance = DEFAULT_BALANCE) { 8 | await impersonateAccount(account); 9 | await setBalance(account, balance); 10 | } 11 | 12 | module.exports = { 13 | impersonate, 14 | }; 15 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/chainid.js: -------------------------------------------------------------------------------- 1 | const hre = require('hardhat'); 2 | 3 | async function getChainId() { 4 | const chainIdHex = await hre.network.provider.send('eth_chainId', []); 5 | return new hre.web3.utils.BN(chainIdHex, 'hex'); 6 | } 7 | 8 | module.exports = { 9 | getChainId, 10 | }; 11 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/constants.js: -------------------------------------------------------------------------------- 1 | const MAX_UINT48 = web3.utils.toBN(1).shln(48).subn(1).toString(); 2 | const MAX_UINT64 = web3.utils.toBN(1).shln(64).subn(1).toString(); 3 | 4 | module.exports = { 5 | MAX_UINT48, 6 | MAX_UINT64, 7 | }; 8 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/create.js: -------------------------------------------------------------------------------- 1 | const RLP = require('rlp'); 2 | 3 | function computeCreateAddress(deployer, nonce) { 4 | return web3.utils.toChecksumAddress(web3.utils.sha3(RLP.encode([deployer.address ?? deployer, nonce])).slice(-40)); 5 | } 6 | 7 | function computeCreate2Address(saltHex, bytecode, deployer) { 8 | return web3.utils.toChecksumAddress( 9 | web3.utils 10 | .sha3( 11 | `0x${['ff', deployer.address ?? deployer, saltHex, web3.utils.soliditySha3(bytecode)] 12 | .map(x => x.replace(/0x/, '')) 13 | .join('')}`, 14 | ) 15 | .slice(-40), 16 | ); 17 | } 18 | 19 | module.exports = { 20 | computeCreateAddress, 21 | computeCreate2Address, 22 | }; 23 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/enums.js: -------------------------------------------------------------------------------- 1 | function Enum(...options) { 2 | return Object.fromEntries(options.map((key, i) => [key, web3.utils.toBN(i)])); 3 | } 4 | 5 | module.exports = { 6 | Enum, 7 | ProposalState: Enum('Pending', 'Active', 'Canceled', 'Defeated', 'Succeeded', 'Queued', 'Expired', 'Executed'), 8 | VoteType: Enum('Against', 'For', 'Abstain'), 9 | Rounding: Enum('Floor', 'Ceil', 'Trunc', 'Expand'), 10 | OperationState: Enum('Unset', 'Waiting', 'Ready', 'Done'), 11 | }; 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/iterate.js: -------------------------------------------------------------------------------- 1 | // Map values in an object 2 | const mapValues = (obj, fn) => Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v)])); 3 | 4 | // Array of number or bigint 5 | const max = (...values) => values.slice(1).reduce((x, y) => (x > y ? x : y), values[0]); 6 | const min = (...values) => values.slice(1).reduce((x, y) => (x < y ? x : y), values[0]); 7 | 8 | // Cartesian product of a list of arrays 9 | const product = (...arrays) => arrays.reduce((a, b) => a.flatMap(ai => b.map(bi => [...ai, bi])), [[]]); 10 | 11 | module.exports = { 12 | mapValues, 13 | max, 14 | min, 15 | product, 16 | }; 17 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/math.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // sum of integer / bignumber 3 | sum: (...args) => args.reduce((acc, n) => acc + n, 0), 4 | BNsum: (...args) => args.reduce((acc, n) => acc.add(n), web3.utils.toBN(0)), 5 | // min of integer / bignumber 6 | min: (...args) => args.slice(1).reduce((x, y) => (x < y ? x : y), args[0]), 7 | BNmin: (...args) => args.slice(1).reduce((x, y) => (x.lt(y) ? x : y), args[0]), 8 | // max of integer / bignumber 9 | max: (...args) => args.slice(1).reduce((x, y) => (x > y ? x : y), args[0]), 10 | BNmax: (...args) => args.slice(1).reduce((x, y) => (x.gt(y) ? x : y), args[0]), 11 | }; 12 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/methods.js: -------------------------------------------------------------------------------- 1 | const { soliditySha3 } = require('web3-utils'); 2 | 3 | module.exports = { 4 | selector: signature => soliditySha3(signature).substring(0, 10), 5 | }; 6 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/helpers/time.js: -------------------------------------------------------------------------------- 1 | const ozHelpers = require('@openzeppelin/test-helpers'); 2 | const helpers = require('@nomicfoundation/hardhat-network-helpers'); 3 | 4 | module.exports = { 5 | clock: { 6 | blocknumber: () => helpers.time.latestBlock(), 7 | timestamp: () => helpers.time.latest(), 8 | }, 9 | clockFromReceipt: { 10 | blocknumber: receipt => Promise.resolve(receipt.blockNumber), 11 | timestamp: receipt => web3.eth.getBlock(receipt.blockNumber).then(block => block.timestamp), 12 | }, 13 | forward: { 14 | blocknumber: ozHelpers.time.advanceBlockTo, 15 | timestamp: helpers.time.increaseTo, 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js: -------------------------------------------------------------------------------- 1 | const shouldBehaveLikeProxy = require('../Proxy.behaviour'); 2 | 3 | const ERC1967Proxy = artifacts.require('ERC1967Proxy'); 4 | 5 | contract('ERC1967Proxy', function (accounts) { 6 | // `undefined`, `null` and other false-ish opts will not be forwarded. 7 | const createProxy = async function (implementation, initData, opts) { 8 | return ERC1967Proxy.new(implementation, initData, ...[opts].filter(Boolean)); 9 | }; 10 | 11 | shouldBehaveLikeProxy(createProxy, accounts); 12 | }); 13 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js: -------------------------------------------------------------------------------- 1 | const { BN } = require('@openzeppelin/test-helpers'); 2 | 3 | const { shouldBehaveLikeERC20Burnable } = require('./ERC20Burnable.behavior'); 4 | const ERC20Burnable = artifacts.require('$ERC20Burnable'); 5 | 6 | contract('ERC20Burnable', function (accounts) { 7 | const [owner, ...otherAccounts] = accounts; 8 | 9 | const initialBalance = new BN(1000); 10 | 11 | const name = 'My Token'; 12 | const symbol = 'MTKN'; 13 | 14 | beforeEach(async function () { 15 | this.token = await ERC20Burnable.new(name, symbol, { from: owner }); 16 | await this.token.$_mint(owner, initialBalance); 17 | }); 18 | 19 | shouldBehaveLikeERC20Burnable(owner, initialBalance, otherAccounts); 20 | }); 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js: -------------------------------------------------------------------------------- 1 | const { ether } = require('@openzeppelin/test-helpers'); 2 | const { shouldBehaveLikeERC20Capped } = require('./ERC20Capped.behavior'); 3 | const { expectRevertCustomError } = require('../../../helpers/customError'); 4 | 5 | const ERC20Capped = artifacts.require('$ERC20Capped'); 6 | 7 | contract('ERC20Capped', function (accounts) { 8 | const cap = ether('1000'); 9 | 10 | const name = 'My Token'; 11 | const symbol = 'MTKN'; 12 | 13 | it('requires a non-zero cap', async function () { 14 | await expectRevertCustomError(ERC20Capped.new(name, symbol, 0), 'ERC20InvalidCap', [0]); 15 | }); 16 | 17 | context('once deployed', async function () { 18 | beforeEach(async function () { 19 | this.token = await ERC20Capped.new(name, symbol, cap); 20 | }); 21 | 22 | shouldBehaveLikeERC20Capped(accounts, cap); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js: -------------------------------------------------------------------------------- 1 | const { shouldBehaveLikeERC721, shouldBehaveLikeERC721Metadata } = require('./ERC721.behavior'); 2 | 3 | const ERC721 = artifacts.require('$ERC721'); 4 | 5 | contract('ERC721', function (accounts) { 6 | const name = 'Non Fungible Token'; 7 | const symbol = 'NFT'; 8 | 9 | beforeEach(async function () { 10 | this.token = await ERC721.new(name, symbol); 11 | }); 12 | 13 | shouldBehaveLikeERC721(...accounts); 14 | shouldBehaveLikeERC721Metadata(name, symbol, ...accounts); 15 | }); 16 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js: -------------------------------------------------------------------------------- 1 | const { 2 | shouldBehaveLikeERC721, 3 | shouldBehaveLikeERC721Metadata, 4 | shouldBehaveLikeERC721Enumerable, 5 | } = require('./ERC721.behavior'); 6 | 7 | const ERC721Enumerable = artifacts.require('$ERC721Enumerable'); 8 | 9 | contract('ERC721Enumerable', function (accounts) { 10 | const name = 'Non Fungible Token'; 11 | const symbol = 'NFT'; 12 | 13 | beforeEach(async function () { 14 | this.token = await ERC721Enumerable.new(name, symbol); 15 | }); 16 | 17 | shouldBehaveLikeERC721(...accounts); 18 | shouldBehaveLikeERC721Metadata(name, symbol, ...accounts); 19 | shouldBehaveLikeERC721Enumerable(...accounts); 20 | }); 21 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai'); 2 | 3 | const ERC721Holder = artifacts.require('$ERC721Holder'); 4 | const ERC721 = artifacts.require('$ERC721'); 5 | 6 | contract('ERC721Holder', function (accounts) { 7 | const [owner] = accounts; 8 | 9 | const name = 'Non Fungible Token'; 10 | const symbol = 'NFT'; 11 | const tokenId = web3.utils.toBN(1); 12 | 13 | it('receives an ERC721 token', async function () { 14 | const token = await ERC721.new(name, symbol); 15 | await token.$_mint(owner, tokenId); 16 | 17 | const receiver = await ERC721Holder.new(); 18 | await token.safeTransferFrom(owner, receiver.address, tokenId, { from: owner }); 19 | 20 | expect(await token.ownerOf(tokenId)).to.be.equal(receiver.address); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/utils/Context.test.js: -------------------------------------------------------------------------------- 1 | require('@openzeppelin/test-helpers'); 2 | 3 | const ContextMock = artifacts.require('ContextMock'); 4 | const ContextMockCaller = artifacts.require('ContextMockCaller'); 5 | 6 | const { shouldBehaveLikeRegularContext } = require('./Context.behavior'); 7 | 8 | contract('Context', function (accounts) { 9 | const [sender] = accounts; 10 | 11 | beforeEach(async function () { 12 | this.context = await ContextMock.new(); 13 | this.caller = await ContextMockCaller.new(); 14 | }); 15 | 16 | shouldBehaveLikeRegularContext(sender); 17 | }); 18 | -------------------------------------------------------------------------------- /lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js: -------------------------------------------------------------------------------- 1 | const { shouldSupportInterfaces } = require('./SupportsInterface.behavior'); 2 | 3 | const ERC165 = artifacts.require('$ERC165'); 4 | 5 | contract('ERC165', function () { 6 | beforeEach(async function () { 7 | this.mock = await ERC165.new(); 8 | }); 9 | 10 | shouldSupportInterfaces(['ERC165']); 11 | }); 12 | -------------------------------------------------------------------------------- /out_of_scope.txt: -------------------------------------------------------------------------------- 1 | ./script/PrelaunchPoints.s.sol 2 | ./src/interfaces/ILpETH.sol 3 | ./src/interfaces/ILpETHVault.sol 4 | ./src/interfaces/IWETH.sol 5 | ./src/mock/AttackContract.sol 6 | ./src/mock/MockERC20.sol 7 | ./src/mock/MockLRT.sol 8 | ./src/mock/MockLpETH.sol 9 | ./src/mock/MockLpETHVault.sol 10 | ./test/PrelaunchPoints.t.sol -------------------------------------------------------------------------------- /remappings.txt: -------------------------------------------------------------------------------- 1 | forge-std/=lib/forge-std/src/ 2 | @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ -------------------------------------------------------------------------------- /scope.txt: -------------------------------------------------------------------------------- 1 | ./src/PrelaunchPoints.sol -------------------------------------------------------------------------------- /screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_1.png -------------------------------------------------------------------------------- /screenshot_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_2.JPG -------------------------------------------------------------------------------- /screenshot_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_2.png -------------------------------------------------------------------------------- /screenshot_3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_3.JPG -------------------------------------------------------------------------------- /screenshot_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_3.png -------------------------------------------------------------------------------- /screenshot_4.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_4.JPG -------------------------------------------------------------------------------- /screenshot_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-05-loop/20d9013a93a1ba98154198d6cf3c63f73ab95658/screenshot_4.png -------------------------------------------------------------------------------- /script/PrelaunchPoints.s.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Script.sol"; 5 | import "forge-std/console.sol"; 6 | import "../src/PrelaunchPoints.sol"; 7 | 8 | contract PrelaunchPointsScript is Script { 9 | address constant EXCHANGE_PROXY = 0xDef1C0ded9bec7F1a1670819833240f027b25EfF; // Mainnet & Sepolia 10 | address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // Mainnet 11 | address[] public allowedTokens; 12 | 13 | function setUp() public {} 14 | 15 | function run() public { 16 | uint256 privateKey = vm.envUint("PRIVATE_KEY"); 17 | address deployer = vm.addr(privateKey); 18 | console.log("Deployer Account", deployer); 19 | 20 | vm.broadcast(privateKey); 21 | new PrelaunchPoints(EXCHANGE_PROXY, WETH, allowedTokens); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/interfaces/ILpETH.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity 0.8.20; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; 5 | 6 | interface ILpETH is IERC20 { 7 | function deposit(address receiver) external payable returns (uint256); 8 | } 9 | -------------------------------------------------------------------------------- /src/interfaces/ILpETHVault.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity 0.8.20; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; 5 | 6 | interface ILpETHVault is IERC20 { 7 | function stake(uint256 amount, address receiver) external returns (uint256); 8 | } 9 | -------------------------------------------------------------------------------- /src/interfaces/IWETH.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity >=0.5.0; 3 | 4 | interface IWETH { 5 | function deposit() external payable; 6 | function transfer(address to, uint256 value) external returns (bool); 7 | function withdraw(uint256) external; 8 | } 9 | -------------------------------------------------------------------------------- /src/mock/AttackContract.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity 0.8.20; 3 | 4 | import "../../src/PrelaunchPoints.sol"; 5 | 6 | contract AttackContract { 7 | PrelaunchPoints public prelaunchPoints; 8 | address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; 9 | bytes emptydata = new bytes(1); 10 | 11 | constructor(PrelaunchPoints _prelaunchPoints) { 12 | prelaunchPoints = _prelaunchPoints; 13 | } 14 | 15 | function attackWithdraw() external { 16 | prelaunchPoints.withdraw(ETH); 17 | } 18 | 19 | function attackClaim() external { 20 | prelaunchPoints.claim(ETH, 100, PrelaunchPoints.Exchange.UniswapV3, emptydata); 21 | } 22 | 23 | receive() external payable { 24 | if (address(prelaunchPoints).balance > 0) { 25 | prelaunchPoints.withdraw(ETH); 26 | } else { 27 | prelaunchPoints.claim(ETH, 100, PrelaunchPoints.Exchange.UniswapV3, emptydata); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/mock/MockERC20.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity 0.8.20; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 | 6 | contract ERC20Token is ERC20 { 7 | constructor() ERC20("Token", "TKN") {} 8 | 9 | function mint(address account, uint256 amount) external { 10 | _mint(account, amount); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/mock/MockLRT.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity 0.8.20; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 | 6 | contract LRToken is ERC20 { 7 | constructor() ERC20("LRT", "LRT") {} 8 | 9 | function mint(address account, uint256 amount) external { 10 | _mint(account, amount); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/mock/MockLpETH.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity 0.8.20; 3 | 4 | import "../../src/interfaces/ILpETH.sol"; 5 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 6 | 7 | contract MockLpETH is ILpETH, ERC20 { 8 | constructor() ERC20("LoopETH", "lpETH") {} 9 | 10 | function deposit(address receiver) external payable returns (uint256) { 11 | super._mint(receiver, msg.value); 12 | return msg.value; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/mock/MockLpETHVault.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity 0.8.20; 3 | 4 | import "../../src/interfaces/ILpETHVault.sol"; 5 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 6 | 7 | contract MockLpETHVault is ILpETHVault, ERC20 { 8 | constructor() ERC20("Staked LoopETH", "stlpETH") {} 9 | 10 | function stake(uint256 amount, address receiver) external returns (uint256) { 11 | _mint(receiver, amount); 12 | return amount; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "commonjs", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "resolveJsonModule": true 10 | }, 11 | "exclude": ["dist", "node_modules"], 12 | "include": ["./test", "./scripts"], 13 | "files": ["./hardhat.config.ts"] 14 | } 15 | --------------------------------------------------------------------------------