├── .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 |
--------------------------------------------------------------------------------