uups-checker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/.gitmodules +6 -0
  2. package/AIFI_AUDIT.md +220 -0
  3. package/ALL_AUDITS_SUMMARY.md +366 -0
  4. package/ALPHA_PROXY_CRITICAL_FINDING.md +136 -0
  5. package/ALPHA_PROXY_FINAL_ANALYSIS.md +213 -0
  6. package/ALPHA_PROXY_FINAL_VERDICT.md +233 -0
  7. package/ALPHA_PROXY_SELFDESTRUCT_EXPLOIT.md +161 -0
  8. package/ARIA-foundry-test.txt +9 -0
  9. package/ARIA-mythril-analysis.txt +20 -0
  10. package/ARIA-slither-analysis.txt +38 -0
  11. package/ARIA_AI_SECURITY_AUDIT.md +290 -0
  12. package/ARIA_VERIFIED_AUDIT.md +259 -0
  13. package/ARIA_VERIFIED_slither.txt +76 -0
  14. package/ARIVA_source.txt +1 -0
  15. package/ARK_AUDIT.md +349 -0
  16. package/BANANA_AUDIT.md +365 -0
  17. package/BAS_AUDIT.md +451 -0
  18. package/BAS_TOKEN_AUDIT.md +235 -0
  19. package/BCE_EXPLOIT_ANALYSIS.md +165 -0
  20. package/BEEFY_BNB_CHAIN_ANALYSIS.md +488 -0
  21. package/BEEFY_MONAD_ANALYSIS.md +239 -0
  22. package/BEEFY_STAKING_ANALYSIS.md +136 -0
  23. package/BEEFY_XVS_WBNB_ACTUAL_FINDINGS.md +223 -0
  24. package/BEEFY_XVS_WBNB_CRITICAL_FINDINGS.md +269 -0
  25. package/BLOCKSEC_ATTACK_KNOWLEDGE_BASE.md +771 -0
  26. package/BRISE_ANALYSIS.txt +31 -0
  27. package/BRISE_BSC_DAPPS.txt +68 -0
  28. package/BRISE_EXPLOITS_FOUND.md +98 -0
  29. package/BRISE_REAL_EXPLOITS.md +115 -0
  30. package/BRISE_WHITEHAT_REPORT.md +162 -0
  31. package/BRISEstake_Analysis.txt +95 -0
  32. package/BSCSLOCKTOKEN_CRITICAL_FINDING.md +240 -0
  33. package/BSW_BISWAP_SECURITY_AUDIT.md +330 -0
  34. package/BTCST_FINAL_VERDICT.md +319 -0
  35. package/BTCST_MINING_REBASE_ANALYSIS.md +229 -0
  36. package/BTCST_ROUNDING_DEEP_DIVE.md +293 -0
  37. package/BTCST_ROUNDING_FINAL_VERDICT.md +9 -0
  38. package/BTCST_SECURITY_ANALYSIS.md +391 -0
  39. package/BTR_AUDIT.md +210 -0
  40. package/BeamBridge-analysis.md +226 -0
  41. package/BeamToken-analysis.md +201 -0
  42. package/BitgertSwap_Investigation.txt +107 -0
  43. package/CEEK_STAKING_ANALYSIS.md +0 -0
  44. package/CHAINBASE_AUDIT.md +422 -0
  45. package/COMPLETE_AUDIT_SUMMARY.md +342 -0
  46. package/CORRECTED_ANALYSIS.txt +115 -0
  47. package/DBXEN_COMPARISON_SUMMARY.md +232 -0
  48. package/DBXEN_EXPLOIT_ANALYSIS.md +530 -0
  49. package/DOPFairLaunch_raw.json +29 -0
  50. package/DOPFairLaunch_source.txt +0 -0
  51. package/DOP_BRIDGE_FINAL_ANALYSIS.txt +86 -0
  52. package/DOP_BUSD_LP_ANALYSIS.txt +44 -0
  53. package/DOP_FAIRLAUNCH_ANALYSIS.txt +61 -0
  54. package/DOP_FAIRLAUNCH_FINAL_VERDICT.txt +113 -0
  55. package/DOP_STAKING_CONTRACT_ANALYSIS.txt +67 -0
  56. package/DSYNC_ECOSYSTEM_ANALYSIS.md +221 -0
  57. package/DSyncStaking-exploit-analysis.md +153 -0
  58. package/DSyncVault-analysis.md +120 -0
  59. package/DUSD_PROXY_AUDIT.md +407 -0
  60. package/DXSALE_LOCK_AUDIT.md +0 -0
  61. package/DXSaleLock_bytecode.txt +1 -0
  62. package/ECHIDNA_QUICK_START.md +101 -0
  63. package/ELEPHANT_ECOSYSTEM_AUDIT_PLAN.md +159 -0
  64. package/ELEPHANT_ECOSYSTEM_COMPREHENSIVE_AUDIT.md +427 -0
  65. package/ELEPHANT_SECURITY_ANALYSIS.md +209 -0
  66. package/ELEPHANT_VULNERABILITIES_EXPLAINED.md +455 -0
  67. package/EXPLOIT_FIX.md +300 -0
  68. package/EXPLOIT_INSTRUCTIONS.md +273 -0
  69. package/EXPLOIT_SUMMARY.md +285 -0
  70. package/EXPLOIT_SUMMARY.txt +175 -0
  71. package/FALCON_FINANCE_AUDIT.md +258 -0
  72. package/FANDOM_AUDIT.md +359 -0
  73. package/FEE_ON_TRANSFER_ANALYSIS.md +228 -0
  74. package/FINAL_AUDIT_REPORT.md +0 -0
  75. package/FOLIO_PROXY_AUDIT.md +299 -0
  76. package/FOT_EXPLOIT_RESULTS.txt +110 -0
  77. package/FOT_TOKENS_AUDITED.md +103 -0
  78. package/HEGIC-mythril-analysis.txt +39 -0
  79. package/HEGIC_COMPLETE_ANALYSIS.md +343 -0
  80. package/HOTCROSS_SWAP_EXPLOIT_ANALYSIS.md +123 -0
  81. package/ICECREAMSWAP_EXPLOITS.md +259 -0
  82. package/IMMUNEFI_REPORT.md +314 -0
  83. package/KCCPAD_EXPLOIT_GUIDE.md +285 -0
  84. package/KEL_CEL_EXPLOIT_ANALYSIS.md +0 -0
  85. package/KOGE_AUDIT.md +328 -0
  86. package/LENDFLARE_ANALYSIS.md +239 -0
  87. package/LENDFLARE_ECHIDNA_GUIDE.md +356 -0
  88. package/LENDFLARE_EXPLOIT_INSTRUCTIONS.md +297 -0
  89. package/LENDFLARE_EXPLOIT_SUMMARY.md +292 -0
  90. package/LENDFLARE_FLASHLOAN_GUIDE.md +383 -0
  91. package/LENDFLARE_FUZZING_RESULTS.md +252 -0
  92. package/LENDFLARE_HONEYPOT_BYPASS_ANALYSIS.md +420 -0
  93. package/LENDFLARE_MANUAL_FUZZING.md +324 -0
  94. package/LENDFLARE_MYTHRIL_ANALYSIS.md +339 -0
  95. package/LENDFLARE_V3_BYPASS.md +296 -0
  96. package/LFTDECOMPILE.txt +14478 -0
  97. package/LFT_ACCOUNTING_ANALYSIS.md +0 -0
  98. package/LFT_ACCOUNTING_BUG_ANALYSIS.md +426 -0
  99. package/LFT_BACKDOOR_DEEP_DIVE.md +0 -0
  100. package/LFT_CRITICAL_EXPLOIT_CONFIRMED.md +428 -0
  101. package/LFT_EXPLOIT_VISUAL.md +253 -0
  102. package/LFT_QUICK_SUMMARY.md +124 -0
  103. package/LFT_REVERSE_EXPLOIT_ANALYSIS.md +521 -0
  104. package/MGO_AUDIT_REPORT.md +420 -0
  105. package/MYTHRIL_FINAL_REPORT.md +306 -0
  106. package/MYTHRIL_SLITHER_SUMMARY.md +244 -0
  107. package/NETX_MIGRATION_AUDIT.md +0 -0
  108. package/NPM_PUBLISH_GUIDE.md +0 -0
  109. package/NRV_CRITICAL_EXPLOIT.txt +143 -0
  110. package/NetX_Analysis.txt +76 -0
  111. package/NetX_Migration_bytecode.txt +1 -0
  112. package/NetX_Migration_source.txt +0 -0
  113. package/NetX_Token_source.txt +0 -0
  114. package/NetxWhitehatRescue +22 -0
  115. package/OILER_ATTACK_VISUAL.md +351 -0
  116. package/OILER_BLOCKSEC_TEST_RESULTS.md +421 -0
  117. package/OILER_DEEP_ANALYSIS.md +212 -0
  118. package/OILER_FINAL_EXPLOIT_REPORT.md +241 -0
  119. package/OILER_FINAL_VERDICT.md +339 -0
  120. package/OILER_REENTRANCY_EXPLAINED.md +638 -0
  121. package/OILER_REENTRANCY_FINAL_SUMMARY.md +391 -0
  122. package/OILER_REENTRANCY_REALITY_CHECK.md +393 -0
  123. package/OILER_REENTRANCY_STEP_BY_STEP.md +597 -0
  124. package/OILER_STAKING_MAINNET_ANALYSIS.md +366 -0
  125. package/OILER_STAKING_SECURITY_ANALYSIS.md +409 -0
  126. package/PANCAKESWAP_UNDERFLOW_HUNTING.md +317 -0
  127. package/POLS_MULTICHAIN_AUDIT.md +0 -0
  128. package/POSI_STAKING_AUDIT.md +0 -0
  129. package/PROXY2_SECURITY_ANALYSIS.md +0 -0
  130. package/Proxy2TACS +29748 -0
  131. package/QUICK_START.md +240 -0
  132. package/RAMP_SECURITY_ANALYSIS.md +0 -0
  133. package/README.md +238 -0
  134. package/REAUDIT_MASTER_LIST.txt +15 -0
  135. package/RING_analysis.txt +212 -0
  136. package/RPC +4 -0
  137. package/RULES.txt +20 -0
  138. package/SIREN_AUDIT.md +186 -0
  139. package/SYNC_EXPLOIT_README.md +0 -0
  140. package/SYNC_TOKEN_EXPLOIT_REPORT.md +224 -0
  141. package/TLM_raw.html +0 -0
  142. package/TLM_raw.txt +0 -0
  143. package/TLM_response.json +1 -0
  144. package/TRADOOR_AUDIT.md +253 -0
  145. package/TRUNK_AUDIT.md +285 -0
  146. package/UNIBASE_AUDIT.md +241 -0
  147. package/UNLOCK_ANALYSIS.md +0 -0
  148. package/UNLOCK_EXPLOIT.md +49 -0
  149. package/UNLOCK_EXPLOIT_ANALYSIS.md +0 -0
  150. package/UPS +232 -0
  151. package/UUPSCHECKER +208 -0
  152. package/VAULT_PROXY_AUDIT.md +457 -0
  153. package/VAULT_PROXY_FINAL_VERDICT.md +0 -0
  154. package/VERIFIED_EXPLOITS_FINAL.txt +146 -0
  155. package/WKEYDAO2_AUDIT.md +245 -0
  156. package/WSG_AUDIT.md +0 -0
  157. package/XFI_DEEP_ANALYSIS.md +327 -0
  158. package/YOOSHI_EXPLOIT_GUIDE.md +119 -0
  159. package/YSDAO_EXPLOIT_GUIDE.md +0 -0
  160. package/agent-4-bundle.md +22490 -0
  161. package/alpha-proxy-echidna.txt +1 -0
  162. package/alpha-proxy-fuzz-results.txt +81 -0
  163. package/alpha-proxy-mythril.txt +2 -0
  164. package/analyze-btcst-farm.js +54 -0
  165. package/analyze-dxsale-lock.js +75 -0
  166. package/analyze-elephant.js +69 -0
  167. package/analyze-fara-rewards.js +109 -0
  168. package/analyze-fara-storage.js +83 -0
  169. package/analyze-lft-transaction.js +158 -0
  170. package/analyze-lock-bytecode.js +59 -0
  171. package/analyze-shegic.js +0 -0
  172. package/analyze-staking-abi.js +0 -0
  173. package/analyze-sxp.js +57 -0
  174. package/analyze-tlm.js +76 -0
  175. package/analyze-trumpet.js +98 -0
  176. package/analyze-unlimited-nft.js +108 -0
  177. package/analyze_elephant.sh +27 -0
  178. package/analyze_vault.sh +32 -0
  179. package/aria-bytecode.txt +1 -0
  180. package/aria_response.json +1 -0
  181. package/ark_temp/README.md +66 -0
  182. package/ark_temp/lib/forge-std/.gitattributes +1 -0
  183. package/ark_temp/lib/forge-std/.github/CODEOWNERS +1 -0
  184. package/ark_temp/lib/forge-std/.github/dependabot.yml +6 -0
  185. package/ark_temp/lib/forge-std/.github/workflows/ci.yml +125 -0
  186. package/ark_temp/lib/forge-std/.github/workflows/sync.yml +36 -0
  187. package/ark_temp/lib/forge-std/CONTRIBUTING.md +193 -0
  188. package/ark_temp/lib/forge-std/LICENSE-APACHE +203 -0
  189. package/ark_temp/lib/forge-std/LICENSE-MIT +25 -0
  190. package/ark_temp/lib/forge-std/README.md +314 -0
  191. package/ark_temp/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
  192. package/ark_temp/lib/forge-std/package.json +16 -0
  193. package/ark_temp/lib/forge-std/scripts/vm.py +636 -0
  194. package/audits/AiFi-security-audit-20260326.md +499 -0
  195. package/audits/BasedAI-Brains-security-audit-20260324.md +651 -0
  196. package/audits/BinanceAlphaWallet-pashov-ai-audit-report-20260324-170000.md +362 -0
  197. package/audits/DGToken-security-audit-20260324.md +376 -0
  198. package/audits/DSyncStaking-audit-part1.md +161 -0
  199. package/audits/DSyncStaking-security-audit-20260324.md +547 -0
  200. package/audits/DecompiledERC20-security-audit-20260325.md +397 -0
  201. package/audits/DegenVC-security-audit-20260324.md +585 -0
  202. package/audits/DelreyInu-security-audit-20260324.md +463 -0
  203. package/audits/DestraNetwork-security-audit-20260324.md +705 -0
  204. package/audits/DomiToken-security-audit-20260324.md +514 -0
  205. package/audits/LendFlareToken-security-audit-20260325.md +197 -0
  206. package/audits/LockReleaseTokenPool-security-audit-20260324.md +482 -0
  207. package/audits/MOG-pashov-ai-audit-report-20260324-164900.md +229 -0
  208. package/audits/PAALAI-security-audit-20260324.md +475 -0
  209. package/audits/PAR-security-audit-20260325.md +311 -0
  210. package/audits/PepeCoinStaking-security-audit-20260324.md +358 -0
  211. package/audits/StakingPool-security-audit-20260324.md +517 -0
  212. package/audits/SyncToken-security-audit-20260324.md +778 -0
  213. package/audits/UndeadToken-decompiled-security-audit-20260324.md +485 -0
  214. package/audits/UnknownToken-decompiled-security-audit-20260324.md +647 -0
  215. package/audits/XFIStaking-security-audit-20260324.md +682 -0
  216. package/audits/Xfinance-security-audit-20260324.md +463 -0
  217. package/audits/basedAIFarm-security-audit-20260324.md +330 -0
  218. package/audits/pepeCoin-security-audit-20260324.md +462 -0
  219. package/bin/ups +232 -0
  220. package/binance-wallet-exploit/.env.example +2 -0
  221. package/binance-wallet-exploit/EXECUTIVE_SUMMARY.md +272 -0
  222. package/binance-wallet-exploit/EXPLOIT_SUMMARY.md +104 -0
  223. package/binance-wallet-exploit/FINAL_ANALYSIS.md +326 -0
  224. package/binance-wallet-exploit/FLASHLOAN_ATTACK.md +292 -0
  225. package/binance-wallet-exploit/HONEYPOT_REPORT.md +526 -0
  226. package/binance-wallet-exploit/INVESTIGATION_COMPLETE.md +362 -0
  227. package/binance-wallet-exploit/LENDFLARE_EXPLOIT.md +219 -0
  228. package/binance-wallet-exploit/LENDFLARE_FINAL_ATTACK.md +307 -0
  229. package/binance-wallet-exploit/LENDFLARE_REAL_EXPLOIT.md +286 -0
  230. package/binance-wallet-exploit/LENDFLARE_RUGPULL.md +269 -0
  231. package/binance-wallet-exploit/LFT_ANALYSIS.md +206 -0
  232. package/binance-wallet-exploit/QUICK_START.md +75 -0
  233. package/binance-wallet-exploit/README.md +195 -0
  234. package/binance-wallet-exploit/REAL_TX_EXPLOIT_ANALYSIS.md +271 -0
  235. package/binance-wallet-exploit/REMIX_INSTRUCTIONS.md +223 -0
  236. package/binance-wallet-exploit/TEST_RESULTS.md +203 -0
  237. package/binance-wallet-exploit/cache/solidity-files-cache.json +1 -0
  238. package/binance-wallet-exploit/cache/test-failures +1 -0
  239. package/binance-wallet-exploit/lib/forge-std/.gitattributes +1 -0
  240. package/binance-wallet-exploit/lib/forge-std/.github/CODEOWNERS +1 -0
  241. package/binance-wallet-exploit/lib/forge-std/.github/dependabot.yml +6 -0
  242. package/binance-wallet-exploit/lib/forge-std/.github/workflows/ci.yml +125 -0
  243. package/binance-wallet-exploit/lib/forge-std/.github/workflows/sync.yml +36 -0
  244. package/binance-wallet-exploit/lib/forge-std/CONTRIBUTING.md +193 -0
  245. package/binance-wallet-exploit/lib/forge-std/LICENSE-APACHE +203 -0
  246. package/binance-wallet-exploit/lib/forge-std/LICENSE-MIT +25 -0
  247. package/binance-wallet-exploit/lib/forge-std/README.md +314 -0
  248. package/binance-wallet-exploit/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
  249. package/binance-wallet-exploit/lib/forge-std/package.json +16 -0
  250. package/binance-wallet-exploit/lib/forge-std/scripts/vm.py +636 -0
  251. package/binance-wallet-exploit/out/build-info/1e9aa7e86cf56962.json +1 -0
  252. package/binance-wallet-exploit/out/build-info/6f56f10e9d7b56eb.json +1 -0
  253. package/binance-wallet-exploit/out/build-info/7edba961ff697a24.json +1 -0
  254. package/binance-wallet-exploit/out/build-info/8c27fe3efea2f2e7.json +1 -0
  255. package/binance-wallet-exploit/out/build-info/978b680daffec63a.json +1 -0
  256. package/binance-wallet-exploit/out/build-info/9806b900b5672d0c.json +1 -0
  257. package/binance-wallet-exploit/out/build-info/b4b9ff36e9b3fc27.json +1 -0
  258. package/binance-wallet-exploit/out/build-info/b6f4df9ae05c0812.json +1 -0
  259. package/binance-wallet-exploit/out/build-info/c88dbc86551f7b5c.json +1 -0
  260. package/binance-wallet-exploit/out/build-info/e9657504010623db.json +1 -0
  261. package/cache/fuzz/failures/ARIAVerifiedFuzzTest/testFuzz_ApprovalRaceCondition +1 -0
  262. package/cache/fuzz/failures/HotCrossSwapFuzzTest/testFuzz_DirectTransferExploit +1 -0
  263. package/cache/fuzz/failures/HotCrossSwapFuzzTest/testFuzz_LargeSwapDrain +1 -0
  264. package/cache/fuzz/failures/LendFlareFuzz/testFuzz_ApprovalExploit +1 -0
  265. package/cache/fuzz/failures/LendFlareFuzz/testFuzz_BalanceManipulation +1 -0
  266. package/cache/fuzz/failures/LendFlareFuzz/testFuzz_RateManipulation +1 -0
  267. package/cache/fuzz/failures/LendFlareFuzz/testFuzz_StorageManipulation +1 -0
  268. package/cache/fuzz/failures/PARFuzzTest/testFuzz_OverflowTransfer +1 -0
  269. package/cache/fuzz/failures/PARFuzzTest/testFuzz_Transfer +1 -0
  270. package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_FrontrunAddfunds +1 -0
  271. package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_RewardOverflow +1 -0
  272. package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_RoundingExploit +1 -0
  273. package/cache/fuzz/failures/XFIDeepFuzz/testFuzz_WithdrawLimit +1 -0
  274. package/cache/solidity-files-cache.json +1 -0
  275. package/cache/test-failures +1 -0
  276. package/calculate-elephant-flashloan.js +195 -0
  277. package/check-address-approval.js +112 -0
  278. package/check-alpha-proxy.js +42 -0
  279. package/check-arbitrage.js +155 -0
  280. package/check-aria-token.js +47 -0
  281. package/check-ark.sh +20 -0
  282. package/check-btcst-mining.js +75 -0
  283. package/check-btcst-pools.js +163 -0
  284. package/check-btcst.js +88 -0
  285. package/check-caller.js +26 -0
  286. package/check-ceek-lp.js +73 -0
  287. package/check-ceek.js +47 -0
  288. package/check-dxsale-address.js +35 -0
  289. package/check-fara-exploit-timing.js +56 -0
  290. package/check-fara-real-exploit.js +73 -0
  291. package/check-flashloan-limits.js +129 -0
  292. package/check-kel-cel-pool.js +91 -0
  293. package/check-lax-staking.js +41 -0
  294. package/check-lendflare.js +165 -0
  295. package/check-lft-accounting.js +109 -0
  296. package/check-lft-roles.js +165 -0
  297. package/check-lock-time.js +47 -0
  298. package/check-min-stake.js +73 -0
  299. package/check-mystery-contract.js +52 -0
  300. package/check-next-token.js +50 -0
  301. package/check-nora-lock.js +67 -0
  302. package/check-oiler-approvals.js +116 -0
  303. package/check-oiler-proxy.js +73 -0
  304. package/check-oiler-staking.js +117 -0
  305. package/check-proxy-simple.js +71 -0
  306. package/check-recent-stakes.js +54 -0
  307. package/check-shegic-holdings.js +67 -0
  308. package/check-snowcrash-ecosystem.js +83 -0
  309. package/check-sync-lp.js +97 -0
  310. package/check-sync-stake.js +42 -0
  311. package/check-tlm.js +37 -0
  312. package/check-token-pools.js +146 -0
  313. package/check-trunk-depeg.js +181 -0
  314. package/check-tusd-decimals.js +58 -0
  315. package/check-user-storage-deep.js +81 -0
  316. package/check-welephant-pools.js +130 -0
  317. package/check-xfi-pool.js +75 -0
  318. package/check-zypher.js +32 -0
  319. package/check_proxy.sh +36 -0
  320. package/compare-tlm-chains.js +90 -0
  321. package/contract_0x05f2.html +6025 -0
  322. package/contract_0x3720.html +6361 -0
  323. package/contract_0x928e.html +5606 -0
  324. package/contract_0xc42d.html +5304 -0
  325. package/contract_page.html +5789 -0
  326. package/decode-stake-tx.js +50 -0
  327. package/deep-analyze-lock.js +82 -0
  328. package/dune_uups_proxy_query.sql +42 -0
  329. package/dune_uups_vulnerable_query.sql +0 -0
  330. package/echidna/alpha-proxy.yaml +14 -0
  331. package/echidna/elephant.yaml +7 -0
  332. package/echidna/lendflare.yaml +42 -0
  333. package/echidna.config.yaml +12 -0
  334. package/elephant_raw.json +1 -0
  335. package/eps_raw.json +1 -0
  336. package/exploit/.github/workflows/test.yml +38 -0
  337. package/exploit/.gitmodules +3 -0
  338. package/exploit/README.md +66 -0
  339. package/exploit/foundry.lock +8 -0
  340. package/exploit/lib/forge-std/.gitattributes +1 -0
  341. package/exploit/lib/forge-std/.github/CODEOWNERS +1 -0
  342. package/exploit/lib/forge-std/.github/dependabot.yml +6 -0
  343. package/exploit/lib/forge-std/.github/workflows/ci.yml +125 -0
  344. package/exploit/lib/forge-std/.github/workflows/sync.yml +36 -0
  345. package/exploit/lib/forge-std/CONTRIBUTING.md +193 -0
  346. package/exploit/lib/forge-std/LICENSE-APACHE +203 -0
  347. package/exploit/lib/forge-std/LICENSE-MIT +25 -0
  348. package/exploit/lib/forge-std/README.md +314 -0
  349. package/exploit/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
  350. package/exploit/lib/forge-std/package.json +16 -0
  351. package/exploit/lib/forge-std/scripts/vm.py +636 -0
  352. package/exploit_analysis.txt +51 -0
  353. package/extract_contract.py +21 -0
  354. package/extract_elephant_contracts.py +24 -0
  355. package/fara-staking-bytecode.txt +1 -0
  356. package/fara-staking-raw.txt +1 -0
  357. package/fetch-aria.js +46 -0
  358. package/fetch-contract.js +50 -0
  359. package/fetch-shegic-source.js +86 -0
  360. package/fetch-snowcrash.js +44 -0
  361. package/fetch-staking-source.js +53 -0
  362. package/fetch-tlm.js +60 -0
  363. package/fetch_elephant_source.py +32 -0
  364. package/find-ceek-staking.js +21 -0
  365. package/find-exploit-tx.js +88 -0
  366. package/find-oiler-holders.js +100 -0
  367. package/find-tlm-holder.js +36 -0
  368. package/find-vulnerable-fund.js +94 -0
  369. package/foundry.lock +8 -0
  370. package/fuzz-all.sh +53 -0
  371. package/get-aria-contract.py +40 -0
  372. package/get-lft-holders.js +89 -0
  373. package/get-tlm-source.sh +8 -0
  374. package/harvest_txs.json +1 -0
  375. package/lft-bytecode-raw.txt +1 -0
  376. package/lft-bytecode.json +1 -0
  377. package/lft-impl.bin +1 -0
  378. package/lft-implementation-bytecode.txt +1 -0
  379. package/lib/forge-std/.gitattributes +1 -0
  380. package/lib/forge-std/.github/CODEOWNERS +1 -0
  381. package/lib/forge-std/.github/dependabot.yml +6 -0
  382. package/lib/forge-std/.github/workflows/ci.yml +125 -0
  383. package/lib/forge-std/.github/workflows/sync.yml +36 -0
  384. package/lib/forge-std/CONTRIBUTING.md +193 -0
  385. package/lib/forge-std/LICENSE-APACHE +203 -0
  386. package/lib/forge-std/LICENSE-MIT +25 -0
  387. package/lib/forge-std/README.md +314 -0
  388. package/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
  389. package/lib/forge-std/package.json +16 -0
  390. package/lib/forge-std/scripts/vm.py +636 -0
  391. package/lib/openzeppelin-contracts/.changeset/config.json +12 -0
  392. package/lib/openzeppelin-contracts/.codecov.yml +12 -0
  393. package/lib/openzeppelin-contracts/.editorconfig +21 -0
  394. package/lib/openzeppelin-contracts/.eslintrc +20 -0
  395. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
  396. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml +4 -0
  397. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
  398. package/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md +20 -0
  399. package/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml +49 -0
  400. package/lib/openzeppelin-contracts/.github/actions/setup/action.yml +21 -0
  401. package/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml +55 -0
  402. package/lib/openzeppelin-contracts/.github/workflows/actionlint.yml +18 -0
  403. package/lib/openzeppelin-contracts/.github/workflows/changeset.yml +28 -0
  404. package/lib/openzeppelin-contracts/.github/workflows/checks.yml +118 -0
  405. package/lib/openzeppelin-contracts/.github/workflows/docs.yml +19 -0
  406. package/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml +68 -0
  407. package/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml +214 -0
  408. package/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml +34 -0
  409. package/lib/openzeppelin-contracts/.gitmodules +7 -0
  410. package/lib/openzeppelin-contracts/.mocharc.js +4 -0
  411. package/lib/openzeppelin-contracts/.prettierrc +15 -0
  412. package/lib/openzeppelin-contracts/.solcover.js +13 -0
  413. package/lib/openzeppelin-contracts/CHANGELOG.md +972 -0
  414. package/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md +73 -0
  415. package/lib/openzeppelin-contracts/CONTRIBUTING.md +36 -0
  416. package/lib/openzeppelin-contracts/GUIDELINES.md +148 -0
  417. package/lib/openzeppelin-contracts/LICENSE +22 -0
  418. package/lib/openzeppelin-contracts/README.md +107 -0
  419. package/lib/openzeppelin-contracts/RELEASING.md +45 -0
  420. package/lib/openzeppelin-contracts/SECURITY.md +42 -0
  421. package/lib/openzeppelin-contracts/audits/2017-03.md +292 -0
  422. package/lib/openzeppelin-contracts/audits/2018-10.pdf +0 -0
  423. package/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf +0 -0
  424. package/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf +0 -0
  425. package/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf +0 -0
  426. package/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf +0 -0
  427. package/lib/openzeppelin-contracts/audits/README.md +17 -0
  428. package/lib/openzeppelin-contracts/certora/Makefile +54 -0
  429. package/lib/openzeppelin-contracts/certora/README.md +60 -0
  430. package/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch +97 -0
  431. package/lib/openzeppelin-contracts/certora/reports/2021-10.pdf +0 -0
  432. package/lib/openzeppelin-contracts/certora/reports/2022-03.pdf +0 -0
  433. package/lib/openzeppelin-contracts/certora/reports/2022-05.pdf +0 -0
  434. package/lib/openzeppelin-contracts/certora/run.js +160 -0
  435. package/lib/openzeppelin-contracts/certora/specs/AccessControl.spec +119 -0
  436. package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec +464 -0
  437. package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec +300 -0
  438. package/lib/openzeppelin-contracts/certora/specs/ERC20.spec +352 -0
  439. package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec +55 -0
  440. package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec +198 -0
  441. package/lib/openzeppelin-contracts/certora/specs/ERC721.spec +679 -0
  442. package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec +333 -0
  443. package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec +246 -0
  444. package/lib/openzeppelin-contracts/certora/specs/Initializable.spec +165 -0
  445. package/lib/openzeppelin-contracts/certora/specs/Ownable.spec +77 -0
  446. package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec +108 -0
  447. package/lib/openzeppelin-contracts/certora/specs/Pausable.spec +96 -0
  448. package/lib/openzeppelin-contracts/certora/specs/TimelockController.spec +274 -0
  449. package/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec +7 -0
  450. package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec +8 -0
  451. package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec +36 -0
  452. package/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec +11 -0
  453. package/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec +5 -0
  454. package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec +3 -0
  455. package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec +5 -0
  456. package/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec +3 -0
  457. package/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec +17 -0
  458. package/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec +3 -0
  459. package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec +5 -0
  460. package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec +7 -0
  461. package/lib/openzeppelin-contracts/certora/specs.json +86 -0
  462. package/lib/openzeppelin-contracts/contracts/access/README.adoc +43 -0
  463. package/lib/openzeppelin-contracts/contracts/finance/README.adoc +14 -0
  464. package/lib/openzeppelin-contracts/contracts/governance/README.adoc +167 -0
  465. package/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +82 -0
  466. package/lib/openzeppelin-contracts/contracts/metatx/README.adoc +12 -0
  467. package/lib/openzeppelin-contracts/contracts/package.json +32 -0
  468. package/lib/openzeppelin-contracts/contracts/proxy/README.adoc +87 -0
  469. package/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +41 -0
  470. package/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +67 -0
  471. package/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +67 -0
  472. package/lib/openzeppelin-contracts/contracts/token/common/README.adoc +10 -0
  473. package/lib/openzeppelin-contracts/contracts/utils/README.adoc +88 -0
  474. package/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +11 -0
  475. package/lib/openzeppelin-contracts/docs/README.md +16 -0
  476. package/lib/openzeppelin-contracts/docs/antora.yml +7 -0
  477. package/lib/openzeppelin-contracts/docs/config.js +21 -0
  478. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3a.png +0 -0
  479. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3b.png +0 -0
  480. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-6.png +0 -0
  481. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack.png +0 -0
  482. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-deposit.png +0 -0
  483. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-mint.png +0 -0
  484. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-linear.png +0 -0
  485. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglog.png +0 -0
  486. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglogext.png +0 -0
  487. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-exec.png +0 -0
  488. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png +0 -0
  489. package/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc +23 -0
  490. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc +204 -0
  491. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc +48 -0
  492. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc +11 -0
  493. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc +19 -0
  494. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc +145 -0
  495. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc +71 -0
  496. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc +77 -0
  497. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc +214 -0
  498. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc +79 -0
  499. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc +77 -0
  500. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc +13 -0
  501. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc +240 -0
  502. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc +79 -0
  503. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc +31 -0
  504. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc +77 -0
  505. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc +185 -0
  506. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc +15 -0
  507. package/lib/openzeppelin-contracts/docs/templates/contract.hbs +111 -0
  508. package/lib/openzeppelin-contracts/docs/templates/helpers.js +46 -0
  509. package/lib/openzeppelin-contracts/docs/templates/page.hbs +4 -0
  510. package/lib/openzeppelin-contracts/docs/templates/properties.js +64 -0
  511. package/lib/openzeppelin-contracts/hardhat/env-artifacts.js +24 -0
  512. package/lib/openzeppelin-contracts/hardhat/env-contract.js +25 -0
  513. package/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js +45 -0
  514. package/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js +6 -0
  515. package/lib/openzeppelin-contracts/hardhat/task-test-get-files.js +25 -0
  516. package/lib/openzeppelin-contracts/hardhat.config.js +131 -0
  517. package/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE +661 -0
  518. package/lib/openzeppelin-contracts/lib/erc4626-tests/README.md +116 -0
  519. package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml +92 -0
  520. package/lib/openzeppelin-contracts/lib/forge-std/.gitmodules +3 -0
  521. package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE +203 -0
  522. package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT +25 -0
  523. package/lib/openzeppelin-contracts/lib/forge-std/README.md +250 -0
  524. package/lib/openzeppelin-contracts/lib/forge-std/package.json +16 -0
  525. package/lib/openzeppelin-contracts/logo.svg +15 -0
  526. package/lib/openzeppelin-contracts/netlify.toml +3 -0
  527. package/lib/openzeppelin-contracts/package-lock.json +16544 -0
  528. package/lib/openzeppelin-contracts/package.json +96 -0
  529. package/lib/openzeppelin-contracts/remappings.txt +1 -0
  530. package/lib/openzeppelin-contracts/renovate.json +4 -0
  531. package/lib/openzeppelin-contracts/requirements.txt +1 -0
  532. package/lib/openzeppelin-contracts/scripts/checks/compare-layout.js +20 -0
  533. package/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js +243 -0
  534. package/lib/openzeppelin-contracts/scripts/checks/extract-layout.js +38 -0
  535. package/lib/openzeppelin-contracts/scripts/checks/generation.sh +6 -0
  536. package/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js +54 -0
  537. package/lib/openzeppelin-contracts/scripts/gen-nav.js +41 -0
  538. package/lib/openzeppelin-contracts/scripts/generate/format-lines.js +16 -0
  539. package/lib/openzeppelin-contracts/scripts/generate/run.js +49 -0
  540. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js +247 -0
  541. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js +17 -0
  542. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js +146 -0
  543. package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js +283 -0
  544. package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js +250 -0
  545. package/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js +126 -0
  546. package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js +78 -0
  547. package/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js +30 -0
  548. package/lib/openzeppelin-contracts/scripts/git-user-config.sh +6 -0
  549. package/lib/openzeppelin-contracts/scripts/helpers.js +37 -0
  550. package/lib/openzeppelin-contracts/scripts/prepack.sh +23 -0
  551. package/lib/openzeppelin-contracts/scripts/prepare-docs.sh +26 -0
  552. package/lib/openzeppelin-contracts/scripts/release/format-changelog.js +33 -0
  553. package/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js +15 -0
  554. package/lib/openzeppelin-contracts/scripts/release/update-comment.js +34 -0
  555. package/lib/openzeppelin-contracts/scripts/release/version.sh +11 -0
  556. package/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh +8 -0
  557. package/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js +48 -0
  558. package/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh +20 -0
  559. package/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh +26 -0
  560. package/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh +26 -0
  561. package/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js +7 -0
  562. package/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js +17 -0
  563. package/lib/openzeppelin-contracts/scripts/release/workflow/start.sh +35 -0
  564. package/lib/openzeppelin-contracts/scripts/release/workflow/state.js +112 -0
  565. package/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js +45 -0
  566. package/lib/openzeppelin-contracts/scripts/solhint-custom/index.js +84 -0
  567. package/lib/openzeppelin-contracts/scripts/solhint-custom/package.json +5 -0
  568. package/lib/openzeppelin-contracts/scripts/update-docs-branch.js +65 -0
  569. package/lib/openzeppelin-contracts/scripts/upgradeable/README.md +21 -0
  570. package/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh +19 -0
  571. package/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh +18 -0
  572. package/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh +54 -0
  573. package/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh +47 -0
  574. package/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch +360 -0
  575. package/lib/openzeppelin-contracts/slither.config.json +5 -0
  576. package/lib/openzeppelin-contracts/solhint.config.js +20 -0
  577. package/mythril-lft-output.txt +1 -0
  578. package/mythril-lft-symbolic.txt +18 -0
  579. package/mythril-lft.sh +20 -0
  580. package/mythril-symbolic-output.txt +1 -0
  581. package/mythril-symbolic.sh +42 -0
  582. package/out/build-info/0026b78428192979.json +1 -0
  583. package/out/build-info/03c4fc3b88486eba.json +1 -0
  584. package/out/build-info/0540afa9b9a5c5a6.json +1 -0
  585. package/out/build-info/081932f505bc08b9.json +1 -0
  586. package/out/build-info/0da104ba0d6642d5.json +1 -0
  587. package/out/build-info/197281971dbb5f23.json +1 -0
  588. package/out/build-info/197e7e332832a232.json +1 -0
  589. package/out/build-info/1a1cab9136eb5f94.json +1 -0
  590. package/out/build-info/1b320204eb162aa2.json +1 -0
  591. package/out/build-info/1e03f94398052674.json +1 -0
  592. package/out/build-info/22ac085949602937.json +1 -0
  593. package/out/build-info/234ef37453a9fa64.json +1 -0
  594. package/out/build-info/2447db7b1878fa8e.json +1 -0
  595. package/out/build-info/25568daeb484f5ff.json +1 -0
  596. package/out/build-info/27465853244c49ce.json +1 -0
  597. package/out/build-info/2c57a9e0f087453b.json +1 -0
  598. package/out/build-info/3c62ae7de8da68c4.json +1 -0
  599. package/out/build-info/3e771ae109e97bb3.json +1 -0
  600. package/out/build-info/460499bc0a3465c4.json +1 -0
  601. package/out/build-info/47ce37e50a4f115e.json +1 -0
  602. package/out/build-info/4fcce5c63cf427d6.json +1 -0
  603. package/out/build-info/4fd0a53fe63fddbb.json +1 -0
  604. package/out/build-info/50f1247db9d769cc.json +1 -0
  605. package/out/build-info/5317d0181a7a5e02.json +1 -0
  606. package/out/build-info/594df509275ceb5b.json +1 -0
  607. package/out/build-info/61983ac3f6141719.json +1 -0
  608. package/out/build-info/638c4548307122fe.json +1 -0
  609. package/out/build-info/67c2c43bdb7c0ded.json +1 -0
  610. package/out/build-info/777f42643aad37b7.json +1 -0
  611. package/out/build-info/7d7856f19e845354.json +1 -0
  612. package/out/build-info/83976260b6f71e94.json +1 -0
  613. package/out/build-info/83c23882000b963d.json +1 -0
  614. package/out/build-info/84b2cce8f70b36be.json +1 -0
  615. package/out/build-info/8bc13d31d7c3206a.json +1 -0
  616. package/out/build-info/8e183bd4d9d8cf88.json +1 -0
  617. package/out/build-info/94bfe1e7cafa8ff5.json +1 -0
  618. package/out/build-info/99ec7d5e8d8ff360.json +1 -0
  619. package/out/build-info/9ac044b29daa7d5e.json +1 -0
  620. package/out/build-info/9b203227ff5d2e63.json +1 -0
  621. package/out/build-info/9d18c5872c4282dd.json +1 -0
  622. package/out/build-info/9f77f04f33baf9a3.json +1 -0
  623. package/out/build-info/a6e1caf974787982.json +1 -0
  624. package/out/build-info/a94b6348867a62d6.json +1 -0
  625. package/out/build-info/ad93721947a8b195.json +1 -0
  626. package/out/build-info/b42daddb5aa4b19f.json +1 -0
  627. package/out/build-info/bf13512ae899f7e8.json +1 -0
  628. package/out/build-info/c39f86c20a548c4a.json +1 -0
  629. package/out/build-info/cb12bb975a2f4e65.json +1 -0
  630. package/out/build-info/d0c6788fadc2aa60.json +1 -0
  631. package/out/build-info/d2726bf94ed5b845.json +1 -0
  632. package/out/build-info/d4eb00da50cce5cb.json +1 -0
  633. package/out/build-info/db931924a3bc8bdd.json +1 -0
  634. package/out/build-info/e1a503d49bc77401.json +1 -0
  635. package/out/build-info/efe5396f8892ce77.json +1 -0
  636. package/out/build-info/f536d90ced745969.json +1 -0
  637. package/out/build-info/fed38823c7019b82.json +1 -0
  638. package/package.json +51 -0
  639. package/page.html +5384 -0
  640. package/pancakeswap-simple-tvl.sql +15 -0
  641. package/pancakeswap-top-pools.sql +29 -0
  642. package/pancakeswap-tvl-optimized.sql +57 -0
  643. package/pancakeswap-tvl-query.sql +60 -0
  644. package/pancakeswap-underflow-hunting.sql +51 -0
  645. package/pancakeswap-vulnerability-queries.sql +200 -0
  646. package/posi_page.html +6369 -0
  647. package/posi_response.json +29 -0
  648. package/proxy_page.html +500 -0
  649. package/run_mythril_elephant.sh +18 -0
  650. package/sHEGIC-bytecode.bin +6 -0
  651. package/sHEGIC-mythril-analysis.txt +1 -0
  652. package/sHEGIC-mythril-full.txt +134 -0
  653. package/sHEGIC_ANALYSIS.md +135 -0
  654. package/sHEGIC_EXPLOIT_ANALYSIS.md +317 -0
  655. package/sHEGIC_MYTHRIL_ANALYSIS.md +361 -0
  656. package/scrape-snowcrash.js +28 -0
  657. package/scripts/yooshi_drain.sh +154 -0
  658. package/shi_raw.json +1 -0
  659. package/temp.json +1 -0
  660. package/temp_harvest.json +1 -0
  661. package/temp_pika.json +1 -0
  662. package/temp_posi.json +1 -0
  663. package/temp_response.json +1 -0
  664. package/test-lft-hidden-balance.js +108 -0
  665. package/test-xfi-exploit.js +140 -0
  666. package/trunk-liquidity-rescue.js +164 -0
  667. package/vBABY_page.html +6153 -0
  668. package/vBABY_response.json +29 -0
  669. package/wsg_response.json +1 -0
  670. package/yooldo_page.html +10371 -0
