├── .DS_Store ├── .gitignore ├── .gitmodules ├── 4naly3er-report.md ├── README.md ├── audits └── HYDN_-_Revert_Finance_Vault_Audit_Report.docx.pdf ├── bot-report.json ├── bot-report.md ├── discord-export ├── Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html ├── Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files │ ├── 0-EB806.png │ ├── 02410a37de8a54f8cfb7a8842a2dd162-D2755.png │ ├── 045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png │ ├── 06007823cf9ba08c135053b30354a9c1-C25F2.png │ ├── 0ab6fddedfdca4dee0b54ab41ab4faad-3EFDA.png │ ├── 0bb949d30436a6064281c56d2b7c8591-06A7C.png │ ├── 0cf7719f20f0aaed168c3f31a3f0bceb-8014C.png │ ├── 1-B2132.png │ ├── 1080667809002037320-8957D.png │ ├── 1083068770823721071-EE4F6.png │ ├── 1162a888c78000773591a5db6de8aa9f-DCF7E.png │ ├── 146464eb9e5f1322355fc03324ad0077-EA70E.png │ ├── 178dabd907133bbea3b2d27c723cb8c7-134C8.png │ ├── 1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png │ ├── 1f389-5C738.svg │ ├── 1f3c1-445DC.svg │ ├── 1f3c6-621A1.svg │ ├── 1f3fb-E58B7.svg │ ├── 1f43a-EB486.svg │ ├── 1f440-6C64D.svg │ ├── 1f44a-68C68.svg │ ├── 1f44b-8A059.svg │ ├── 1f44c-59547.svg │ ├── 1f44d-1f3fb-ED2AA.svg │ ├── 1f44d-27259.svg │ ├── 1f44f-3D381.svg │ ├── 1f480-94524.svg │ ├── 1f49c-71A75.svg │ ├── 1f4aa-2FD27.svg │ ├── 1f4af-4CFF5.svg │ ├── 1f4b8-E3468.svg │ ├── 1f4c6-44E30.svg │ ├── 1f4dc-AC641.svg │ ├── 1f50d-195C0.svg │ ├── 1f510-497D7.svg │ ├── 1f525-8FE4F.svg │ ├── 1f601-4E9BD.svg │ ├── 1f602-168C5.svg │ ├── 1f604-BF863.svg │ ├── 1f605-42B43.svg │ ├── 1f606-BE94E.svg │ ├── 1f609-9EC67.svg │ ├── 1f60a-3283D.svg │ ├── 1f622-BDD22.svg │ ├── 1f628-A279E.svg │ ├── 1f629-B734A.svg │ ├── 1f62d-02603.svg │ ├── 1f642-83E8A.svg │ ├── 1f64c-7C820.svg │ ├── 1f64f-22B8D.svg │ ├── 1f680-A35CE.svg │ ├── 1f6a8-A8AB3.svg │ ├── 1f911-F346C.svg │ ├── 1f914-15707.svg │ ├── 1f91d-5A0F2.svg │ ├── 1f923-5854E.svg │ ├── 1f92f-FF4E0.svg │ ├── 1f972-F415D.svg │ ├── 1f979-BE2CD.svg │ ├── 1f9d0-3E117.svg │ ├── 1f9d1-5BC80.svg │ ├── 1f9d9-72E2E.svg │ ├── 1faa8-32312.svg │ ├── 1fac798751f7f6f18d6072a51b1822f7-C1D2E.png │ ├── 1fae1-B19DE.svg │ ├── 2-ADBB4.png │ ├── 258a1ffc46d9e9c3872ad643ab9b4bd5-EE2DC.png │ ├── 2696-15F4A.svg │ ├── 2705-0589F.svg │ ├── 2753-7C696.svg │ ├── 2764-A3D25.svg │ ├── 2764-fe0f-200d-1f525-0B2B8.svg │ ├── 2de2bcb6fe2e5617e1d3dd4c56a5a8f1-DE975.png │ ├── 3-FB033.png │ ├── 357510ed1e5265aafb02bc7942ddaa82-01F7E.png │ ├── 38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png │ ├── 3fcb70ed63af9d6c70cb3d649756c18e-909F3.png │ ├── 4-4551A.png │ ├── 402b68164a51455e395a06ad04fc04b5-D7A38.png │ ├── 40faf496db7b4bbcab37bc04b134567d-EFC50.png │ ├── 453eac052c6c6b7a61d2f55848c5bdc6-FCF15.png │ ├── 4634554b26c5ac710fcace1ce468e6b4-DCDA1.png │ ├── 472e8696c1d575b51208a8571994c6bf-B0333.png │ ├── 4f6854913e980affbfbc43b285cf3a86-82FF4.png │ ├── 5-E9BDB.png │ ├── 5670644a203c9978f70dd87f62d41c88-8D213.png │ ├── 59ca4a1e13125aacb9d94d387c5d1a75-B378A.png │ ├── 5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png │ ├── 6678d08791c986738fd9018c9cb8212b-D895F.png │ ├── 67594ee4b4d1fc03bca468327a0d145b-BD76A.png │ ├── 68fc37db3374ea7fa8f5852491e70a0b-F2555.png │ ├── 6ff1e65c0976fd9df6010502da72f911-D2FA0.png │ ├── 701300a5bdd3bf5640bd1370251533e2-0DC47.png │ ├── 710415e40355cf160338551b97ba0e91-4B2B2.png │ ├── 750d791c21ffd3863332eea023124fa5-05646.png │ ├── 7885381f79dbd3683bc4b10d73ae53d3-B4D72.png │ ├── 80067b00f1403e326fab4a95fc1c6ab2-672B7.png │ ├── 8043f1de89cc1387981f4990ad574c08-78DE7.png │ ├── 81de5afcee192eff96d096ef9dc83ff5-1A385.png │ ├── 826b4ead4bcad3aab4d17c7b104be4cf-A978B.png │ ├── 851893827027075142-F23DF.png │ ├── 851893827089727568-5FD38.png │ ├── 851893827315826708-F59C0.png │ ├── 860bc8415fcb344bebcf89a301158ffd-36A89.png │ ├── 8646f8b4f073429bf27df27459ab18a2-F6800.png │ ├── 8e1e6b7afe5c831c070150953f563105-045AC.png │ ├── 928e195eed2822c2044c9027dd830457-CF2A2.png │ ├── 965cda047e6df3d7dbecdcc428c4f69e-32ACE.png │ ├── 96e1f00b8906ec1e8fb70a888d681191-9FBBA.png │ ├── 970d2e2f00cd7ef2134a1a3f21326349-404EA.png │ ├── 977133670429261884-CA8EA.png │ ├── 9b01adfea5eb85ed7f3fc2c94c3592c8-E96F4.png │ ├── 9c36d1d45e54c7a14319c861848b7fdc-D3324.png │ ├── IMG_7450-DFA49.png │ ├── Screenshot_2024-03-06_at_4.12.24_PM-F529F.png │ ├── Screenshot_2024-03-09_at_10.06.51_PM-069EC.png │ ├── Screenshot_2024-03-09_at_19.08.33-B7924.png │ ├── Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png │ ├── a1ad16db305d8fcd9d2d838a754ed15a-4BD83.png │ ├── a90b1cde3fba61e1776222d13459ffb9-73317.png │ ├── ab56604f47be905a2dd8aaaa2e4dc581-35F20.png │ ├── ab71f50e658a4df624ce464207ef4d15-EBFC1.png │ ├── b0fa46fcf237f5497b71eea9d38eeeeb-2A6D7.png │ ├── bdd37d345b2d35b5513f03a81143aa4a-51209.png │ ├── c47d52c806aea627c7b227b287ce8808-40688.png │ ├── c6b85a4a6ca07ab15a30a24f570be5b8-BA05C.png │ ├── c995ed92-96c5-4072-ae66-8ace89047379-192EA │ ├── c9cb30134c634c9e02d0c64df4922803-98E33.png │ ├── calculation-cat-AD8E3.mp4 │ ├── cd524f78cb8a7426f6497d2a56aa3931-9BF2F.png │ ├── cd592ac457423b8c7825515ff50245a0-0D6AF.png │ ├── d38725fdb3f22651bef3993cf902a61d-ABF61.png │ ├── d8e05392a6dee96280405f9825554ff7-54BEB.png │ ├── dc6e0072c993da12b699bb569417b6d1-25F7D.png │ ├── ddf6a89ae9aac05d44873a73357cce1a-DF8FF.png │ ├── discord-yeux-CCB71.mp4 │ ├── e31111c0206bbcd02dbc72a8c2a32a08-80083.png │ ├── e5f8f3f0a843c96dab98ff3adaad0ce2-5C05F.png │ ├── e9e6661ca07bd2dbfb1c8b52d5b06bea-E3CA3.png │ ├── ead7bda50531bbe6590401e4a9b86e91-17A23.png │ ├── f343dffdc18677e7f1ad2875a5ea0753-DAC62.png │ ├── fd032d1c27ba593b4fbe6be4c074663d-78A1D.png │ ├── ff730b7432ebec86a6b365a12420f1c1-63F33.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 │ ├── harry-kane-shhh-42130.mp4 │ ├── highlight.min-D8D27.js │ ├── image-1FA7C.png │ ├── image-2224E.png │ ├── image-3F571.png │ ├── image-449EB.png │ ├── image-7120B.png │ ├── image-D4520.png │ ├── image-E6FDF.png │ ├── jPNG-C8BE7.PNG │ ├── lottie.min-99657.js │ ├── osita-osita-iheme-097C6.mp4 │ ├── revert-3ADCC.png │ ├── solarized-dark.min-BA98F.css │ ├── soon-tm-soon-46A64.mp4 │ ├── stay-calm-C513C.mp4 │ └── waiting-waiting-patiently-C4D47.mp4 ├── Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt └── Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files │ ├── IMG_7450-DFA49.png │ ├── Screenshot_2024-03-06_at_4.12.24_PM-F529F.png │ ├── Screenshot_2024-03-09_at_10.06.51_PM-069EC.png │ ├── Screenshot_2024-03-09_at_19.08.33-B7924.png │ ├── Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png │ ├── c995ed92-96c5-4072-ae66-8ace89047379-192EA │ ├── calculation-cat-D1D4E.png │ ├── discord-yeux-1CFF9.png │ ├── harry-kane-shhh-22E9E.png │ ├── image-1FA7C.png │ ├── image-2224E.png │ ├── image-3F571.png │ ├── image-449EB.png │ ├── image-7120B.png │ ├── image-D4520.png │ ├── image-E6FDF.png │ ├── jPNG-C8BE7.PNG │ ├── osita-osita-iheme-A954D.png │ ├── revert-3ADCC.png │ ├── soon-tm-soon-16B89.png │ ├── stay-calm-DDF2E.png │ └── waiting-waiting-patiently-C8F8A.png ├── foundry.toml ├── lib ├── AggregatorV3Interface.sol ├── IUniversalRouter.sol └── IWETH9.sol ├── remappings.txt ├── scope.txt ├── slither.config.json ├── slither.txt ├── src ├── .DS_Store ├── InterestRateModel.sol ├── V3Oracle.sol ├── V3Vault.sol ├── automators │ ├── AutoExit.sol │ └── Automator.sol ├── interfaces │ ├── IErrors.sol │ ├── IInterestRateModel.sol │ ├── IV3Oracle.sol │ └── IVault.sol ├── transformers │ ├── AutoCompound.sol │ ├── AutoRange.sol │ ├── LeverageTransformer.sol │ └── V3Utils.sol └── utils │ ├── FlashloanLiquidator.sol │ └── Swapper.sol └── test └── integration ├── InterestRateModel.t.sol ├── V3Oracle.t.sol ├── V3Utils.t.sol ├── V3Vault.t.sol └── automators ├── AutoCompound.t.sol ├── AutoExit.t.sol ├── AutoRange.t.sol └── AutomatorIntegrationTestBase.sol /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | coverage.json 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # TypeScript v1 declaration files 46 | typings/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | 76 | # parcel-bundler cache (https://parceljs.org/) 77 | .cache 78 | 79 | # Next.js build output 80 | .next 81 | 82 | # Nuxt.js build / generate output 83 | .nuxt 84 | dist 85 | 86 | # Gatsby files 87 | .cache/ 88 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 89 | # https://nextjs.org/blog/next-9-1#public-directory-support 90 | # public 91 | 92 | # vuepress build output 93 | .vuepress/dist 94 | 95 | # Serverless directories 96 | .serverless/ 97 | 98 | # FuseBox cache 99 | .fusebox/ 100 | 101 | # DynamoDB Local files 102 | .dynamodb/ 103 | 104 | # TernJS port file 105 | .tern-port 106 | 107 | # Foundry files 108 | /out 109 | /cache -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/v3-core"] 2 | path = lib/v3-core 3 | url = https://github.com/Uniswap/v3-core 4 | [submodule "lib/v3-periphery"] 5 | path = lib/v3-periphery 6 | url = https://github.com/Uniswap/v3-periphery 7 | [submodule "lib/openzeppelin-contracts"] 8 | path = lib/openzeppelin-contracts 9 | url = https://github.com/OpenZeppelin/openzeppelin-contracts 10 | [submodule "lib/permit2"] 11 | path = lib/permit2 12 | url = https://github.com/uniswap/permit2 13 | -------------------------------------------------------------------------------- /audits/HYDN_-_Revert_Finance_Vault_Audit_Report.docx.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/audits/HYDN_-_Revert_Finance_Vault_Audit_Report.docx.pdf -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0-EB806.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0-EB806.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/02410a37de8a54f8cfb7a8842a2dd162-D2755.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/02410a37de8a54f8cfb7a8842a2dd162-D2755.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/045bf49f3bb3ecd3ddfc009a6af823ba-EF9F6.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/06007823cf9ba08c135053b30354a9c1-C25F2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/06007823cf9ba08c135053b30354a9c1-C25F2.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0ab6fddedfdca4dee0b54ab41ab4faad-3EFDA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0ab6fddedfdca4dee0b54ab41ab4faad-3EFDA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0bb949d30436a6064281c56d2b7c8591-06A7C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0bb949d30436a6064281c56d2b7c8591-06A7C.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0cf7719f20f0aaed168c3f31a3f0bceb-8014C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/0cf7719f20f0aaed168c3f31a3f0bceb-8014C.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1-B2132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1-B2132.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1080667809002037320-8957D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1080667809002037320-8957D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1083068770823721071-EE4F6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1083068770823721071-EE4F6.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1162a888c78000773591a5db6de8aa9f-DCF7E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1162a888c78000773591a5db6de8aa9f-DCF7E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/146464eb9e5f1322355fc03324ad0077-EA70E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/146464eb9e5f1322355fc03324ad0077-EA70E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/178dabd907133bbea3b2d27c723cb8c7-134C8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/178dabd907133bbea3b2d27c723cb8c7-134C8.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1aea383fe7da3deeefb7a87fc44e7bca-D0D1A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f389-5C738.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f3c1-445DC.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f3c6-621A1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f3fb-E58B7.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f43a-EB486.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f440-6C64D.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44a-68C68.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44b-8A059.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44c-59547.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44d-1f3fb-ED2AA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44d-27259.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f44f-3D381.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f480-94524.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f49c-71A75.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f4aa-2FD27.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f4af-4CFF5.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f4b8-E3468.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f4c6-44E30.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f4dc-AC641.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f50d-195C0.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f510-497D7.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f525-8FE4F.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f601-4E9BD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f602-168C5.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f604-BF863.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f605-42B43.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f606-BE94E.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f609-9EC67.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f60a-3283D.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f622-BDD22.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f628-A279E.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f629-B734A.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f62d-02603.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f642-83E8A.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f64c-7C820.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f64f-22B8D.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f680-A35CE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f6a8-A8AB3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f911-F346C.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f914-15707.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f91d-5A0F2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f923-5854E.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f92f-FF4E0.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f972-F415D.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f979-BE2CD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f9d0-3E117.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f9d1-5BC80.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1f9d9-72E2E.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1faa8-32312.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1fac798751f7f6f18d6072a51b1822f7-C1D2E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1fac798751f7f6f18d6072a51b1822f7-C1D2E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/1fae1-B19DE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2-ADBB4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2-ADBB4.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/258a1ffc46d9e9c3872ad643ab9b4bd5-EE2DC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/258a1ffc46d9e9c3872ad643ab9b4bd5-EE2DC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2696-15F4A.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2705-0589F.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2753-7C696.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2764-A3D25.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2764-fe0f-200d-1f525-0B2B8.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2de2bcb6fe2e5617e1d3dd4c56a5a8f1-DE975.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/2de2bcb6fe2e5617e1d3dd4c56a5a8f1-DE975.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/3-FB033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/3-FB033.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/357510ed1e5265aafb02bc7942ddaa82-01F7E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/357510ed1e5265aafb02bc7942ddaa82-01F7E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/38f03be5a1f4fc5a8f06307bc43bae6c-8AA93.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/3fcb70ed63af9d6c70cb3d649756c18e-909F3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/3fcb70ed63af9d6c70cb3d649756c18e-909F3.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4-4551A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4-4551A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/402b68164a51455e395a06ad04fc04b5-D7A38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/402b68164a51455e395a06ad04fc04b5-D7A38.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/40faf496db7b4bbcab37bc04b134567d-EFC50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/40faf496db7b4bbcab37bc04b134567d-EFC50.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/453eac052c6c6b7a61d2f55848c5bdc6-FCF15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/453eac052c6c6b7a61d2f55848c5bdc6-FCF15.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4634554b26c5ac710fcace1ce468e6b4-DCDA1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4634554b26c5ac710fcace1ce468e6b4-DCDA1.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/472e8696c1d575b51208a8571994c6bf-B0333.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/472e8696c1d575b51208a8571994c6bf-B0333.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4f6854913e980affbfbc43b285cf3a86-82FF4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/4f6854913e980affbfbc43b285cf3a86-82FF4.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5-E9BDB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5-E9BDB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5670644a203c9978f70dd87f62d41c88-8D213.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5670644a203c9978f70dd87f62d41c88-8D213.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/59ca4a1e13125aacb9d94d387c5d1a75-B378A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/59ca4a1e13125aacb9d94d387c5d1a75-B378A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/5b71d15a9bcde45fd5520e3fb580eb53-E1A50.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/6678d08791c986738fd9018c9cb8212b-D895F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/6678d08791c986738fd9018c9cb8212b-D895F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/67594ee4b4d1fc03bca468327a0d145b-BD76A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/67594ee4b4d1fc03bca468327a0d145b-BD76A.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/68fc37db3374ea7fa8f5852491e70a0b-F2555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/68fc37db3374ea7fa8f5852491e70a0b-F2555.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/6ff1e65c0976fd9df6010502da72f911-D2FA0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/6ff1e65c0976fd9df6010502da72f911-D2FA0.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/701300a5bdd3bf5640bd1370251533e2-0DC47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/701300a5bdd3bf5640bd1370251533e2-0DC47.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/710415e40355cf160338551b97ba0e91-4B2B2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/710415e40355cf160338551b97ba0e91-4B2B2.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/750d791c21ffd3863332eea023124fa5-05646.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/750d791c21ffd3863332eea023124fa5-05646.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/7885381f79dbd3683bc4b10d73ae53d3-B4D72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/7885381f79dbd3683bc4b10d73ae53d3-B4D72.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/80067b00f1403e326fab4a95fc1c6ab2-672B7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/80067b00f1403e326fab4a95fc1c6ab2-672B7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8043f1de89cc1387981f4990ad574c08-78DE7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8043f1de89cc1387981f4990ad574c08-78DE7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/81de5afcee192eff96d096ef9dc83ff5-1A385.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/81de5afcee192eff96d096ef9dc83ff5-1A385.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/826b4ead4bcad3aab4d17c7b104be4cf-A978B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/826b4ead4bcad3aab4d17c7b104be4cf-A978B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827027075142-F23DF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827027075142-F23DF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827089727568-5FD38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827089727568-5FD38.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827315826708-F59C0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/851893827315826708-F59C0.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/860bc8415fcb344bebcf89a301158ffd-36A89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/860bc8415fcb344bebcf89a301158ffd-36A89.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8646f8b4f073429bf27df27459ab18a2-F6800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8646f8b4f073429bf27df27459ab18a2-F6800.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8e1e6b7afe5c831c070150953f563105-045AC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/8e1e6b7afe5c831c070150953f563105-045AC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/928e195eed2822c2044c9027dd830457-CF2A2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/928e195eed2822c2044c9027dd830457-CF2A2.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/965cda047e6df3d7dbecdcc428c4f69e-32ACE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/965cda047e6df3d7dbecdcc428c4f69e-32ACE.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/96e1f00b8906ec1e8fb70a888d681191-9FBBA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/96e1f00b8906ec1e8fb70a888d681191-9FBBA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/970d2e2f00cd7ef2134a1a3f21326349-404EA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/970d2e2f00cd7ef2134a1a3f21326349-404EA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/977133670429261884-CA8EA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/977133670429261884-CA8EA.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/9b01adfea5eb85ed7f3fc2c94c3592c8-E96F4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/9b01adfea5eb85ed7f3fc2c94c3592c8-E96F4.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/9c36d1d45e54c7a14319c861848b7fdc-D3324.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/9c36d1d45e54c7a14319c861848b7fdc-D3324.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/IMG_7450-DFA49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/IMG_7450-DFA49.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-06_at_4.12.24_PM-F529F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-06_at_4.12.24_PM-F529F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-09_at_10.06.51_PM-069EC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-09_at_10.06.51_PM-069EC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-09_at_19.08.33-B7924.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-09_at_19.08.33-B7924.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/a1ad16db305d8fcd9d2d838a754ed15a-4BD83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/a1ad16db305d8fcd9d2d838a754ed15a-4BD83.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/a90b1cde3fba61e1776222d13459ffb9-73317.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/a90b1cde3fba61e1776222d13459ffb9-73317.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ab56604f47be905a2dd8aaaa2e4dc581-35F20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ab56604f47be905a2dd8aaaa2e4dc581-35F20.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ab71f50e658a4df624ce464207ef4d15-EBFC1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ab71f50e658a4df624ce464207ef4d15-EBFC1.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/b0fa46fcf237f5497b71eea9d38eeeeb-2A6D7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/b0fa46fcf237f5497b71eea9d38eeeeb-2A6D7.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/bdd37d345b2d35b5513f03a81143aa4a-51209.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/bdd37d345b2d35b5513f03a81143aa4a-51209.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c47d52c806aea627c7b227b287ce8808-40688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c47d52c806aea627c7b227b287ce8808-40688.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c6b85a4a6ca07ab15a30a24f570be5b8-BA05C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c6b85a4a6ca07ab15a30a24f570be5b8-BA05C.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c995ed92-96c5-4072-ae66-8ace89047379-192EA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c995ed92-96c5-4072-ae66-8ace89047379-192EA -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c9cb30134c634c9e02d0c64df4922803-98E33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/c9cb30134c634c9e02d0c64df4922803-98E33.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/calculation-cat-AD8E3.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/calculation-cat-AD8E3.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/cd524f78cb8a7426f6497d2a56aa3931-9BF2F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/cd524f78cb8a7426f6497d2a56aa3931-9BF2F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/cd592ac457423b8c7825515ff50245a0-0D6AF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/cd592ac457423b8c7825515ff50245a0-0D6AF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/d38725fdb3f22651bef3993cf902a61d-ABF61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/d38725fdb3f22651bef3993cf902a61d-ABF61.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/d8e05392a6dee96280405f9825554ff7-54BEB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/d8e05392a6dee96280405f9825554ff7-54BEB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/dc6e0072c993da12b699bb569417b6d1-25F7D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/dc6e0072c993da12b699bb569417b6d1-25F7D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ddf6a89ae9aac05d44873a73357cce1a-DF8FF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ddf6a89ae9aac05d44873a73357cce1a-DF8FF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/discord-yeux-CCB71.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/discord-yeux-CCB71.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e31111c0206bbcd02dbc72a8c2a32a08-80083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e31111c0206bbcd02dbc72a8c2a32a08-80083.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e5f8f3f0a843c96dab98ff3adaad0ce2-5C05F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e5f8f3f0a843c96dab98ff3adaad0ce2-5C05F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e9e6661ca07bd2dbfb1c8b52d5b06bea-E3CA3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/e9e6661ca07bd2dbfb1c8b52d5b06bea-E3CA3.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ead7bda50531bbe6590401e4a9b86e91-17A23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ead7bda50531bbe6590401e4a9b86e91-17A23.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/f343dffdc18677e7f1ad2875a5ea0753-DAC62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/f343dffdc18677e7f1ad2875a5ea0753-DAC62.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/fd032d1c27ba593b4fbe6be4c074663d-78A1D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/fd032d1c27ba593b4fbe6be4c074663d-78A1D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ff730b7432ebec86a6b365a12420f1c1-63F33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ff730b7432ebec86a6b365a12420f1c1-63F33.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-400-E988B.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-400-E988B.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-500-0777F.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-500-0777F.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-600-CB411.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-600-CB411.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-700-891AC.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-700-891AC.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-800-D36B0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-italic-800-D36B0.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-400-1456D.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-400-1456D.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-500-89CE5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-500-89CE5.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-600-C1EA8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-600-C1EA8.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-700-1949A.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-700-1949A.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-800-58487.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/ggsans-normal-800-58487.woff2 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/harry-kane-shhh-42130.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/harry-kane-shhh-42130.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-1FA7C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-1FA7C.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-2224E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-2224E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-3F571.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-3F571.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-449EB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-449EB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-7120B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-7120B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-D4520.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-D4520.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-E6FDF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/image-E6FDF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/jPNG-C8BE7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/jPNG-C8BE7.PNG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/osita-osita-iheme-097C6.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/osita-osita-iheme-097C6.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/revert-3ADCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/revert-3ADCC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].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-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/soon-tm-soon-46A64.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/soon-tm-soon-46A64.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/stay-calm-C513C.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/stay-calm-C513C.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/waiting-waiting-patiently-C4D47.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].html_Files/waiting-waiting-patiently-C4D47.mp4 -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/IMG_7450-DFA49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/IMG_7450-DFA49.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-06_at_4.12.24_PM-F529F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-06_at_4.12.24_PM-F529F.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-09_at_10.06.51_PM-069EC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-09_at_10.06.51_PM-069EC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-09_at_19.08.33-B7924.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-09_at_19.08.33-B7924.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/Screenshot_2024-03-13_at_1.29.45_AM-BB79E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/c995ed92-96c5-4072-ae66-8ace89047379-192EA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/c995ed92-96c5-4072-ae66-8ace89047379-192EA -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/calculation-cat-D1D4E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/calculation-cat-D1D4E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/discord-yeux-1CFF9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/discord-yeux-1CFF9.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/harry-kane-shhh-22E9E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/harry-kane-shhh-22E9E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-1FA7C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-1FA7C.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-2224E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-2224E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-3F571.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-3F571.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-449EB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-449EB.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-7120B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-7120B.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-D4520.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-D4520.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-E6FDF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/image-E6FDF.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/jPNG-C8BE7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/jPNG-C8BE7.PNG -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/osita-osita-iheme-A954D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/osita-osita-iheme-A954D.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/revert-3ADCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/revert-3ADCC.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/soon-tm-soon-16B89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/soon-tm-soon-16B89.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/stay-calm-DDF2E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/stay-calm-DDF2E.png -------------------------------------------------------------------------------- /discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/waiting-waiting-patiently-C8F8A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/discord-export/Code4rena - ARCHIVE-Q1-2024 - revert-mar04 [1211733312561741824].txt_Files/waiting-waiting-patiently-C8F8A.png -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = 'src' 3 | out = 'out' 4 | libs = ['lib'] 5 | optimizer = true 6 | optimizer_runs = 200 7 | solc = "0.8.24" -------------------------------------------------------------------------------- /lib/AggregatorV3Interface.sol: -------------------------------------------------------------------------------- 1 | 2 | // SPDX-License-Identifier: MIT 3 | pragma solidity ^0.8.0; 4 | 5 | // needed chainlink interface for chainlink oracle feeds 6 | interface AggregatorV3Interface { 7 | function latestRoundData() external view returns ( 8 | uint80 roundId, 9 | int256 answer, 10 | uint256 startedAt, 11 | uint256 updatedAt, 12 | uint80 answeredInRound 13 | ); 14 | 15 | function decimals() external view returns (uint8); 16 | } -------------------------------------------------------------------------------- /lib/IUniversalRouter.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | pragma solidity ^0.8.0; 3 | 4 | interface IUniversalRouter { 5 | /// @notice Executes encoded commands along with provided inputs. Reverts if deadline has expired. 6 | /// @param commands A set of concatenated commands, each 1 byte in length 7 | /// @param inputs An array of byte strings containing abi encoded inputs for each command 8 | /// @param deadline The deadline by which the transaction must be executed 9 | function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable; 10 | } -------------------------------------------------------------------------------- /lib/IWETH9.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-2.0-or-later 2 | pragma solidity ^0.8.0; 3 | 4 | import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; 5 | 6 | /// @title Interface for WETH9 7 | interface IWETH9 is IERC20 { 8 | /// @notice Deposit ether to get wrapped ether 9 | function deposit() external payable; 10 | 11 | /// @notice Withdraw wrapped ether to get ether 12 | function withdraw(uint256) external; 13 | } 14 | -------------------------------------------------------------------------------- /remappings.txt: -------------------------------------------------------------------------------- 1 | @openzeppelin/=lib/openzeppelin-contracts/ 2 | @uniswap/v3-core/=lib/v3-core/ 3 | @uniswap/v3-periphery/=lib/v3-periphery/ 4 | v3-core/=lib/v3-core/contracts/ 5 | v3-periphery/=lib/v3-periphery/contracts/ 6 | permit2/=lib/permit2/src/ -------------------------------------------------------------------------------- /scope.txt: -------------------------------------------------------------------------------- 1 | src/V3Vault.sol 2 | src/V3Oracle.sol 3 | src/InterestRateModel.sol 4 | src/automators/AutoExit.sol 5 | src/automators/Automator.sol 6 | src/transformers/AutoCompound.sol 7 | src/transformers/AutoRange.sol 8 | src/transformers/LeverageTransformer.sol 9 | src/transformers/V3Utils.sol 10 | src/utils/FlashloanLiquidator.sol 11 | src/utils/Swapper.sol 12 | -------------------------------------------------------------------------------- /slither.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter_paths": "(/test/|/lib/)" 3 | } 4 | -------------------------------------------------------------------------------- /src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code-423n4/2024-03-revert-lend/62ad70e634082930aed861e153d2c1e0cc94e44e/src/.DS_Store -------------------------------------------------------------------------------- /src/InterestRateModel.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/access/Ownable.sol"; 5 | 6 | import "./interfaces/IInterestRateModel.sol"; 7 | import "./interfaces/IErrors.sol"; 8 | 9 | /// @title Model for interest rate calculation used in Vault 10 | /// @notice Calculates both borrow and supply rate 11 | contract InterestRateModel is Ownable, IInterestRateModel, IErrors { 12 | uint256 private constant Q96 = 2 ** 96; 13 | uint256 public constant YEAR_SECS = 31557600; // taking into account leap years 14 | 15 | uint256 public constant MAX_BASE_RATE_X96 = Q96 / 10; // 10% 16 | uint256 public constant MAX_MULTIPLIER_X96 = Q96 * 2; // 200% 17 | 18 | event SetValues( 19 | uint256 baseRatePerYearX96, uint256 multiplierPerYearX96, uint256 jumpMultiplierPerYearX96, uint256 kinkX96 20 | ); 21 | 22 | // all values are multiplied by Q96 23 | uint256 public multiplierPerSecondX96; 24 | uint256 public baseRatePerSecondX96; 25 | uint256 public jumpMultiplierPerSecondX96; 26 | uint256 public kinkX96; 27 | 28 | /// @notice Creates interest rate model 29 | /// @param baseRatePerYearX96 Base rate per year multiplied by Q96 30 | /// @param multiplierPerYearX96 Multiplier for utilization rate below kink multiplied by Q96 31 | /// @param jumpMultiplierPerYearX96 Multiplier for utilization rate above kink multiplied by Q96 32 | /// @param _kinkX96 Kink percentage multiplied by Q96 33 | constructor( 34 | uint256 baseRatePerYearX96, 35 | uint256 multiplierPerYearX96, 36 | uint256 jumpMultiplierPerYearX96, 37 | uint256 _kinkX96 38 | ) { 39 | setValues(baseRatePerYearX96, multiplierPerYearX96, jumpMultiplierPerYearX96, _kinkX96); 40 | } 41 | 42 | /// @notice Returns utilization rate X96 given cash and debt 43 | /// @param cash Current available cash 44 | /// @param debt Current debt 45 | /// @return Utilization rate between 0 and Q96 46 | function getUtilizationRateX96(uint256 cash, uint256 debt) public pure returns (uint256) { 47 | if (debt == 0) { 48 | return 0; 49 | } 50 | return debt * Q96 / (cash + debt); 51 | } 52 | 53 | /// @notice Returns interest rates X96 given cash and debt 54 | /// @param cash Current available cash 55 | /// @param debt Current debt 56 | /// @return borrowRateX96 borrow rate multiplied by Q96 57 | /// @return supplyRateX96 supply rate multiplied by Q96 58 | function getRatesPerSecondX96(uint256 cash, uint256 debt) 59 | public 60 | view 61 | override 62 | returns (uint256 borrowRateX96, uint256 supplyRateX96) 63 | { 64 | uint256 utilizationRateX96 = getUtilizationRateX96(cash, debt); 65 | 66 | if (utilizationRateX96 <= kinkX96) { 67 | borrowRateX96 = (utilizationRateX96 * multiplierPerSecondX96 / Q96) + baseRatePerSecondX96; 68 | } else { 69 | uint256 normalRateX96 = (kinkX96 * multiplierPerSecondX96 / Q96) + baseRatePerSecondX96; 70 | uint256 excessUtilX96 = utilizationRateX96 - kinkX96; 71 | borrowRateX96 = (excessUtilX96 * jumpMultiplierPerSecondX96 / Q96) + normalRateX96; 72 | } 73 | 74 | supplyRateX96 = utilizationRateX96 * borrowRateX96 / Q96; 75 | } 76 | 77 | /// @notice Update interest rate values (onlyOwner) 78 | /// @param baseRatePerYearX96 Base rate per year multiplied by Q96 79 | /// @param multiplierPerYearX96 Multiplier for utilization rate below kink multiplied by Q96 80 | /// @param jumpMultiplierPerYearX96 Multiplier for utilization rate above kink multiplied by Q96 81 | /// @param _kinkX96 Kink percentage multiplied by Q96 82 | function setValues( 83 | uint256 baseRatePerYearX96, 84 | uint256 multiplierPerYearX96, 85 | uint256 jumpMultiplierPerYearX96, 86 | uint256 _kinkX96 87 | ) public onlyOwner { 88 | if ( 89 | baseRatePerYearX96 > MAX_BASE_RATE_X96 || multiplierPerYearX96 > MAX_MULTIPLIER_X96 90 | || jumpMultiplierPerYearX96 > MAX_MULTIPLIER_X96 91 | ) { 92 | revert InvalidConfig(); 93 | } 94 | 95 | baseRatePerSecondX96 = baseRatePerYearX96 / YEAR_SECS; 96 | multiplierPerSecondX96 = multiplierPerYearX96 / YEAR_SECS; 97 | jumpMultiplierPerSecondX96 = jumpMultiplierPerYearX96 / YEAR_SECS; 98 | kinkX96 = _kinkX96; 99 | 100 | emit SetValues(baseRatePerYearX96, multiplierPerYearX96, jumpMultiplierPerYearX96, _kinkX96); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/automators/Automator.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/access/Ownable.sol"; 5 | import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; 6 | import "@openzeppelin/contracts/utils/math/SafeCast.sol"; 7 | 8 | import "v3-core/interfaces/IUniswapV3Factory.sol"; 9 | import "v3-core/interfaces/IUniswapV3Pool.sol"; 10 | import "v3-core/libraries/TickMath.sol"; 11 | import "v3-core/libraries/FullMath.sol"; 12 | 13 | import "v3-periphery/interfaces/INonfungiblePositionManager.sol"; 14 | 15 | import "../../lib/IWETH9.sol"; 16 | import "../utils/Swapper.sol"; 17 | import "../interfaces/IVault.sol"; 18 | 19 | abstract contract Automator is Swapper, Ownable { 20 | uint256 internal constant Q64 = 2 ** 64; 21 | uint256 internal constant Q96 = 2 ** 96; 22 | 23 | uint32 public constant MIN_TWAP_SECONDS = 60; // 1 minute 24 | uint32 public constant MAX_TWAP_TICK_DIFFERENCE = 200; // 2% 25 | 26 | // admin events 27 | event OperatorChanged(address newOperator, bool active); 28 | event VaultChanged(address newVault, bool active); 29 | 30 | event WithdrawerChanged(address newWithdrawer); 31 | event TWAPConfigChanged(uint32 TWAPSeconds, uint16 maxTWAPTickDifference); 32 | 33 | // configurable by owner 34 | mapping(address => bool) public operators; 35 | mapping(address => bool) public vaults; 36 | 37 | address public withdrawer; 38 | uint32 public TWAPSeconds; 39 | uint16 public maxTWAPTickDifference; 40 | 41 | constructor( 42 | INonfungiblePositionManager npm, 43 | address _operator, 44 | address _withdrawer, 45 | uint32 _TWAPSeconds, 46 | uint16 _maxTWAPTickDifference, 47 | address _zeroxRouter, 48 | address _universalRouter 49 | ) Swapper(npm, _zeroxRouter, _universalRouter) { 50 | setOperator(_operator, true); 51 | setWithdrawer(_withdrawer); 52 | setTWAPConfig(_maxTWAPTickDifference, _TWAPSeconds); 53 | } 54 | 55 | /** 56 | * @notice Owner controlled function to set withdrawer address 57 | * @param _withdrawer withdrawer 58 | */ 59 | function setWithdrawer(address _withdrawer) public onlyOwner { 60 | emit WithdrawerChanged(_withdrawer); 61 | withdrawer = _withdrawer; 62 | } 63 | 64 | /** 65 | * @notice Owner controlled function to activate/deactivate operator address 66 | * @param _operator operator 67 | * @param _active active or not 68 | */ 69 | function setOperator(address _operator, bool _active) public onlyOwner { 70 | emit OperatorChanged(_operator, _active); 71 | operators[_operator] = _active; 72 | } 73 | 74 | /** 75 | * @notice Owner controlled function to activate/deactivate vault address 76 | * @param _vault vault 77 | * @param _active active or not 78 | */ 79 | function setVault(address _vault, bool _active) public onlyOwner { 80 | emit VaultChanged(_vault, _active); 81 | vaults[_vault] = _active; 82 | } 83 | 84 | /** 85 | * @notice Owner controlled function to increase TWAPSeconds / decrease maxTWAPTickDifference 86 | */ 87 | function setTWAPConfig(uint16 _maxTWAPTickDifference, uint32 _TWAPSeconds) public onlyOwner { 88 | if (_TWAPSeconds < MIN_TWAP_SECONDS) { 89 | revert InvalidConfig(); 90 | } 91 | if (_maxTWAPTickDifference > MAX_TWAP_TICK_DIFFERENCE) { 92 | revert InvalidConfig(); 93 | } 94 | emit TWAPConfigChanged(_TWAPSeconds, _maxTWAPTickDifference); 95 | TWAPSeconds = _TWAPSeconds; 96 | maxTWAPTickDifference = _maxTWAPTickDifference; 97 | } 98 | 99 | /** 100 | * @notice Withdraws token balance (accumulated protocol fee) 101 | * @param tokens Addresses of tokens to withdraw 102 | * @param to Address to send to 103 | */ 104 | function withdrawBalances(address[] calldata tokens, address to) external virtual { 105 | if (msg.sender != withdrawer) { 106 | revert Unauthorized(); 107 | } 108 | 109 | uint256 i; 110 | uint256 count = tokens.length; 111 | for (; i < count; ++i) { 112 | uint256 balance = IERC20(tokens[i]).balanceOf(address(this)); 113 | if (balance > 0) { 114 | _transferToken(to, IERC20(tokens[i]), balance, true); 115 | } 116 | } 117 | } 118 | 119 | /** 120 | * @notice Withdraws ETH balance 121 | * @param to Address to send to 122 | */ 123 | function withdrawETH(address to) external { 124 | if (msg.sender != withdrawer) { 125 | revert Unauthorized(); 126 | } 127 | 128 | uint256 balance = address(this).balance; 129 | if (balance > 0) { 130 | (bool sent,) = to.call{value: balance}(""); 131 | if (!sent) { 132 | revert EtherSendFailed(); 133 | } 134 | } 135 | } 136 | 137 | // validate if swap can be done with specified oracle parameters - if not possible reverts 138 | // if possible returns minAmountOut 139 | function _validateSwap( 140 | bool swap0For1, 141 | uint256 amountIn, 142 | IUniswapV3Pool pool, 143 | uint32 twapPeriod, 144 | uint16 maxTickDifference, 145 | uint64 maxPriceDifferenceX64 146 | ) internal view returns (uint256 amountOutMin, int24 currentTick, uint160 sqrtPriceX96, uint256 priceX96) { 147 | // get current price and tick 148 | (sqrtPriceX96, currentTick,,,,,) = pool.slot0(); 149 | 150 | // check if current tick not too far from TWAP 151 | if (!_hasMaxTWAPTickDifference(pool, twapPeriod, currentTick, maxTickDifference)) { 152 | revert TWAPCheckFailed(); 153 | } 154 | 155 | // calculate min output price price and percentage 156 | priceX96 = FullMath.mulDiv(sqrtPriceX96, sqrtPriceX96, Q96); 157 | if (swap0For1) { 158 | amountOutMin = FullMath.mulDiv(amountIn * (Q64 - maxPriceDifferenceX64), priceX96, Q96 * Q64); 159 | } else { 160 | amountOutMin = FullMath.mulDiv(amountIn * (Q64 - maxPriceDifferenceX64), Q96, priceX96 * Q64); 161 | } 162 | } 163 | 164 | // Checks if there was not more tick difference 165 | // returns false if not enough data available or tick difference >= maxDifference 166 | function _hasMaxTWAPTickDifference(IUniswapV3Pool pool, uint32 twapPeriod, int24 currentTick, uint16 maxDifference) 167 | internal 168 | view 169 | returns (bool) 170 | { 171 | (int24 twapTick, bool twapOk) = _getTWAPTick(pool, twapPeriod); 172 | if (twapOk) { 173 | return twapTick - currentTick >= -int16(maxDifference) && twapTick - currentTick <= int16(maxDifference); 174 | } else { 175 | return false; 176 | } 177 | } 178 | 179 | // gets twap tick from pool history if enough history available 180 | function _getTWAPTick(IUniswapV3Pool pool, uint32 twapPeriod) internal view returns (int24, bool) { 181 | uint32[] memory secondsAgos = new uint32[](2); 182 | secondsAgos[0] = 0; // from (before) 183 | secondsAgos[1] = twapPeriod; // from (before) 184 | 185 | // pool observe may fail when there is not enough history available 186 | try pool.observe(secondsAgos) returns (int56[] memory tickCumulatives, uint160[] memory) { 187 | return (int24((tickCumulatives[0] - tickCumulatives[1]) / int56(uint56(twapPeriod))), true); 188 | } catch { 189 | return (0, false); 190 | } 191 | } 192 | 193 | function _decreaseFullLiquidityAndCollect( 194 | uint256 tokenId, 195 | uint128 liquidity, 196 | uint256 amountRemoveMin0, 197 | uint256 amountRemoveMin1, 198 | uint256 deadline 199 | ) internal returns (uint256 amount0, uint256 amount1, uint256 feeAmount0, uint256 feeAmount1) { 200 | if (liquidity > 0) { 201 | // store in temporarely "misnamed" variables - see comment below 202 | (feeAmount0, feeAmount1) = nonfungiblePositionManager.decreaseLiquidity( 203 | INonfungiblePositionManager.DecreaseLiquidityParams( 204 | tokenId, liquidity, amountRemoveMin0, amountRemoveMin1, deadline 205 | ) 206 | ); 207 | } 208 | (amount0, amount1) = nonfungiblePositionManager.collect( 209 | INonfungiblePositionManager.CollectParams(tokenId, address(this), type(uint128).max, type(uint128).max) 210 | ); 211 | 212 | // fee amount is what was collected additionally to liquidity amount 213 | feeAmount0 = amount0 - feeAmount0; 214 | feeAmount1 = amount1 - feeAmount1; 215 | } 216 | 217 | // transfers token (or unwraps WETH and sends ETH) 218 | function _transferToken(address to, IERC20 token, uint256 amount, bool unwrap) internal { 219 | if (address(weth) == address(token) && unwrap) { 220 | weth.withdraw(amount); 221 | (bool sent,) = to.call{value: amount}(""); 222 | if (!sent) { 223 | revert EtherSendFailed(); 224 | } 225 | } else { 226 | SafeERC20.safeTransfer(token, to, amount); 227 | } 228 | } 229 | 230 | function _validateOwner(uint256 tokenId, address vault) internal returns (address owner) { 231 | // msg.sender must not be a vault 232 | if (vaults[msg.sender]) { 233 | revert Unauthorized(); 234 | } 235 | 236 | if (vault != address(0)) { 237 | if (!vaults[vault]) { 238 | revert Unauthorized(); 239 | } 240 | owner = IVault(vault).ownerOf(tokenId); 241 | } else { 242 | owner = nonfungiblePositionManager.ownerOf(tokenId); 243 | } 244 | 245 | if (owner != msg.sender) { 246 | revert Unauthorized(); 247 | } 248 | } 249 | 250 | // needed for WETH unwrapping 251 | receive() external payable { 252 | if (msg.sender != address(weth)) { 253 | revert NotWETH(); 254 | } 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /src/interfaces/IErrors.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | interface IErrors { 5 | error Unauthorized(); 6 | error Reentrancy(); 7 | error NotConfigured(); 8 | error NotReady(); 9 | error InvalidConfig(); 10 | error TWAPCheckFailed(); 11 | error WrongContract(); 12 | 13 | error SwapFailed(); 14 | error SlippageError(); 15 | error MissingSwapData(); 16 | error SwapAmountTooLarge(); 17 | 18 | error LiquidityChanged(); 19 | error ExceedsMaxReward(); 20 | error InvalidPool(); 21 | error ChainlinkPriceError(); 22 | error PriceDifferenceExceeded(); 23 | 24 | error CollateralFail(); 25 | error MinLoanSize(); 26 | error GlobalDebtLimit(); 27 | error GlobalLendLimit(); 28 | error DailyDebtIncreaseLimit(); 29 | error DailyLendIncreaseLimit(); 30 | error InsufficientLiquidity(); 31 | error NotLiquidatable(); 32 | error InterestNotUpdated(); 33 | error RepayExceedsDebt(); 34 | error TransformNotAllowed(); 35 | error TransformFailed(); 36 | error CollateralFactorExceedsMax(); 37 | error CollateralValueLimit(); 38 | error NoLiquidity(); 39 | error DebtChanged(); 40 | 41 | error SelfSend(); 42 | error NotSupportedWhatToDo(); 43 | error SameToken(); 44 | error AmountError(); 45 | error CollectError(); 46 | error TransferError(); 47 | 48 | error TooMuchEtherSent(); 49 | error NoEtherToken(); 50 | error EtherSendFailed(); 51 | error NotWETH(); 52 | 53 | error NotEnoughReward(); 54 | error SameRange(); 55 | error NotSupportedFeeTier(); 56 | } 57 | -------------------------------------------------------------------------------- /src/interfaces/IInterestRateModel.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | interface IInterestRateModel { 5 | // gets borrow and supply interest rate per second 6 | function getRatesPerSecondX96(uint256 cash, uint256 debt) 7 | external 8 | view 9 | returns (uint256 borrowRateX96, uint256 supplyRateX96); 10 | } 11 | -------------------------------------------------------------------------------- /src/interfaces/IV3Oracle.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | interface IV3Oracle { 5 | // gets value and prices for a given v3 nft denominated in token 6 | // reverts if any involved token is not configured 7 | // reverts if prices are not valid given oracle configuration 8 | function getValue(uint256 tokenId, address token) 9 | external 10 | view 11 | returns (uint256 value, uint256 feeValue, uint256 price0X96, uint256 price1X96); 12 | 13 | // gets breakdown of position specifying liquidity amounts and available fee amounts 14 | function getPositionBreakdown(uint256 tokenId) 15 | external 16 | view 17 | returns ( 18 | address token0, 19 | address token1, 20 | uint24 fee, 21 | uint128 liquidity, 22 | uint256 amount0, 23 | uint256 amount1, 24 | uint128 fees0, 25 | uint128 fees1 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/interfaces/IVault.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/interfaces/IERC4626.sol"; 5 | 6 | interface IVault is IERC4626 { 7 | function vaultInfo() 8 | external 9 | view 10 | returns ( 11 | uint256 debt, 12 | uint256 lent, 13 | uint256 balance, 14 | uint256 available, 15 | uint256 reserves, 16 | uint256 debtExchangeRateX96, 17 | uint256 lendExchangeRateX96 18 | ); 19 | function lendInfo(address account) external view returns (uint256 amount); 20 | function loanInfo(uint256 tokenId) 21 | external 22 | view 23 | returns ( 24 | uint256 debt, 25 | uint256 fullValue, 26 | uint256 collateralValue, 27 | uint256 liquidationCost, 28 | uint256 liquidationValue 29 | ); 30 | 31 | function ownerOf(uint256 tokenId) external returns (address); 32 | 33 | // functions for iterating over owners loans 34 | function loanCount(address owner) external view returns (uint256); 35 | function loanAtIndex(address owner, uint256 index) external view returns (uint256); 36 | 37 | function create(uint256 tokenId, address recipient) external; 38 | function createWithPermit( 39 | uint256 tokenId, 40 | address owner, 41 | address recipient, 42 | uint256 deadline, 43 | uint8 v, 44 | bytes32 r, 45 | bytes32 s 46 | ) external; 47 | 48 | function approveTransform(uint256 tokenId, address target, bool active) external; 49 | function transform(uint256 tokenId, address transformer, bytes calldata data) external returns (uint256); 50 | 51 | // params for decreasing liquidity of collateralized position 52 | struct DecreaseLiquidityAndCollectParams { 53 | uint256 tokenId; 54 | uint128 liquidity; 55 | // min amount to accept from liquidity removal 56 | uint256 amount0Min; 57 | uint256 amount1Min; 58 | // amount to remove from fees additional to the liquidity amounts 59 | uint128 feeAmount0; // (if uint256(128).max - all fees) 60 | uint128 feeAmount1; // (if uint256(128).max - all fees) 61 | uint256 deadline; 62 | address recipient; 63 | } 64 | 65 | function decreaseLiquidityAndCollect(DecreaseLiquidityAndCollectParams calldata params) 66 | external 67 | returns (uint256 amount0, uint256 amount1); 68 | 69 | function borrow(uint256 tokenId, uint256 amount) external; 70 | function repay(uint256 tokenId, uint256 amount, bool isShare) external; 71 | function repay(uint256 tokenId, uint256 amount, bool isShare, bytes calldata permitData) external; 72 | 73 | struct LiquidateParams { 74 | // token to liquidate 75 | uint256 tokenId; 76 | // expected debt shares - reverts if changed in the meantime 77 | uint256 debtShares; 78 | // min amount to recieve 79 | uint256 amount0Min; 80 | uint256 amount1Min; 81 | // recipient of rewarded tokens 82 | address recipient; 83 | // if permit2 signatures are used - set this 84 | bytes permitData; 85 | } 86 | 87 | function liquidate(LiquidateParams calldata params) external returns (uint256 amount0, uint256 amount1); 88 | 89 | // deposit functions with permit2 90 | function deposit(uint256 assets, address receiver, bytes calldata permitData) external returns (uint256); 91 | function mint(uint256 shares, address receiver, bytes calldata permitData) external returns (uint256); 92 | } 93 | -------------------------------------------------------------------------------- /src/transformers/LeverageTransformer.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/utils/math/SafeCast.sol"; 5 | import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; 6 | 7 | import "../utils/Swapper.sol"; 8 | import "../interfaces/IVault.sol"; 9 | 10 | /// @title LeverageTransformer 11 | /// @notice Functionality to leverage / deleverage positions direcly in one tx 12 | contract LeverageTransformer is Swapper { 13 | constructor(INonfungiblePositionManager _nonfungiblePositionManager, address _zeroxRouter, address _universalRouter) 14 | Swapper(_nonfungiblePositionManager, _zeroxRouter, _universalRouter) 15 | {} 16 | 17 | struct LeverageUpParams { 18 | // which token to leverage 19 | uint256 tokenId; 20 | // how much to borrow 21 | uint256 borrowAmount; 22 | // how much of borrowed lend token should be swapped to token0 23 | uint256 amountIn0; 24 | uint256 amountOut0Min; 25 | bytes swapData0; // encoded data from 0x api call (address,bytes) - allowanceTarget,data 26 | // how much of borrowed lend token should be swapped to token1 27 | uint256 amountIn1; 28 | uint256 amountOut1Min; 29 | bytes swapData1; // encoded data from 0x api call (address,bytes) - allowanceTarget,data 30 | // for adding liquidity slippage 31 | uint256 amountAddMin0; 32 | uint256 amountAddMin1; 33 | // recipient for leftover tokens 34 | address recipient; 35 | // for all uniswap deadlineable functions 36 | uint256 deadline; 37 | } 38 | 39 | // method called from transform() method in Vault 40 | function leverageUp(LeverageUpParams calldata params) external { 41 | uint256 amount = params.borrowAmount; 42 | 43 | address token = IVault(msg.sender).asset(); 44 | 45 | IVault(msg.sender).borrow(params.tokenId, amount); 46 | 47 | (,, address token0, address token1,,,,,,,,) = nonfungiblePositionManager.positions(params.tokenId); 48 | 49 | uint256 amount0 = token == token0 ? amount : 0; 50 | uint256 amount1 = token == token1 ? amount : 0; 51 | 52 | if (params.amountIn0 > 0) { 53 | (uint256 amountIn, uint256 amountOut) = _routerSwap( 54 | Swapper.RouterSwapParams( 55 | IERC20(token), IERC20(token0), params.amountIn0, params.amountOut0Min, params.swapData0 56 | ) 57 | ); 58 | if (token == token1) { 59 | amount1 -= amountIn; 60 | } 61 | amount -= amountIn; 62 | amount0 += amountOut; 63 | } 64 | if (params.amountIn1 > 0) { 65 | (uint256 amountIn, uint256 amountOut) = _routerSwap( 66 | Swapper.RouterSwapParams( 67 | IERC20(token), IERC20(token1), params.amountIn1, params.amountOut1Min, params.swapData1 68 | ) 69 | ); 70 | if (token == token0) { 71 | amount0 -= amountIn; 72 | } 73 | amount -= amountIn; 74 | amount1 += amountOut; 75 | } 76 | 77 | SafeERC20.safeIncreaseAllowance(IERC20(token0), address(nonfungiblePositionManager), amount0); 78 | SafeERC20.safeIncreaseAllowance(IERC20(token1), address(nonfungiblePositionManager), amount1); 79 | 80 | INonfungiblePositionManager.IncreaseLiquidityParams memory increaseLiquidityParams = INonfungiblePositionManager 81 | .IncreaseLiquidityParams( 82 | params.tokenId, amount0, amount1, params.amountAddMin0, params.amountAddMin1, params.deadline 83 | ); 84 | (, uint256 added0, uint256 added1) = nonfungiblePositionManager.increaseLiquidity(increaseLiquidityParams); 85 | 86 | // send leftover tokens 87 | if (amount0 > added0) { 88 | SafeERC20.safeTransfer(IERC20(token0), params.recipient, amount0 - added0); 89 | } 90 | if (amount1 > added1) { 91 | SafeERC20.safeTransfer(IERC20(token1), params.recipient, amount1 - added1); 92 | } 93 | if (token != token0 && token != token1 && amount > 0) { 94 | SafeERC20.safeTransfer(IERC20(token), params.recipient, amount); 95 | } 96 | } 97 | 98 | struct LeverageDownParams { 99 | // which token to leverage 100 | uint256 tokenId; 101 | // for removing - remove liquidity amount 102 | uint128 liquidity; 103 | uint256 amountRemoveMin0; 104 | uint256 amountRemoveMin1; 105 | // collect fee amount (if type(uint128).max - ALL) 106 | uint128 feeAmount0; 107 | uint128 feeAmount1; 108 | // how much of token0 should be swapped to lend token 109 | uint256 amountIn0; 110 | uint256 amountOut0Min; 111 | bytes swapData0; // encoded data from 0x api call (address,bytes) - allowanceTarget,data 112 | // how much of token1 should be swapped to lend token 113 | uint256 amountIn1; 114 | uint256 amountOut1Min; 115 | bytes swapData1; // encoded data from 0x api call (address,bytes) - allowanceTarget,data 116 | // recipient for leftover tokens 117 | address recipient; 118 | // for all uniswap deadlineable functions 119 | uint256 deadline; 120 | } 121 | 122 | // method called from transform() method in Vault 123 | function leverageDown(LeverageDownParams calldata params) external { 124 | address token = IVault(msg.sender).asset(); 125 | (,, address token0, address token1,,,,,,,,) = nonfungiblePositionManager.positions(params.tokenId); 126 | 127 | uint256 amount0; 128 | uint256 amount1; 129 | 130 | INonfungiblePositionManager.DecreaseLiquidityParams memory decreaseLiquidityParams = INonfungiblePositionManager 131 | .DecreaseLiquidityParams( 132 | params.tokenId, params.liquidity, params.amountRemoveMin0, params.amountRemoveMin1, params.deadline 133 | ); 134 | (amount0, amount1) = nonfungiblePositionManager.decreaseLiquidity(decreaseLiquidityParams); 135 | 136 | INonfungiblePositionManager.CollectParams memory collectParams = INonfungiblePositionManager.CollectParams( 137 | params.tokenId, 138 | address(this), 139 | params.feeAmount0 == type(uint128).max ? type(uint128).max : SafeCast.toUint128(amount0 + params.feeAmount0), 140 | params.feeAmount1 == type(uint128).max ? type(uint128).max : SafeCast.toUint128(amount1 + params.feeAmount1) 141 | ); 142 | (amount0, amount1) = nonfungiblePositionManager.collect(collectParams); 143 | 144 | uint256 amount = token == token0 ? amount0 : (token == token1 ? amount1 : 0); 145 | 146 | if (params.amountIn0 > 0 && token != token0) { 147 | (uint256 amountIn, uint256 amountOut) = _routerSwap( 148 | Swapper.RouterSwapParams( 149 | IERC20(token0), IERC20(token), params.amountIn0, params.amountOut0Min, params.swapData0 150 | ) 151 | ); 152 | amount0 -= amountIn; 153 | amount += amountOut; 154 | } 155 | if (params.amountIn1 > 0 && token != token1) { 156 | (uint256 amountIn, uint256 amountOut) = _routerSwap( 157 | Swapper.RouterSwapParams( 158 | IERC20(token1), IERC20(token), params.amountIn1, params.amountOut1Min, params.swapData1 159 | ) 160 | ); 161 | amount1 -= amountIn; 162 | amount += amountOut; 163 | } 164 | 165 | SafeERC20.safeApprove(IERC20(token), msg.sender, amount); 166 | IVault(msg.sender).repay(params.tokenId, amount, false); 167 | 168 | // send leftover tokens 169 | if (amount0 > 0 && token != token0) { 170 | SafeERC20.safeTransfer(IERC20(token0), params.recipient, amount0); 171 | } 172 | if (amount1 > 0 && token != token1) { 173 | SafeERC20.safeTransfer(IERC20(token1), params.recipient, amount1); 174 | } 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /src/utils/FlashloanLiquidator.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "v3-core/interfaces/IUniswapV3Pool.sol"; 5 | import "v3-core/interfaces/callback/IUniswapV3FlashCallback.sol"; 6 | 7 | import "../interfaces/IVault.sol"; 8 | import "./Swapper.sol"; 9 | 10 | /// @title Helper contract which allows atomic liquidation and needed swaps by using UniV3 Flashloan 11 | contract FlashloanLiquidator is Swapper, IUniswapV3FlashCallback { 12 | struct FlashCallbackData { 13 | uint256 tokenId; 14 | uint256 debtShares; 15 | uint256 liquidationCost; 16 | IVault vault; 17 | IERC20 asset; 18 | RouterSwapParams swap0; 19 | RouterSwapParams swap1; 20 | address liquidator; 21 | uint256 minReward; 22 | } 23 | 24 | constructor(INonfungiblePositionManager _nonfungiblePositionManager, address _zeroxRouter, address _universalRouter) 25 | Swapper(_nonfungiblePositionManager, _zeroxRouter, _universalRouter) 26 | {} 27 | 28 | struct LiquidateParams { 29 | uint256 tokenId; // loan to liquidate 30 | uint256 debtShares; // debt shares calculation is based on 31 | IVault vault; // vault where the loan is 32 | IUniswapV3Pool flashLoanPool; // pool which is used for flashloan - may not be used in the swaps below 33 | uint256 amount0In; // how much of token0 to swap to asset (0 if no swap should be done) 34 | bytes swapData0; // swap data for token0 swap 35 | uint256 amount1In; // how much of token1 to swap to asset (0 if no swap should be done) 36 | bytes swapData1; // swap data for token1 swap 37 | uint256 minReward; // min reward amount (works as a global slippage control for complete operation) 38 | } 39 | 40 | /// @notice Liquidates a loan, using a Uniswap Flashloan 41 | function liquidate(LiquidateParams calldata params) external { 42 | (,,, uint256 liquidationCost,) = params.vault.loanInfo(params.tokenId); 43 | if (liquidationCost == 0) { 44 | revert NotLiquidatable(); 45 | } 46 | 47 | (,, address token0, address token1,,,,,,,,) = nonfungiblePositionManager.positions(params.tokenId); 48 | address asset = params.vault.asset(); 49 | 50 | bool isAsset0 = params.flashLoanPool.token0() == asset; 51 | bytes memory data = abi.encode( 52 | FlashCallbackData( 53 | params.tokenId, 54 | params.debtShares, 55 | liquidationCost, 56 | params.vault, 57 | IERC20(asset), 58 | RouterSwapParams(IERC20(token0), IERC20(asset), params.amount0In, 0, params.swapData0), 59 | RouterSwapParams(IERC20(token1), IERC20(asset), params.amount1In, 0, params.swapData1), 60 | msg.sender, 61 | params.minReward 62 | ) 63 | ); 64 | params.flashLoanPool.flash(address(this), isAsset0 ? liquidationCost : 0, !isAsset0 ? liquidationCost : 0, data); 65 | } 66 | 67 | function uniswapV3FlashCallback(uint256 fee0, uint256 fee1, bytes calldata callbackData) external { 68 | // no origin check is needed - because the contract doesn't hold any funds - there is no benefit in calling uniswapV3FlashCallback() from another context 69 | 70 | FlashCallbackData memory data = abi.decode(callbackData, (FlashCallbackData)); 71 | 72 | SafeERC20.safeApprove(data.asset, address(data.vault), data.liquidationCost); 73 | data.vault.liquidate( 74 | IVault.LiquidateParams( 75 | data.tokenId, data.debtShares, data.swap0.amountIn, data.swap1.amountIn, address(this), "" 76 | ) 77 | ); 78 | SafeERC20.safeApprove(data.asset, address(data.vault), 0); 79 | 80 | // do swaps 81 | _routerSwap(data.swap0); 82 | _routerSwap(data.swap1); 83 | 84 | // transfer lent amount + fee (only one token can have fee) - back to pool 85 | SafeERC20.safeTransfer(data.asset, msg.sender, data.liquidationCost + (fee0 + fee1)); 86 | 87 | // return all leftover tokens to liquidator 88 | if (data.swap0.tokenIn != data.asset) { 89 | uint256 balance = data.swap0.tokenIn.balanceOf(address(this)); 90 | if (balance > 0) { 91 | SafeERC20.safeTransfer(data.swap0.tokenIn, data.liquidator, balance); 92 | } 93 | } 94 | if (data.swap1.tokenIn != data.asset) { 95 | uint256 balance = data.swap1.tokenIn.balanceOf(address(this)); 96 | if (balance > 0) { 97 | SafeERC20.safeTransfer(data.swap1.tokenIn, data.liquidator, balance); 98 | } 99 | } 100 | { 101 | uint256 balance = data.asset.balanceOf(address(this)); 102 | if (balance < data.minReward) { 103 | revert NotEnoughReward(); 104 | } 105 | if (balance > 0) { 106 | SafeERC20.safeTransfer(data.asset, data.liquidator, balance); 107 | } 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/utils/Swapper.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: BUSL-1.1 2 | pragma solidity ^0.8.0; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; 5 | 6 | import "v3-core/interfaces/callback/IUniswapV3SwapCallback.sol"; 7 | import "v3-core/interfaces/IUniswapV3Pool.sol"; 8 | import "v3-core/libraries/TickMath.sol"; 9 | 10 | import "v3-periphery/interfaces/INonfungiblePositionManager.sol"; 11 | 12 | import "../../lib/IWETH9.sol"; 13 | import "../../lib/IUniversalRouter.sol"; 14 | import "../interfaces/IErrors.sol"; 15 | 16 | // base functionality to do swaps with different routing protocols 17 | abstract contract Swapper is IUniswapV3SwapCallback, IErrors { 18 | event Swap(address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut); 19 | 20 | /// @notice Wrapped native token address 21 | IWETH9 public immutable weth; 22 | 23 | address public immutable factory; 24 | 25 | /// @notice Uniswap v3 position manager 26 | INonfungiblePositionManager public immutable nonfungiblePositionManager; 27 | 28 | /// @notice 0x Exchange Proxy 29 | address public immutable zeroxRouter; 30 | 31 | /// @notice Uniswap Universal Router 32 | address public immutable universalRouter; 33 | 34 | /// @notice Constructor 35 | /// @param _nonfungiblePositionManager Uniswap v3 position manager 36 | /// @param _zeroxRouter 0x Exchange Proxy 37 | constructor( 38 | INonfungiblePositionManager _nonfungiblePositionManager, 39 | address _zeroxRouter, 40 | address _universalRouter 41 | ) { 42 | weth = IWETH9(_nonfungiblePositionManager.WETH9()); 43 | factory = _nonfungiblePositionManager.factory(); 44 | nonfungiblePositionManager = _nonfungiblePositionManager; 45 | zeroxRouter = _zeroxRouter; 46 | universalRouter = _universalRouter; 47 | } 48 | 49 | // swap data for 0x 50 | struct ZeroxRouterData { 51 | address allowanceTarget; 52 | bytes data; 53 | } 54 | 55 | // swap data for uni - must include sweep for input token 56 | struct UniversalRouterData { 57 | bytes commands; 58 | bytes[] inputs; 59 | uint256 deadline; 60 | } 61 | 62 | struct RouterSwapParams { 63 | IERC20 tokenIn; 64 | IERC20 tokenOut; 65 | uint256 amountIn; 66 | uint256 amountOutMin; 67 | bytes swapData; 68 | } 69 | 70 | // general swap function which uses external router with off-chain calculated swap instructions 71 | // does slippage check with amountOutMin param 72 | // returns token amounts deltas after swap 73 | function _routerSwap(RouterSwapParams memory params) 74 | internal 75 | returns (uint256 amountInDelta, uint256 amountOutDelta) 76 | { 77 | if (params.amountIn != 0 && params.swapData.length != 0 && address(params.tokenOut) != address(0)) { 78 | uint256 balanceInBefore = params.tokenIn.balanceOf(address(this)); 79 | uint256 balanceOutBefore = params.tokenOut.balanceOf(address(this)); 80 | 81 | // get router specific swap data 82 | (address router, bytes memory routerData) = abi.decode(params.swapData, (address, bytes)); 83 | 84 | if (router == zeroxRouter) { 85 | ZeroxRouterData memory data = abi.decode(routerData, (ZeroxRouterData)); 86 | // approve needed amount 87 | SafeERC20.safeApprove(params.tokenIn, data.allowanceTarget, params.amountIn); 88 | // execute swap 89 | (bool success,) = zeroxRouter.call(data.data); 90 | if (!success) { 91 | revert SwapFailed(); 92 | } 93 | // reset approval 94 | SafeERC20.safeApprove(params.tokenIn, data.allowanceTarget, 0); 95 | } else if (router == universalRouter) { 96 | UniversalRouterData memory data = abi.decode(routerData, (UniversalRouterData)); 97 | // tokens are transfered to Universalrouter directly (data.commands must include sweep action!) 98 | SafeERC20.safeTransfer(params.tokenIn, universalRouter, params.amountIn); 99 | IUniversalRouter(universalRouter).execute(data.commands, data.inputs, data.deadline); 100 | } else { 101 | revert WrongContract(); 102 | } 103 | 104 | uint256 balanceInAfter = params.tokenIn.balanceOf(address(this)); 105 | uint256 balanceOutAfter = params.tokenOut.balanceOf(address(this)); 106 | 107 | amountInDelta = balanceInBefore - balanceInAfter; 108 | amountOutDelta = balanceOutAfter - balanceOutBefore; 109 | 110 | // amountMin slippage check 111 | if (amountOutDelta < params.amountOutMin) { 112 | revert SlippageError(); 113 | } 114 | 115 | // event for any swap with exact swapped value 116 | emit Swap(address(params.tokenIn), address(params.tokenOut), amountInDelta, amountOutDelta); 117 | } 118 | } 119 | 120 | struct PoolSwapParams { 121 | IUniswapV3Pool pool; 122 | IERC20 token0; 123 | IERC20 token1; 124 | uint24 fee; 125 | bool swap0For1; 126 | uint256 amountIn; 127 | uint256 amountOutMin; 128 | } 129 | 130 | // execute swap directly on specified pool 131 | // amounts must be available on the contract for both tokens 132 | function _poolSwap(PoolSwapParams memory params) internal returns (uint256 amountInDelta, uint256 amountOutDelta) { 133 | if (params.amountIn > 0) { 134 | (int256 amount0Delta, int256 amount1Delta) = params.pool.swap( 135 | address(this), 136 | params.swap0For1, 137 | int256(params.amountIn), 138 | (params.swap0For1 ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1), 139 | abi.encode( 140 | params.swap0For1 ? params.token0 : params.token1, 141 | params.swap0For1 ? params.token1 : params.token0, 142 | params.fee 143 | ) 144 | ); 145 | amountInDelta = params.swap0For1 ? uint256(amount0Delta) : uint256(amount1Delta); 146 | amountOutDelta = params.swap0For1 ? uint256(-amount1Delta) : uint256(-amount0Delta); 147 | 148 | // amountMin slippage check 149 | if (amountOutDelta < params.amountOutMin) { 150 | revert SlippageError(); 151 | } 152 | } 153 | } 154 | 155 | // swap callback function where amount for swap is payed 156 | function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external override { 157 | require(amount0Delta > 0 || amount1Delta > 0); // swaps entirely within 0-liquidity regions are not supported 158 | 159 | // check if really called from pool 160 | (address tokenIn, address tokenOut, uint24 fee) = abi.decode(data, (address, address, uint24)); 161 | if (address(_getPool(tokenIn, tokenOut, fee)) != msg.sender) { 162 | revert Unauthorized(); 163 | } 164 | 165 | // transfer needed amount of tokenIn 166 | uint256 amountToPay = amount0Delta > 0 ? uint256(amount0Delta) : uint256(amount1Delta); 167 | SafeERC20.safeTransfer(IERC20(tokenIn), msg.sender, amountToPay); 168 | } 169 | 170 | // get pool for token 171 | function _getPool(address tokenA, address tokenB, uint24 fee) internal view returns (IUniswapV3Pool) { 172 | return IUniswapV3Pool(PoolAddress.computeAddress(address(factory), PoolAddress.getPoolKey(tokenA, tokenB, fee))); 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /test/integration/InterestRateModel.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.0; 3 | 4 | import "forge-std/Test.sol"; 5 | import "forge-std/console.sol"; 6 | 7 | // base contracts 8 | import "../../src/InterestRateModel.sol"; 9 | 10 | contract InterestRateModelIntegrationTest is Test { 11 | uint256 constant Q32 = 2 ** 32; 12 | uint256 constant Q96 = 2 ** 96; 13 | 14 | uint256 constant YEAR_SECS = 31557600; // taking into account leap years 15 | 16 | uint256 mainnetFork; 17 | InterestRateModel interestRateModel; 18 | 19 | function setUp() external { 20 | // 5% base rate - after 80% - 109% (like in compound v2 deployed) 21 | interestRateModel = new InterestRateModel(0, Q96 * 5 / 100, Q96 * 109 / 100, Q96 * 80 / 100); 22 | } 23 | 24 | function testUtilizationRates() external { 25 | assertEq(interestRateModel.getUtilizationRateX96(10, 0), 0); 26 | assertEq(interestRateModel.getUtilizationRateX96(10, 10), Q96 / 2); 27 | assertEq(interestRateModel.getUtilizationRateX96(0, 10), Q96); 28 | } 29 | 30 | function testInterestRates() external { 31 | (uint256 borrowRateX96, uint256 lendRateX96) = interestRateModel.getRatesPerSecondX96(10, 0); 32 | assertEq(borrowRateX96 * YEAR_SECS, 0); // 0% for 0% utilization 33 | assertEq(lendRateX96 * YEAR_SECS, 0); // 0% for 0% utilization 34 | 35 | (borrowRateX96, lendRateX96) = interestRateModel.getRatesPerSecondX96(10000000, 10000000); 36 | assertEq(borrowRateX96 * YEAR_SECS, 1980704062856608439809600800); // 2.5% per year for 50% utilization 37 | assertEq(lendRateX96 * YEAR_SECS, 990352031428304219889021600); // 1.25% for 50% utilization 38 | 39 | (borrowRateX96, lendRateX96) = interestRateModel.getRatesPerSecondX96(0, 10); 40 | assertEq(borrowRateX96 * YEAR_SECS, 20440865928680199099069868800); // 25.8% per year for 100% utilization 41 | assertEq(lendRateX96 * YEAR_SECS, 20440865928680199099069868800); // 25.8% per year for 100% utilization 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /test/integration/V3Oracle.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.0; 3 | 4 | import "forge-std/Test.sol"; 5 | import "forge-std/console.sol"; 6 | 7 | // base contracts 8 | import "../../src/V3Oracle.sol"; 9 | import "v3-core/interfaces/pool/IUniswapV3PoolDerivedState.sol"; 10 | 11 | import "../../src/interfaces/IErrors.sol"; 12 | 13 | contract V3OracleIntegrationTest is Test { 14 | uint256 constant Q32 = 2 ** 32; 15 | uint256 constant Q96 = 2 ** 96; 16 | 17 | address constant WHALE_ACCOUNT = 0xF977814e90dA44bFA03b6295A0616a897441aceC; 18 | 19 | IERC20 constant WETH = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); 20 | IERC20 constant USDC = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); 21 | IERC20 constant DAI = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); 22 | 23 | IERC20 constant WBTC = IERC20(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599); 24 | 25 | INonfungiblePositionManager constant NPM = INonfungiblePositionManager(0xC36442b4a4522E871399CD717aBDD847Ab11FE88); 26 | 27 | address constant CHAINLINK_USDC_USD = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; 28 | address constant CHAINLINK_DAI_USD = 0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9; 29 | address constant CHAINLINK_ETH_USD = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; 30 | 31 | address constant UNISWAP_DAI_USDC = 0x5777d92f208679DB4b9778590Fa3CAB3aC9e2168; // 0.01% pool 32 | address constant UNISWAP_ETH_USDC = 0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640; // 0.05% pool 33 | 34 | uint256 constant TEST_NFT = 126; // DAI/USDC 0.05% - in range (-276330/-276320) 35 | 36 | uint256 constant TEST_NFT_UNI = 1; // WETH/UNI 0.3% 37 | 38 | uint256 mainnetFork; 39 | V3Oracle oracle; 40 | 41 | function setUp() external { 42 | mainnetFork = vm.createFork("https://rpc.ankr.com/eth", 18521658); 43 | vm.selectFork(mainnetFork); 44 | 45 | // use tolerant oracles (so timewarp for until 30 days works in tests - also allow divergence from price for mocked price results) 46 | oracle = new V3Oracle(NPM, address(USDC), address(0)); 47 | oracle.setTokenConfig( 48 | address(USDC), 49 | AggregatorV3Interface(CHAINLINK_USDC_USD), 50 | 3600 * 24 * 30, 51 | IUniswapV3Pool(address(0)), 52 | 0, 53 | V3Oracle.Mode.TWAP, 54 | 0 55 | ); 56 | oracle.setTokenConfig( 57 | address(DAI), 58 | AggregatorV3Interface(CHAINLINK_DAI_USD), 59 | 3600 * 24 * 30, 60 | IUniswapV3Pool(UNISWAP_DAI_USDC), 61 | 60, 62 | V3Oracle.Mode.CHAINLINK_TWAP_VERIFY, 63 | 200 64 | ); 65 | oracle.setTokenConfig( 66 | address(WETH), 67 | AggregatorV3Interface(CHAINLINK_ETH_USD), 68 | 3600 * 24 * 30, 69 | IUniswapV3Pool(UNISWAP_ETH_USDC), 70 | 60, 71 | V3Oracle.Mode.CHAINLINK_TWAP_VERIFY, 72 | 200 73 | ); 74 | } 75 | 76 | function testConversionChainlink() external { 77 | (uint256 valueUSDC,,,) = oracle.getValue(TEST_NFT, address(USDC)); 78 | assertEq(valueUSDC, 9830229); 79 | 80 | (uint256 valueDAI,,,) = oracle.getValue(TEST_NFT, address(DAI)); 81 | assertEq(valueDAI, 9831304996928906441); 82 | 83 | (uint256 valueWETH,,,) = oracle.getValue(TEST_NFT, address(WETH)); 84 | assertEq(valueWETH, 5265311333743718); 85 | } 86 | 87 | function testConversionTWAP() external { 88 | oracle.setOracleMode(address(USDC), V3Oracle.Mode.TWAP_CHAINLINK_VERIFY); 89 | oracle.setOracleMode(address(DAI), V3Oracle.Mode.TWAP_CHAINLINK_VERIFY); 90 | oracle.setOracleMode(address(WETH), V3Oracle.Mode.TWAP_CHAINLINK_VERIFY); 91 | 92 | (uint256 valueUSDC,,,) = oracle.getValue(TEST_NFT, address(USDC)); 93 | assertEq(valueUSDC, 9830274); 94 | 95 | (uint256 valueDAI,,,) = oracle.getValue(TEST_NFT, address(DAI)); 96 | assertEq(valueDAI, 9830248010486057179); 97 | 98 | (uint256 valueWETH,,,) = oracle.getValue(TEST_NFT, address(WETH)); 99 | assertEq(valueWETH, 5254033922056302); 100 | } 101 | 102 | function testNonExistingToken() external { 103 | vm.expectRevert(IErrors.NotConfigured.selector); 104 | oracle.getValue(TEST_NFT, address(WBTC)); 105 | 106 | vm.expectRevert(IErrors.NotConfigured.selector); 107 | oracle.getValue(TEST_NFT_UNI, address(WETH)); 108 | } 109 | 110 | function testInvalidPoolConfig() external { 111 | vm.expectRevert(IErrors.InvalidPool.selector); 112 | oracle.setTokenConfig( 113 | address(WETH), 114 | AggregatorV3Interface(CHAINLINK_ETH_USD), 115 | 3600, 116 | IUniswapV3Pool(UNISWAP_DAI_USDC), 117 | 60, 118 | V3Oracle.Mode.CHAINLINK_TWAP_VERIFY, 119 | 500 120 | ); 121 | } 122 | 123 | function testEmergencyAdmin() external { 124 | vm.expectRevert(IErrors.Unauthorized.selector); 125 | vm.prank(WHALE_ACCOUNT); 126 | oracle.setOracleMode(address(WETH), V3Oracle.Mode.TWAP_CHAINLINK_VERIFY); 127 | 128 | oracle.setEmergencyAdmin(WHALE_ACCOUNT); 129 | vm.prank(WHALE_ACCOUNT); 130 | oracle.setOracleMode(address(WETH), V3Oracle.Mode.TWAP_CHAINLINK_VERIFY); 131 | } 132 | 133 | function testChainlinkError() external { 134 | vm.mockCall( 135 | CHAINLINK_DAI_USD, 136 | abi.encodeWithSelector(AggregatorV3Interface.latestRoundData.selector), 137 | abi.encode(uint80(0), int256(-1), block.timestamp, block.timestamp, uint80(0)) 138 | ); 139 | vm.expectRevert(IErrors.ChainlinkPriceError.selector); 140 | oracle.getValue(TEST_NFT, address(WETH)); 141 | 142 | vm.mockCall( 143 | CHAINLINK_DAI_USD, 144 | abi.encodeWithSelector(AggregatorV3Interface.latestRoundData.selector), 145 | abi.encode(uint80(0), int256(0), uint256(0), uint256(0), uint80(0)) 146 | ); 147 | vm.expectRevert(IErrors.ChainlinkPriceError.selector); 148 | oracle.getValue(TEST_NFT, address(WETH)); 149 | } 150 | 151 | function testPriceDivergence() external { 152 | // change call to simulate oracle difference in chainlink 153 | vm.mockCall( 154 | CHAINLINK_DAI_USD, 155 | abi.encodeWithSelector(AggregatorV3Interface.latestRoundData.selector), 156 | abi.encode(uint80(0), int256(0), block.timestamp, block.timestamp, uint80(0)) 157 | ); 158 | 159 | vm.expectRevert(IErrors.PriceDifferenceExceeded.selector); 160 | oracle.getValue(TEST_NFT, address(WETH)); 161 | 162 | // works with normal prices 163 | vm.clearMockedCalls(); 164 | (uint256 valueWETH,,,) = oracle.getValue(TEST_NFT, address(WETH)); 165 | assertEq(valueWETH, 5265311333743718); 166 | 167 | // change call to simulate oracle difference in univ3 twap 168 | int56[] memory tickCumulatives = new int56[](2); 169 | uint160[] memory secondsPerLiquidityCumulativeX128s = new uint160[](2); 170 | vm.mockCall( 171 | UNISWAP_DAI_USDC, 172 | abi.encodeWithSelector(IUniswapV3PoolDerivedState.observe.selector), 173 | abi.encode(tickCumulatives, secondsPerLiquidityCumulativeX128s) 174 | ); 175 | vm.expectRevert(IErrors.PriceDifferenceExceeded.selector); 176 | oracle.getValue(TEST_NFT, address(WETH)); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /test/integration/automators/AutoCompound.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.0; 3 | 4 | import "./AutomatorIntegrationTestBase.sol"; 5 | 6 | import "../../../src/transformers/AutoCompound.sol"; 7 | import "../../../src/interfaces/IErrors.sol"; 8 | 9 | contract AutoCompoundTest is AutomatorIntegrationTestBase { 10 | AutoCompound autoCompound; 11 | 12 | function setUp() external { 13 | _setupBase(); 14 | autoCompound = new AutoCompound(NPM, OPERATOR_ACCOUNT, WITHDRAWER_ACCOUNT, 60, 100); 15 | } 16 | 17 | function testNoAccess() external { 18 | vm.expectRevert(IErrors.Unauthorized.selector); 19 | autoCompound.execute(AutoCompound.ExecuteParams(TEST_NFT_2, false, 0)); 20 | } 21 | 22 | function testNoApprove() external { 23 | vm.prank(OPERATOR_ACCOUNT); 24 | vm.expectRevert("Not approved"); 25 | autoCompound.execute(AutoCompound.ExecuteParams(TEST_NFT_2, false, 0)); 26 | } 27 | 28 | function _testWithdrawLeftover() internal { 29 | uint256 baiBalance = DAI.balanceOf(TEST_NFT_2_ACCOUNT); 30 | uint256 wethBalance = WETH_ERC20.balanceOf(TEST_NFT_2_ACCOUNT); 31 | 32 | uint256 daiLeftover = autoCompound.positionBalances(TEST_NFT_2, address(DAI)); 33 | uint256 wethLeftover = autoCompound.positionBalances(TEST_NFT_2, address(WETH_ERC20)); 34 | 35 | vm.expectRevert(IErrors.Unauthorized.selector); 36 | autoCompound.withdrawLeftoverBalances(TEST_NFT_2, TEST_NFT_2_ACCOUNT); 37 | 38 | vm.prank(TEST_NFT_2_ACCOUNT); 39 | autoCompound.withdrawLeftoverBalances(TEST_NFT_2, TEST_NFT_2_ACCOUNT); 40 | 41 | uint256 baiBalanceAfter = DAI.balanceOf(TEST_NFT_2_ACCOUNT); 42 | uint256 wethBalanceAfter = WETH_ERC20.balanceOf(TEST_NFT_2_ACCOUNT); 43 | 44 | assertEq(baiBalanceAfter - baiBalance, daiLeftover); 45 | assertEq(wethBalanceAfter - wethBalance, wethLeftover); 46 | 47 | daiLeftover = autoCompound.positionBalances(TEST_NFT_2, address(DAI)); 48 | wethLeftover = autoCompound.positionBalances(TEST_NFT_2, address(WETH_ERC20)); 49 | assertEq(daiLeftover, 0); 50 | assertEq(wethLeftover, 0); 51 | } 52 | 53 | function _testWithdrawProtocolFee(uint256 expectedDaiFee, uint256 expectedWethFee) internal { 54 | uint256 daiFee = autoCompound.positionBalances(0, address(DAI)); 55 | uint256 wethFee = autoCompound.positionBalances(0, address(WETH_ERC20)); 56 | assertEq(daiFee, expectedDaiFee); 57 | assertEq(wethFee, expectedWethFee); 58 | 59 | address[] memory tokens = new address[](2); 60 | tokens[0] = address(DAI); 61 | tokens[1] = address(address(WETH_ERC20)); 62 | 63 | vm.expectRevert(IErrors.Unauthorized.selector); 64 | autoCompound.withdrawBalances(tokens, WITHDRAWER_ACCOUNT); 65 | 66 | vm.prank(WITHDRAWER_ACCOUNT); 67 | autoCompound.withdrawBalances(tokens, WITHDRAWER_ACCOUNT); 68 | 69 | daiFee = autoCompound.positionBalances(0, address(DAI)); 70 | wethFee = autoCompound.positionBalances(0, address(WETH_ERC20)); 71 | assertEq(daiFee, 0); 72 | assertEq(wethFee, 0); 73 | } 74 | 75 | function testCompoundNoSwapAndLeftover() external { 76 | vm.prank(TEST_NFT_2_ACCOUNT); 77 | NPM.approve(address(autoCompound), TEST_NFT_2); 78 | 79 | (,,,,,,, uint128 liquidity,,,,) = NPM.positions(TEST_NFT_2); 80 | assertEq(liquidity, 80059851033970806503); 81 | 82 | vm.prank(OPERATOR_ACCOUNT); 83 | autoCompound.execute(AutoCompound.ExecuteParams(TEST_NFT_2, false, 0)); 84 | 85 | (,,,,,,, liquidity,,,,) = NPM.positions(TEST_NFT_2); 86 | assertEq(liquidity, 99102324844935209920); 87 | 88 | _testWithdrawLeftover(); 89 | _testWithdrawProtocolFee(0, 1940566999638732); 90 | } 91 | 92 | function testCompoundSwap0To1() external { 93 | vm.prank(TEST_NFT_2_ACCOUNT); 94 | NPM.approve(address(autoCompound), TEST_NFT_2); 95 | 96 | (,,,,,,, uint128 liquidity,,,,) = NPM.positions(TEST_NFT_2); 97 | assertEq(liquidity, 80059851033970806503); 98 | 99 | vm.prank(OPERATOR_ACCOUNT); 100 | autoCompound.execute(AutoCompound.ExecuteParams(TEST_NFT_2, true, 123456789012345678)); 101 | 102 | // more liquidity than without swap 103 | (,,,,,,, liquidity,,,,) = NPM.positions(TEST_NFT_2); 104 | assertEq(liquidity, 99117944276318382811); 105 | 106 | _testWithdrawLeftover(); 107 | _testWithdrawProtocolFee(0, 1942158733643263); 108 | } 109 | 110 | function testCompoundSwap1To0() external { 111 | vm.prank(TEST_NFT_2_ACCOUNT); 112 | NPM.approve(address(autoCompound), TEST_NFT_2); 113 | 114 | (,,,,,,, uint128 liquidity,,,,) = NPM.positions(TEST_NFT_2); 115 | assertEq(liquidity, 80059851033970806503); 116 | 117 | vm.prank(OPERATOR_ACCOUNT); 118 | autoCompound.execute(AutoCompound.ExecuteParams(TEST_NFT_2, false, 1234567890123456)); 119 | 120 | // less liquidity than without swap 121 | (,,,,,,, liquidity,,,,) = NPM.positions(TEST_NFT_2); 122 | assertEq(liquidity, 98864783327532224693); 123 | 124 | _testWithdrawLeftover(); 125 | _testWithdrawProtocolFee(0, 1916359786106899); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /test/integration/automators/AutomatorIntegrationTestBase.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | import "forge-std/Test.sol"; 5 | import "forge-std/console.sol"; 6 | 7 | import "../../../src/transformers/V3Utils.sol"; 8 | import "../../../src/interfaces/IErrors.sol"; 9 | 10 | abstract contract AutomatorIntegrationTestBase is Test { 11 | uint256 constant Q64 = 2 ** 64; 12 | 13 | int24 constant MIN_TICK_100 = -887272; 14 | int24 constant MIN_TICK_500 = -887270; 15 | 16 | IERC20 constant WETH_ERC20 = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); 17 | IERC20 constant USDC = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); 18 | IERC20 constant DAI = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); 19 | 20 | address constant WHALE_ACCOUNT = 0xF977814e90dA44bFA03b6295A0616a897441aceC; 21 | address constant OPERATOR_ACCOUNT = 0xF977814e90dA44bFA03b6295A0616a897441aceC; 22 | address constant WITHDRAWER_ACCOUNT = 0xF977814e90dA44bFA03b6295A0616a897441aceC; 23 | 24 | uint64 constant MAX_REWARD = uint64(Q64 / 400); //0.25% 25 | uint64 constant MAX_FEE_REWARD = uint64(Q64 / 20); //5% 26 | 27 | address FACTORY = 0x1F98431c8aD98523631AE4a59f267346ea31F984; 28 | 29 | INonfungiblePositionManager constant NPM = INonfungiblePositionManager(0xC36442b4a4522E871399CD717aBDD847Ab11FE88); 30 | 31 | address EX0x = 0xDef1C0ded9bec7F1a1670819833240f027b25EfF; // 0x exchange proxy 32 | address UNIVERSAL_ROUTER = 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD; // uniswap universal router 33 | address PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; // permit2 contract 34 | 35 | // DAI/USDC 0.05% - one sided only DAI - current tick is near -276326 - no liquidity (-276320/-276310) 36 | uint256 constant TEST_NFT = 24181; 37 | address constant TEST_NFT_ACCOUNT = 0x8cadb20A4811f363Dadb863A190708bEd26245F8; 38 | address constant TEST_NFT_POOL = 0x6c6Bc977E13Df9b0de53b251522280BB72383700; 39 | 40 | uint256 constant TEST_NFT_2 = 7; // DAI/WETH 0.3% - one sided only WETH - with liquidity and fees (-84120/-78240) 41 | uint256 constant TEST_NFT_2_A = 126; // DAI/USDC 0.05% - in range (-276330/-276320) 42 | uint256 constant TEST_NFT_2_B = 37; // USDC/WETH 0.3% - out of range (192180/193380) 43 | address constant TEST_NFT_2_ACCOUNT = 0x3b8ccaa89FcD432f1334D35b10fF8547001Ce3e5; 44 | address constant TEST_NFT_2_POOL = 0xC2e9F25Be6257c210d7Adf0D4Cd6E3E881ba25f8; 45 | 46 | // DAI/USDC 0.05% - in range - with liquidity and fees 47 | uint256 constant TEST_NFT_3 = 4660; 48 | address constant TEST_NFT_3_ACCOUNT = 0xa3eF006a7da5BcD1144d8BB86EfF1734f46A0c1E; 49 | address constant TEST_NFT_3_POOL = 0x6c6Bc977E13Df9b0de53b251522280BB72383700; 50 | 51 | // USDC/WETH 0.3% - in range - with liquidity and fees 52 | uint256 constant TEST_NFT_4 = 827; 53 | address constant TEST_NFT_4_ACCOUNT = 0x96653b13bD00842Eb8Bc77dCCFd48075178733ce; 54 | address constant TEST_NFT_4_POOL = 0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8; 55 | 56 | // DAI/USDC 0.05% - in range - with liquidity and fees 57 | uint256 constant TEST_NFT_5 = 23901; 58 | address constant TEST_NFT_5_ACCOUNT = 0x082d3e0f04664b65127876e9A05e2183451c792a; 59 | 60 | address constant TEST_FEE_ACCOUNT = 0x8df57E3D9dDde355dCE1adb19eBCe93419ffa0FB; 61 | 62 | uint256 mainnetFork; 63 | 64 | V3Utils v3utils; 65 | 66 | function _setupBase() internal { 67 | mainnetFork = vm.createFork("https://rpc.ankr.com/eth", 15489169); 68 | vm.selectFork(mainnetFork); 69 | 70 | v3utils = new V3Utils(NPM, EX0x, UNIVERSAL_ROUTER, PERMIT2); 71 | } 72 | } 73 | --------------------------------------------------------------------------------