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