@@ -0,0 +1,300 @@
1
+ import "helpers/helpers.spec";
2
+
3
+ methods {
4
+ function pushFront(bytes32) external envfree;
5
+ function pushBack(bytes32) external envfree;
6
+ function popFront() external returns (bytes32) envfree;
7
+ function popBack() external returns (bytes32) envfree;
8
+ function clear() external envfree;
9
+
10
+ // exposed for FV
11
+ function begin() external returns (uint128) envfree;
12
+ function end() external returns (uint128) envfree;
13
+
14
+ // view
15
+ function length() external returns (uint256) envfree;
16
+ function empty() external returns (bool) envfree;
17
+ function front() external returns (bytes32) envfree;
18
+ function back() external returns (bytes32) envfree;
19
+ function at_(uint256) external returns (bytes32) envfree; // at is a reserved word
20
+ }
21
+
22
+ definition full() returns bool = length() == max_uint128;
23
+
24
+ /*
25
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
26
+ │ Invariant: empty() is length 0 and no element exists │
27
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
28
+ */
29
+ invariant emptiness()
30
+ empty() <=> length() == 0
31
+ filtered { f -> !f.isView }
32
+
33
+ /*
34
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
35
+ │ Invariant: front points to the first index and back points to the last one │
36
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
37
+ */
38
+ invariant queueFront()
39
+ at_(0) == front()
40
+ filtered { f -> !f.isView }
41
+
42
+ invariant queueBack()
43
+ at_(require_uint256(length() - 1)) == back()
44
+ filtered { f -> !f.isView }
45
+
46
+ /*
47
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
48
+ │ Function correctness: pushFront adds an element at the beginning of the queue │
49
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
50
+ */
51
+ rule pushFront(bytes32 value) {
52
+ uint256 lengthBefore = length();
53
+ bool fullBefore = full();
54
+
55
+ pushFront@withrevert(value);
56
+ bool success = !lastReverted;
57
+
58
+ // liveness
59
+ assert success <=> !fullBefore, "never revert if not previously full";
60
+
61
+ // effect
62
+ assert success => front() == value, "front set to value";
63
+ assert success => to_mathint(length()) == lengthBefore + 1, "queue extended";
64
+ }
65
+
66
+ /*
67
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
68
+ │ Rule: pushFront preserves the previous values in the queue with a +1 offset │
69
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
70
+ */
71
+ rule pushFrontConsistency(uint256 index) {
72
+ bytes32 beforeAt = at_(index);
73
+
74
+ bytes32 value;
75
+ pushFront(value);
76
+
77
+ // try to read value
78
+ bytes32 afterAt = at_@withrevert(require_uint256(index + 1));
79
+
80
+ assert !lastReverted, "value still there";
81
+ assert afterAt == beforeAt, "data is preserved";
82
+ }
83
+
84
+ /*
85
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
86
+ │ Function correctness: pushBack adds an element at the end of the queue │
87
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
88
+ */
89
+ rule pushBack(bytes32 value) {
90
+ uint256 lengthBefore = length();
91
+ bool fullBefore = full();
92
+
93
+ pushBack@withrevert(value);
94
+ bool success = !lastReverted;
95
+
96
+ // liveness
97
+ assert success <=> !fullBefore, "never revert if not previously full";
98
+
99
+ // effect
100
+ assert success => back() == value, "back set to value";
101
+ assert success => to_mathint(length()) == lengthBefore + 1, "queue increased";
102
+ }
103
+
104
+ /*
105
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
106
+ │ Rule: pushBack preserves the previous values in the queue │
107
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
108
+ */
109
+ rule pushBackConsistency(uint256 index) {
110
+ bytes32 beforeAt = at_(index);
111
+
112
+ bytes32 value;
113
+ pushBack(value);
114
+
115
+ // try to read value
116
+ bytes32 afterAt = at_@withrevert(index);
117
+
118
+ assert !lastReverted, "value still there";
119
+ assert afterAt == beforeAt, "data is preserved";
120
+ }
121
+
122
+ /*
123
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
124
+ │ Function correctness: popFront removes an element from the beginning of the queue │
125
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
126
+ */
127
+ rule popFront {
128
+ uint256 lengthBefore = length();
129
+ bytes32 frontBefore = front@withrevert();
130
+
131
+ bytes32 popped = popFront@withrevert();
132
+ bool success = !lastReverted;
133
+
134
+ // liveness
135
+ assert success <=> lengthBefore != 0, "never reverts if not previously empty";
136
+
137
+ // effect
138
+ assert success => frontBefore == popped, "previous front is returned";
139
+ assert success => to_mathint(length()) == lengthBefore - 1, "queue decreased";
140
+ }
141
+
142
+ /*
143
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
144
+ │ Rule: at(x) is preserved and offset to at(x - 1) after calling popFront |
145
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
146
+ */
147
+ rule popFrontConsistency(uint256 index) {
148
+ // Read (any) value that is not the front (this asserts the value exists / the queue is long enough)
149
+ require index > 1;
150
+ bytes32 before = at_(index);
151
+
152
+ popFront();
153
+
154
+ // try to read value
155
+ bytes32 after = at_@withrevert(require_uint256(index - 1));
156
+
157
+ assert !lastReverted, "value still exists in the queue";
158
+ assert before == after, "values are offset and not modified";
159
+ }
160
+
161
+ /*
162
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
163
+ │ Function correctness: popBack removes an element from the end of the queue │
164
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
165
+ */
166
+ rule popBack {
167
+ uint256 lengthBefore = length();
168
+ bytes32 backBefore = back@withrevert();
169
+
170
+ bytes32 popped = popBack@withrevert();
171
+ bool success = !lastReverted;
172
+
173
+ // liveness
174
+ assert success <=> lengthBefore != 0, "never reverts if not previously empty";
175
+
176
+ // effect
177
+ assert success => backBefore == popped, "previous back is returned";
178
+ assert success => to_mathint(length()) == lengthBefore - 1, "queue decreased";
179
+ }
180
+
181
+ /*
182
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
183
+ │ Rule: at(x) is preserved after calling popBack |
184
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
185
+ */
186
+ rule popBackConsistency(uint256 index) {
187
+ // Read (any) value that is not the back (this asserts the value exists / the queue is long enough)
188
+ require to_mathint(index) < length() - 1;
189
+ bytes32 before = at_(index);
190
+
191
+ popBack();
192
+
193
+ // try to read value
194
+ bytes32 after = at_@withrevert(index);
195
+
196
+ assert !lastReverted, "value still exists in the queue";
197
+ assert before == after, "values are offset and not modified";
198
+ }
199
+
200
+ /*
201
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
202
+ │ Function correctness: clear sets length to 0 │
203
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
204
+ */
205
+ rule clear {
206
+ clear@withrevert();
207
+
208
+ // liveness
209
+ assert !lastReverted, "never reverts";
210
+
211
+ // effect
212
+ assert length() == 0, "sets length to 0";
213
+ }
214
+
215
+ /*
216
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
217
+ │ Rule: front/back access reverts only if the queue is empty or querying out of bounds │
218
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
219
+ */
220
+ rule onlyEmptyOrFullRevert(env e) {
221
+ require nonpayable(e);
222
+
223
+ method f;
224
+ calldataarg args;
225
+
226
+ bool emptyBefore = empty();
227
+ bool fullBefore = full();
228
+
229
+ f@withrevert(e, args);
230
+
231
+ assert lastReverted => (
232
+ (f.selector == sig:front().selector && emptyBefore) ||
233
+ (f.selector == sig:back().selector && emptyBefore) ||
234
+ (f.selector == sig:popFront().selector && emptyBefore) ||
235
+ (f.selector == sig:popBack().selector && emptyBefore) ||
236
+ (f.selector == sig:pushFront(bytes32).selector && fullBefore ) ||
237
+ (f.selector == sig:pushBack(bytes32).selector && fullBefore ) ||
238
+ f.selector == sig:at_(uint256).selector // revert conditions are verified in onlyOutOfBoundsRevert
239
+ ), "only revert if empty or out of bounds";
240
+ }
241
+
242
+ /*
243
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
244
+ │ Rule: at(index) only reverts if index is out of bounds |
245
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
246
+ */
247
+ rule onlyOutOfBoundsRevert(uint256 index) {
248
+ at_@withrevert(index);
249
+
250
+ assert lastReverted <=> index >= length(), "only reverts if index is out of bounds";
251
+ }
252
+
253
+ /*
254
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
255
+ │ Rule: only clear/push/pop operations can change the length of the queue │
256
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
257
+ */
258
+ rule noLengthChange(env e) {
259
+ method f;
260
+ calldataarg args;
261
+
262
+ uint256 lengthBefore = length();
263
+ f(e, args);
264
+ uint256 lengthAfter = length();
265
+
266
+ assert lengthAfter != lengthBefore => (
267
+ (f.selector == sig:pushFront(bytes32).selector && to_mathint(lengthAfter) == lengthBefore + 1) ||
268
+ (f.selector == sig:pushBack(bytes32).selector && to_mathint(lengthAfter) == lengthBefore + 1) ||
269
+ (f.selector == sig:popBack().selector && to_mathint(lengthAfter) == lengthBefore - 1) ||
270
+ (f.selector == sig:popFront().selector && to_mathint(lengthAfter) == lengthBefore - 1) ||
271
+ (f.selector == sig:clear().selector && lengthAfter == 0)
272
+ ), "length is only affected by clear/pop/push operations";
273
+ }
274
+
275
+ /*
276
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
277
+ │ Rule: only push/pop can change values bounded in the queue (outside values aren't cleared) │
278
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
279
+ */
280
+ rule noDataChange(env e) {
281
+ method f;
282
+ calldataarg args;
283
+
284
+ uint256 index;
285
+ bytes32 atBefore = at_(index);
286
+ f(e, args);
287
+ bytes32 atAfter = at_@withrevert(index);
288
+ bool atAfterSuccess = !lastReverted;
289
+
290
+ assert !atAfterSuccess <=> (
291
+ (f.selector == sig:clear().selector ) ||
292
+ (f.selector == sig:popBack().selector && index == length()) ||
293
+ (f.selector == sig:popFront().selector && index == length())
294
+ ), "indexes of the queue are only removed by clear or pop";
295
+
296
+ assert atAfterSuccess && atAfter != atBefore => (
297
+ f.selector == sig:popFront().selector ||
298
+ f.selector == sig:pushFront(bytes32).selector
299
+ ), "values of the queue are only changed by popFront or pushFront";
300
+ }
@@ -0,0 +1,352 @@
1
+ import "helpers/helpers.spec";
2
+ import "methods/IERC20.spec";
3
+ import "methods/IERC2612.spec";
4
+
5
+ methods {
6
+ // exposed for FV
7
+ function mint(address,uint256) external;
8
+ function burn(address,uint256) external;
9
+ }
10
+
11
+ /*
12
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
13
+ │ Ghost & hooks: sum of all balances │
14
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
15
+ */
16
+ ghost mathint sumOfBalances {
17
+ init_state axiom sumOfBalances == 0;
18
+ }
19
+
20
+ // Because `balance` has a uint256 type, any balance addition in CVL1 behaved as a `require_uint256()` casting,
21
+ // leaving out the possibility of overflow. This is not the case in CVL2 where casting became more explicit.
22
+ // A counterexample in CVL2 is having an initial state where Alice initial balance is larger than totalSupply, which
23
+ // overflows Alice's balance when receiving a transfer. This is not possible unless the contract is deployed into an
24
+ // already used address (or upgraded from corrupted state).
25
+ // We restrict such behavior by making sure no balance is greater than the sum of balances.
26
+ hook Sload uint256 balance _balances[KEY address addr] STORAGE {
27
+ require sumOfBalances >= to_mathint(balance);
28
+ }
29
+
30
+ hook Sstore _balances[KEY address addr] uint256 newValue (uint256 oldValue) STORAGE {
31
+ sumOfBalances = sumOfBalances - oldValue + newValue;
32
+ }
33
+
34
+ /*
35
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
36
+ │ Invariant: totalSupply is the sum of all balances │
37
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
38
+ */
39
+ invariant totalSupplyIsSumOfBalances()
40
+ to_mathint(totalSupply()) == sumOfBalances;
41
+
42
+ /*
43
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
44
+ │ Invariant: balance of address(0) is 0 │
45
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
46
+ */
47
+ invariant zeroAddressNoBalance()
48
+ balanceOf(0) == 0;
49
+
50
+ /*
51
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
52
+ │ Rules: only mint and burn can change total supply │
53
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
54
+ */
55
+ rule noChangeTotalSupply(env e) {
56
+ requireInvariant totalSupplyIsSumOfBalances();
57
+
58
+ method f;
59
+ calldataarg args;
60
+
61
+ uint256 totalSupplyBefore = totalSupply();
62
+ f(e, args);
63
+ uint256 totalSupplyAfter = totalSupply();
64
+
65
+ assert totalSupplyAfter > totalSupplyBefore => f.selector == sig:mint(address,uint256).selector;
66
+ assert totalSupplyAfter < totalSupplyBefore => f.selector == sig:burn(address,uint256).selector;
67
+ }
68
+
69
+ /*
70
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
71
+ │ Rules: only the token holder or an approved third party can reduce an account's balance │
72
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
73
+ */
74
+ rule onlyAuthorizedCanTransfer(env e) {
75
+ requireInvariant totalSupplyIsSumOfBalances();
76
+
77
+ method f;
78
+ calldataarg args;
79
+ address account;
80
+
81
+ uint256 allowanceBefore = allowance(account, e.msg.sender);
82
+ uint256 balanceBefore = balanceOf(account);
83
+ f(e, args);
84
+ uint256 balanceAfter = balanceOf(account);
85
+
86
+ assert (
87
+ balanceAfter < balanceBefore
88
+ ) => (
89
+ f.selector == sig:burn(address,uint256).selector ||
90
+ e.msg.sender == account ||
91
+ balanceBefore - balanceAfter <= to_mathint(allowanceBefore)
92
+ );
93
+ }
94
+
95
+ /*
96
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
97
+ │ Rules: only the token holder (or a permit) can increase allowance. The spender can decrease it by using it │
98
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
99
+ */
100
+ rule onlyHolderOfSpenderCanChangeAllowance(env e) {
101
+ requireInvariant totalSupplyIsSumOfBalances();
102
+
103
+ method f;
104
+ calldataarg args;
105
+ address holder;
106
+ address spender;
107
+
108
+ uint256 allowanceBefore = allowance(holder, spender);
109
+ f(e, args);
110
+ uint256 allowanceAfter = allowance(holder, spender);
111
+
112
+ assert (
113
+ allowanceAfter > allowanceBefore
114
+ ) => (
115
+ (f.selector == sig:approve(address,uint256).selector && e.msg.sender == holder) ||
116
+ (f.selector == sig:permit(address,address,uint256,uint256,uint8,bytes32,bytes32).selector)
117
+ );
118
+
119
+ assert (
120
+ allowanceAfter < allowanceBefore
121
+ ) => (
122
+ (f.selector == sig:transferFrom(address,address,uint256).selector && e.msg.sender == spender) ||
123
+ (f.selector == sig:approve(address,uint256).selector && e.msg.sender == holder ) ||
124
+ (f.selector == sig:permit(address,address,uint256,uint256,uint8,bytes32,bytes32).selector)
125
+ );
126
+ }
127
+
128
+ /*
129
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
130
+ │ Rules: mint behavior and side effects │
131
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
132
+ */
133
+ rule mint(env e) {
134
+ requireInvariant totalSupplyIsSumOfBalances();
135
+ require nonpayable(e);
136
+
137
+ address to;
138
+ address other;
139
+ uint256 amount;
140
+
141
+ // cache state
142
+ uint256 toBalanceBefore = balanceOf(to);
143
+ uint256 otherBalanceBefore = balanceOf(other);
144
+ uint256 totalSupplyBefore = totalSupply();
145
+
146
+ // run transaction
147
+ mint@withrevert(e, to, amount);
148
+
149
+ // check outcome
150
+ if (lastReverted) {
151
+ assert to == 0 || totalSupplyBefore + amount > max_uint256;
152
+ } else {
153
+ // updates balance and totalSupply
154
+ assert to_mathint(balanceOf(to)) == toBalanceBefore + amount;
155
+ assert to_mathint(totalSupply()) == totalSupplyBefore + amount;
156
+
157
+ // no other balance is modified
158
+ assert balanceOf(other) != otherBalanceBefore => other == to;
159
+ }
160
+ }
161
+
162
+ /*
163
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
164
+ │ Rules: burn behavior and side effects │
165
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
166
+ */
167
+ rule burn(env e) {
168
+ requireInvariant totalSupplyIsSumOfBalances();
169
+ require nonpayable(e);
170
+
171
+ address from;
172
+ address other;
173
+ uint256 amount;
174
+
175
+ // cache state
176
+ uint256 fromBalanceBefore = balanceOf(from);
177
+ uint256 otherBalanceBefore = balanceOf(other);
178
+ uint256 totalSupplyBefore = totalSupply();
179
+
180
+ // run transaction
181
+ burn@withrevert(e, from, amount);
182
+
183
+ // check outcome
184
+ if (lastReverted) {
185
+ assert from == 0 || fromBalanceBefore < amount;
186
+ } else {
187
+ // updates balance and totalSupply
188
+ assert to_mathint(balanceOf(from)) == fromBalanceBefore - amount;
189
+ assert to_mathint(totalSupply()) == totalSupplyBefore - amount;
190
+
191
+ // no other balance is modified
192
+ assert balanceOf(other) != otherBalanceBefore => other == from;
193
+ }
194
+ }
195
+
196
+ /*
197
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
198
+ │ Rule: transfer behavior and side effects │
199
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
200
+ */
201
+ rule transfer(env e) {
202
+ requireInvariant totalSupplyIsSumOfBalances();
203
+ require nonpayable(e);
204
+
205
+ address holder = e.msg.sender;
206
+ address recipient;
207
+ address other;
208
+ uint256 amount;
209
+
210
+ // cache state
211
+ uint256 holderBalanceBefore = balanceOf(holder);
212
+ uint256 recipientBalanceBefore = balanceOf(recipient);
213
+ uint256 otherBalanceBefore = balanceOf(other);
214
+
215
+ // run transaction
216
+ transfer@withrevert(e, recipient, amount);
217
+
218
+ // check outcome
219
+ if (lastReverted) {
220
+ assert holder == 0 || recipient == 0 || amount > holderBalanceBefore;
221
+ } else {
222
+ // balances of holder and recipient are updated
223
+ assert to_mathint(balanceOf(holder)) == holderBalanceBefore - (holder == recipient ? 0 : amount);
224
+ assert to_mathint(balanceOf(recipient)) == recipientBalanceBefore + (holder == recipient ? 0 : amount);
225
+
226
+ // no other balance is modified
227
+ assert balanceOf(other) != otherBalanceBefore => (other == holder || other == recipient);
228
+ }
229
+ }
230
+
231
+ /*
232
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
233
+ │ Rule: transferFrom behavior and side effects │
234
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
235
+ */
236
+ rule transferFrom(env e) {
237
+ requireInvariant totalSupplyIsSumOfBalances();
238
+ require nonpayable(e);
239
+
240
+ address spender = e.msg.sender;
241
+ address holder;
242
+ address recipient;
243
+ address other;
244
+ uint256 amount;
245
+
246
+ // cache state
247
+ uint256 allowanceBefore = allowance(holder, spender);
248
+ uint256 holderBalanceBefore = balanceOf(holder);
249
+ uint256 recipientBalanceBefore = balanceOf(recipient);
250
+ uint256 otherBalanceBefore = balanceOf(other);
251
+
252
+ // run transaction
253
+ transferFrom@withrevert(e, holder, recipient, amount);
254
+
255
+ // check outcome
256
+ if (lastReverted) {
257
+ assert holder == 0 || recipient == 0 || spender == 0 || amount > holderBalanceBefore || amount > allowanceBefore;
258
+ } else {
259
+ // allowance is valid & updated
260
+ assert allowanceBefore >= amount;
261
+ assert to_mathint(allowance(holder, spender)) == (allowanceBefore == max_uint256 ? max_uint256 : allowanceBefore - amount);
262
+
263
+ // balances of holder and recipient are updated
264
+ assert to_mathint(balanceOf(holder)) == holderBalanceBefore - (holder == recipient ? 0 : amount);
265
+ assert to_mathint(balanceOf(recipient)) == recipientBalanceBefore + (holder == recipient ? 0 : amount);
266
+
267
+ // no other balance is modified
268
+ assert balanceOf(other) != otherBalanceBefore => (other == holder || other == recipient);
269
+ }
270
+ }
271
+
272
+ /*
273
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
274
+ │ Rule: approve behavior and side effects │
275
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
276
+ */
277
+ rule approve(env e) {
278
+ require nonpayable(e);
279
+
280
+ address holder = e.msg.sender;
281
+ address spender;
282
+ address otherHolder;
283
+ address otherSpender;
284
+ uint256 amount;
285
+
286
+ // cache state
287
+ uint256 otherAllowanceBefore = allowance(otherHolder, otherSpender);
288
+
289
+ // run transaction
290
+ approve@withrevert(e, spender, amount);
291
+
292
+ // check outcome
293
+ if (lastReverted) {
294
+ assert holder == 0 || spender == 0;
295
+ } else {
296
+ // allowance is updated
297
+ assert allowance(holder, spender) == amount;
298
+
299
+ // other allowances are untouched
300
+ assert allowance(otherHolder, otherSpender) != otherAllowanceBefore => (otherHolder == holder && otherSpender == spender);
301
+ }
302
+ }
303
+
304
+ /*
305
+ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
306
+ │ Rule: permit behavior and side effects │
307
+ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
308
+ */
309
+ rule permit(env e) {
310
+ require nonpayable(e);
311
+
312
+ address holder;
313
+ address spender;
314
+ uint256 amount;
315
+ uint256 deadline;
316
+ uint8 v;
317
+ bytes32 r;
318
+ bytes32 s;
319
+
320
+ address account1;
321
+ address account2;
322
+ address account3;
323
+
324
+ // cache state
325
+ uint256 nonceBefore = nonces(holder);
326
+ uint256 otherNonceBefore = nonces(account1);
327
+ uint256 otherAllowanceBefore = allowance(account2, account3);
328
+
329
+ // sanity: nonce overflow, which possible in theory, is assumed to be impossible in practice
330
+ require nonceBefore < max_uint256;
331
+ require otherNonceBefore < max_uint256;
332
+
333
+ // run transaction
334
+ permit@withrevert(e, holder, spender, amount, deadline, v, r, s);
335
+
336
+ // check outcome
337
+ if (lastReverted) {
338
+ // Without formally checking the signature, we can't verify exactly the revert causes
339
+ assert true;
340
+ } else {
341
+ // allowance and nonce are updated
342
+ assert allowance(holder, spender) == amount;
343
+ assert to_mathint(nonces(holder)) == nonceBefore + 1;
344
+
345
+ // deadline was respected
346
+ assert deadline >= e.block.timestamp;
347
+
348
+ // no other allowance or nonce is modified
349
+ assert nonces(account1) != otherNonceBefore => account1 == holder;
350
+ assert allowance(account2, account3) != otherAllowanceBefore => (account2 == holder && account3 == spender);
351
+ }
352
+ }