@snovon/solast 0.2.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 (738) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +190 -0
  3. package/dist/api.d.ts +89 -0
  4. package/dist/api.js +33 -0
  5. package/dist/ast/resolve-return-names.d.ts +2 -0
  6. package/dist/ast/resolve-return-names.js +199 -0
  7. package/dist/ast/solc-walker.d.ts +17 -0
  8. package/dist/ast/solc-walker.js +497 -0
  9. package/dist/ast/storage-layout.d.ts +21 -0
  10. package/dist/ast/storage-layout.js +64 -0
  11. package/dist/cli.d.ts +65 -0
  12. package/dist/cli.js +755 -0
  13. package/dist/config.d.ts +9 -0
  14. package/dist/config.js +284 -0
  15. package/dist/dedup/files.d.ts +1 -0
  16. package/dist/dedup/files.js +74 -0
  17. package/dist/dedup/findings.d.ts +41 -0
  18. package/dist/dedup/findings.js +211 -0
  19. package/dist/detectors/_common/access-control.d.ts +204 -0
  20. package/dist/detectors/_common/access-control.js +377 -0
  21. package/dist/detectors/_common/ast.d.ts +139 -0
  22. package/dist/detectors/_common/ast.js +239 -0
  23. package/dist/detectors/_common/compiler-profile.d.ts +14 -0
  24. package/dist/detectors/_common/compiler-profile.js +66 -0
  25. package/dist/detectors/_common/dataflow.d.ts +75 -0
  26. package/dist/detectors/_common/dataflow.js +57 -0
  27. package/dist/detectors/_common/fhe.d.ts +7 -0
  28. package/dist/detectors/_common/fhe.js +40 -0
  29. package/dist/detectors/_common/integer-overflow-helpers.d.ts +58 -0
  30. package/dist/detectors/_common/integer-overflow-helpers.js +422 -0
  31. package/dist/detectors/_common/loop-call-stack.d.ts +9 -0
  32. package/dist/detectors/_common/loop-call-stack.js +132 -0
  33. package/dist/detectors/_common/oracle.d.ts +5 -0
  34. package/dist/detectors/_common/oracle.js +64 -0
  35. package/dist/detectors/_common/price-rate.d.ts +116 -0
  36. package/dist/detectors/_common/price-rate.js +446 -0
  37. package/dist/detectors/_common/source-text.d.ts +11 -0
  38. package/dist/detectors/_common/source-text.js +82 -0
  39. package/dist/detectors/_common/weighted-pool-invariant.d.ts +21 -0
  40. package/dist/detectors/_common/weighted-pool-invariant.js +105 -0
  41. package/dist/detectors/aave-v2-reentrancy.d.ts +7 -0
  42. package/dist/detectors/aave-v2-reentrancy.js +286 -0
  43. package/dist/detectors/access-control.d.ts +103 -0
  44. package/dist/detectors/access-control.js +983 -0
  45. package/dist/detectors/add-reentrancy-on-weth-contract.d.ts +7 -0
  46. package/dist/detectors/add-reentrancy-on-weth-contract.js +536 -0
  47. package/dist/detectors/ai-generated-randomness.d.ts +32 -0
  48. package/dist/detectors/ai-generated-randomness.js +239 -0
  49. package/dist/detectors/amm-spot-oracle-manipulation.d.ts +52 -0
  50. package/dist/detectors/amm-spot-oracle-manipulation.js +420 -0
  51. package/dist/detectors/analyzing-the-uniswap-v3-exploit.d.ts +26 -0
  52. package/dist/detectors/analyzing-the-uniswap-v3-exploit.js +279 -0
  53. package/dist/detectors/any-token-is-destroyed.d.ts +34 -0
  54. package/dist/detectors/any-token-is-destroyed.js +527 -0
  55. package/dist/detectors/anyswap-anytoken-permit-allowance-drain.d.ts +7 -0
  56. package/dist/detectors/anyswap-anytoken-permit-allowance-drain.js +524 -0
  57. package/dist/detectors/anyswap-insufficient-token-validation.d.ts +24 -0
  58. package/dist/detectors/anyswap-insufficient-token-validation.js +342 -0
  59. package/dist/detectors/approval-based-drain.d.ts +7 -0
  60. package/dist/detectors/approval-based-drain.js +772 -0
  61. package/dist/detectors/arbitrary-account-balance-transfer.d.ts +7 -0
  62. package/dist/detectors/arbitrary-account-balance-transfer.js +485 -0
  63. package/dist/detectors/arbitrary-address-spoofing-attack.d.ts +7 -0
  64. package/dist/detectors/arbitrary-address-spoofing-attack.js +444 -0
  65. package/dist/detectors/arbitrary-address-spoofing.d.ts +9 -0
  66. package/dist/detectors/arbitrary-address-spoofing.js +657 -0
  67. package/dist/detectors/arbitrary-call-error.d.ts +127 -0
  68. package/dist/detectors/arbitrary-call-error.js +1163 -0
  69. package/dist/detectors/arbitrary-call.d.ts +4 -0
  70. package/dist/detectors/arbitrary-call.js +11 -0
  71. package/dist/detectors/arbitrary-delegatecall-target.d.ts +35 -0
  72. package/dist/detectors/arbitrary-delegatecall-target.js +554 -0
  73. package/dist/detectors/arbitrary-recipient-no-access-control.d.ts +7 -0
  74. package/dist/detectors/arbitrary-recipient-no-access-control.js +638 -0
  75. package/dist/detectors/arbitrary-storage-proof-forgery.d.ts +35 -0
  76. package/dist/detectors/arbitrary-storage-proof-forgery.js +340 -0
  77. package/dist/detectors/arbitrary-transfer-from.d.ts +38 -0
  78. package/dist/detectors/arbitrary-transfer-from.js +339 -0
  79. package/dist/detectors/arbitrum-cross-chain-message-replay.d.ts +22 -0
  80. package/dist/detectors/arbitrum-cross-chain-message-replay.js +477 -0
  81. package/dist/detectors/avs-slashing-without-quorum-check.d.ts +50 -0
  82. package/dist/detectors/avs-slashing-without-quorum-check.js +386 -0
  83. package/dist/detectors/bad-debt-propagation.d.ts +13 -0
  84. package/dist/detectors/bad-debt-propagation.js +480 -0
  85. package/dist/detectors/bad-k-value-verification.d.ts +7 -0
  86. package/dist/detectors/bad-k-value-verification.js +512 -0
  87. package/dist/detectors/bad-randomness-zero-blockhash.d.ts +29 -0
  88. package/dist/detectors/bad-randomness-zero-blockhash.js +115 -0
  89. package/dist/detectors/balancer-flash-loan-manipulation.d.ts +33 -0
  90. package/dist/detectors/balancer-flash-loan-manipulation.js +178 -0
  91. package/dist/detectors/balancer-pause-guard.d.ts +33 -0
  92. package/dist/detectors/balancer-pause-guard.js +307 -0
  93. package/dist/detectors/balancer-weighted-pool-flash-loan.d.ts +42 -0
  94. package/dist/detectors/balancer-weighted-pool-flash-loan.js +275 -0
  95. package/dist/detectors/batch-transfer-overflow.d.ts +7 -0
  96. package/dist/detectors/batch-transfer-overflow.js +465 -0
  97. package/dist/detectors/beneficiary-validation.d.ts +7 -0
  98. package/dist/detectors/beneficiary-validation.js +696 -0
  99. package/dist/detectors/borrow-behalf-consent.d.ts +7 -0
  100. package/dist/detectors/borrow-behalf-consent.js +400 -0
  101. package/dist/detectors/break-continue-scope.d.ts +7 -0
  102. package/dist/detectors/break-continue-scope.js +194 -0
  103. package/dist/detectors/bridge-accounting-bypass.d.ts +65 -0
  104. package/dist/detectors/bridge-accounting-bypass.js +449 -0
  105. package/dist/detectors/bridge-business-logic-flaw-incorrect-acc.d.ts +43 -0
  106. package/dist/detectors/bridge-business-logic-flaw-incorrect-acc.js +394 -0
  107. package/dist/detectors/bridge-collateral-drain.d.ts +7 -0
  108. package/dist/detectors/bridge-collateral-drain.js +630 -0
  109. package/dist/detectors/bridge-forged-proof.d.ts +7 -0
  110. package/dist/detectors/bridge-forged-proof.js +754 -0
  111. package/dist/detectors/bridge-missing-message-nonce.d.ts +57 -0
  112. package/dist/detectors/bridge-missing-message-nonce.js +638 -0
  113. package/dist/detectors/bridge-swap-metapool-attack.d.ts +20 -0
  114. package/dist/detectors/bridge-swap-metapool-attack.js +230 -0
  115. package/dist/detectors/business-logic-flaw-flashloan-price-mani.d.ts +7 -0
  116. package/dist/detectors/business-logic-flaw-flashloan-price-mani.js +353 -0
  117. package/dist/detectors/business-logic-flaw-incorrect-recipient-balance.d.ts +7 -0
  118. package/dist/detectors/business-logic-flaw-incorrect-recipient-balance.js +403 -0
  119. package/dist/detectors/business-logic-flaw.d.ts +21 -0
  120. package/dist/detectors/business-logic-flaw.js +339 -0
  121. package/dist/detectors/business-logic.d.ts +17 -0
  122. package/dist/detectors/business-logic.js +22 -0
  123. package/dist/detectors/bypassed-insolvency-check.d.ts +30 -0
  124. package/dist/detectors/bypassed-insolvency-check.js +232 -0
  125. package/dist/detectors/bytecode-divergence-risk.d.ts +32 -0
  126. package/dist/detectors/bytecode-divergence-risk.js +150 -0
  127. package/dist/detectors/cache-array-length.d.ts +30 -0
  128. package/dist/detectors/cache-array-length.js +177 -0
  129. package/dist/detectors/cache-storage-reads.d.ts +46 -0
  130. package/dist/detectors/cache-storage-reads.js +323 -0
  131. package/dist/detectors/calldata-secret-access-control.d.ts +36 -0
  132. package/dist/detectors/calldata-secret-access-control.js +446 -0
  133. package/dist/detectors/capital-cross-contract-reentrancy.d.ts +34 -0
  134. package/dist/detectors/capital-cross-contract-reentrancy.js +481 -0
  135. package/dist/detectors/cartel-custom-approval-logic.d.ts +7 -0
  136. package/dist/detectors/cartel-custom-approval-logic.js +407 -0
  137. package/dist/detectors/ccip-receiver-missing-replay-guard.d.ts +22 -0
  138. package/dist/detectors/ccip-receiver-missing-replay-guard.js +413 -0
  139. package/dist/detectors/chain-coupling-risk.d.ts +8 -0
  140. package/dist/detectors/chain-coupling-risk.js +203 -0
  141. package/dist/detectors/chainlink-deprecated-function.d.ts +7 -0
  142. package/dist/detectors/chainlink-deprecated-function.js +205 -0
  143. package/dist/detectors/chainlink-tx-origin.d.ts +7 -0
  144. package/dist/detectors/chainlink-tx-origin.js +363 -0
  145. package/dist/detectors/check-effects-interactions.d.ts +39 -0
  146. package/dist/detectors/check-effects-interactions.js +783 -0
  147. package/dist/detectors/check-permit-missing-chainid.d.ts +27 -0
  148. package/dist/detectors/check-permit-missing-chainid.js +456 -0
  149. package/dist/detectors/classic-reentrancy.d.ts +93 -0
  150. package/dist/detectors/classic-reentrancy.js +645 -0
  151. package/dist/detectors/coinbase-morpho-wethloan-policy.d.ts +29 -0
  152. package/dist/detectors/coinbase-morpho-wethloan-policy.js +368 -0
  153. package/dist/detectors/compoundv2-inflation-attack.d.ts +7 -0
  154. package/dist/detectors/compoundv2-inflation-attack.js +675 -0
  155. package/dist/detectors/constructor-address-validation.d.ts +24 -0
  156. package/dist/detectors/constructor-address-validation.js +335 -0
  157. package/dist/detectors/constructor-interface-no-address-validation.d.ts +32 -0
  158. package/dist/detectors/constructor-interface-no-address-validation.js +283 -0
  159. package/dist/detectors/cross-chain-arbitrary-call.d.ts +7 -0
  160. package/dist/detectors/cross-chain-arbitrary-call.js +601 -0
  161. package/dist/detectors/cross-chain-input-validation.d.ts +31 -0
  162. package/dist/detectors/cross-chain-input-validation.js +347 -0
  163. package/dist/detectors/cross-chain-intent-replay.d.ts +38 -0
  164. package/dist/detectors/cross-chain-intent-replay.js +453 -0
  165. package/dist/detectors/cross-chain-intent-stale-resolution.d.ts +7 -0
  166. package/dist/detectors/cross-chain-intent-stale-resolution.js +463 -0
  167. package/dist/detectors/cross-chain-message-order-dependency.d.ts +8 -0
  168. package/dist/detectors/cross-chain-message-order-dependency.js +472 -0
  169. package/dist/detectors/cross-chain-message-replay.d.ts +8 -0
  170. package/dist/detectors/cross-chain-message-replay.js +568 -0
  171. package/dist/detectors/cross-chain-messaging.d.ts +7 -0
  172. package/dist/detectors/cross-chain-messaging.js +663 -0
  173. package/dist/detectors/cross-chain-msg-truncation.d.ts +7 -0
  174. package/dist/detectors/cross-chain-msg-truncation.js +453 -0
  175. package/dist/detectors/cross-chain-truncation.d.ts +7 -0
  176. package/dist/detectors/cross-chain-truncation.js +422 -0
  177. package/dist/detectors/cross-contract-integer-overflow.d.ts +76 -0
  178. package/dist/detectors/cross-contract-integer-overflow.js +554 -0
  179. package/dist/detectors/cross-contract-reentrancy-trusted-callee.d.ts +39 -0
  180. package/dist/detectors/cross-contract-reentrancy-trusted-callee.js +385 -0
  181. package/dist/detectors/cross-contract-reentrancy.d.ts +63 -0
  182. package/dist/detectors/cross-contract-reentrancy.js +631 -0
  183. package/dist/detectors/cross-function-reentrancy.d.ts +37 -0
  184. package/dist/detectors/cross-function-reentrancy.js +648 -0
  185. package/dist/detectors/cross-protocol-contagion.d.ts +20 -0
  186. package/dist/detectors/cross-protocol-contagion.js +445 -0
  187. package/dist/detectors/cross-protocol-oracle-collateral.d.ts +38 -0
  188. package/dist/detectors/cross-protocol-oracle-collateral.js +487 -0
  189. package/dist/detectors/cross-vm-reentrancy.d.ts +7 -0
  190. package/dist/detectors/cross-vm-reentrancy.js +484 -0
  191. package/dist/detectors/decimals-mismatch.d.ts +89 -0
  192. package/dist/detectors/decimals-mismatch.js +451 -0
  193. package/dist/detectors/deferred-state-update.d.ts +16 -0
  194. package/dist/detectors/deferred-state-update.js +35 -0
  195. package/dist/detectors/deflationary-token.d.ts +27 -0
  196. package/dist/detectors/deflationary-token.js +751 -0
  197. package/dist/detectors/delegate-transfer-unrestricted-caller.d.ts +44 -0
  198. package/dist/detectors/delegate-transfer-unrestricted-caller.js +410 -0
  199. package/dist/detectors/delegatecall-fallback-reentrancy-bypass.d.ts +14 -0
  200. package/dist/detectors/delegatecall-fallback-reentrancy-bypass.js +241 -0
  201. package/dist/detectors/delegatecall-in-loops.d.ts +7 -0
  202. package/dist/detectors/delegatecall-in-loops.js +129 -0
  203. package/dist/detectors/delegatecall-init-owner-mutator.d.ts +8 -0
  204. package/dist/detectors/delegatecall-init-owner-mutator.js +655 -0
  205. package/dist/detectors/delegatecall-init.d.ts +7 -0
  206. package/dist/detectors/delegatecall-init.js +769 -0
  207. package/dist/detectors/delegatecall-untrusted-implementation.d.ts +41 -0
  208. package/dist/detectors/delegatecall-untrusted-implementation.js +888 -0
  209. package/dist/detectors/delegated-authorization-bypass.d.ts +7 -0
  210. package/dist/detectors/delegated-authorization-bypass.js +370 -0
  211. package/dist/detectors/denial-of-service.d.ts +117 -0
  212. package/dist/detectors/denial-of-service.js +947 -0
  213. package/dist/detectors/division-before-multiplication.d.ts +7 -0
  214. package/dist/detectors/division-before-multiplication.js +303 -0
  215. package/dist/detectors/dn404-mirror-access-control.d.ts +26 -0
  216. package/dist/detectors/dn404-mirror-access-control.js +315 -0
  217. package/dist/detectors/doge-flashloan.d.ts +29 -0
  218. package/dist/detectors/doge-flashloan.js +329 -0
  219. package/dist/detectors/donate-inflation-exchangerate-roundin.d.ts +7 -0
  220. package/dist/detectors/donate-inflation-exchangerate-roundin.js +621 -0
  221. package/dist/detectors/donation-share-inflation.d.ts +24 -0
  222. package/dist/detectors/donation-share-inflation.js +466 -0
  223. package/dist/detectors/dont-let-eth-get-rekt.d.ts +84 -0
  224. package/dist/detectors/dont-let-eth-get-rekt.js +1151 -0
  225. package/dist/detectors/dos-unbounded-loop-external-call-revert.d.ts +37 -0
  226. package/dist/detectors/dos-unbounded-loop-external-call-revert.js +541 -0
  227. package/dist/detectors/eip1167-proxy-reentrancy.d.ts +7 -0
  228. package/dist/detectors/eip1167-proxy-reentrancy.js +508 -0
  229. package/dist/detectors/eip4626-vault-reentrancy.d.ts +32 -0
  230. package/dist/detectors/eip4626-vault-reentrancy.js +312 -0
  231. package/dist/detectors/eip5792-auth-replay.d.ts +45 -0
  232. package/dist/detectors/eip5792-auth-replay.js +519 -0
  233. package/dist/detectors/eip712-domain-separator.d.ts +42 -0
  234. package/dist/detectors/eip712-domain-separator.js +524 -0
  235. package/dist/detectors/eip712-signature-verification.d.ts +49 -0
  236. package/dist/detectors/eip712-signature-verification.js +689 -0
  237. package/dist/detectors/eip7702-auth-replay.d.ts +7 -0
  238. package/dist/detectors/eip7702-auth-replay.js +768 -0
  239. package/dist/detectors/eip7702-cross-chain-replay.d.ts +27 -0
  240. package/dist/detectors/eip7702-cross-chain-replay.js +307 -0
  241. package/dist/detectors/eip7702-delegated-eoa-approval-race.d.ts +39 -0
  242. package/dist/detectors/eip7702-delegated-eoa-approval-race.js +413 -0
  243. package/dist/detectors/eip7702-delegation-reentrancy.d.ts +21 -0
  244. package/dist/detectors/eip7702-delegation-reentrancy.js +705 -0
  245. package/dist/detectors/eip7702-delegation-risk.d.ts +7 -0
  246. package/dist/detectors/eip7702-delegation-risk.js +745 -0
  247. package/dist/detectors/eip7702-eoa-assumption.d.ts +57 -0
  248. package/dist/detectors/eip7702-eoa-assumption.js +461 -0
  249. package/dist/detectors/erc1155-batch-missing-per-id-approval.d.ts +23 -0
  250. package/dist/detectors/erc1155-batch-missing-per-id-approval.js +343 -0
  251. package/dist/detectors/erc1155-reentrancy.d.ts +31 -0
  252. package/dist/detectors/erc1155-reentrancy.js +217 -0
  253. package/dist/detectors/erc1271-stub-implementation.d.ts +21 -0
  254. package/dist/detectors/erc1271-stub-implementation.js +268 -0
  255. package/dist/detectors/erc20-safe-wrapper-return-unchecked.d.ts +43 -0
  256. package/dist/detectors/erc20-safe-wrapper-return-unchecked.js +368 -0
  257. package/dist/detectors/erc20-unchecked-non-standard-return.d.ts +55 -0
  258. package/dist/detectors/erc20-unchecked-non-standard-return.js +454 -0
  259. package/dist/detectors/erc2612-permit-frontrunning.d.ts +23 -0
  260. package/dist/detectors/erc2612-permit-frontrunning.js +246 -0
  261. package/dist/detectors/erc2771-context-spoofing.d.ts +41 -0
  262. package/dist/detectors/erc2771-context-spoofing.js +510 -0
  263. package/dist/detectors/erc4337-validation-storage-access.d.ts +35 -0
  264. package/dist/detectors/erc4337-validation-storage-access.js +232 -0
  265. package/dist/detectors/erc4626-totalassets-stub.d.ts +17 -0
  266. package/dist/detectors/erc4626-totalassets-stub.js +216 -0
  267. package/dist/detectors/erc6909-balance-overflow.d.ts +7 -0
  268. package/dist/detectors/erc6909-balance-overflow.js +688 -0
  269. package/dist/detectors/erc6909-operator-scope.d.ts +49 -0
  270. package/dist/detectors/erc6909-operator-scope.js +494 -0
  271. package/dist/detectors/erc721-unchecked-transfer.d.ts +38 -0
  272. package/dist/detectors/erc721-unchecked-transfer.js +364 -0
  273. package/dist/detectors/erc7579-module-install-without-threshold.d.ts +40 -0
  274. package/dist/detectors/erc7579-module-install-without-threshold.js +338 -0
  275. package/dist/detectors/erc7683-fill-validation.d.ts +53 -0
  276. package/dist/detectors/erc7683-fill-validation.js +758 -0
  277. package/dist/detectors/erc7683-intent-resolution.d.ts +7 -0
  278. package/dist/detectors/erc7683-intent-resolution.js +457 -0
  279. package/dist/detectors/erc777-callback-reentrancy.d.ts +8 -0
  280. package/dist/detectors/erc777-callback-reentrancy.js +439 -0
  281. package/dist/detectors/erc777-reentrancy.d.ts +7 -0
  282. package/dist/detectors/erc777-reentrancy.js +488 -0
  283. package/dist/detectors/erc777-tokens-to-send-reentrancy.d.ts +47 -0
  284. package/dist/detectors/erc777-tokens-to-send-reentrancy.js +674 -0
  285. package/dist/detectors/estuary-token-flaw.d.ts +16 -0
  286. package/dist/detectors/estuary-token-flaw.js +547 -0
  287. package/dist/detectors/euler-debt-token-manipulation.d.ts +32 -0
  288. package/dist/detectors/euler-debt-token-manipulation.js +347 -0
  289. package/dist/detectors/exploiting-a-vulnerability-in-curve-fina.d.ts +29 -0
  290. package/dist/detectors/exploiting-a-vulnerability-in-curve-fina.js +210 -0
  291. package/dist/detectors/fallback-delegatecall-reentrancy.d.ts +14 -0
  292. package/dist/detectors/fallback-delegatecall-reentrancy.js +236 -0
  293. package/dist/detectors/farm-business-logic-flaw-lack-of-access.d.ts +7 -0
  294. package/dist/detectors/farm-business-logic-flaw-lack-of-access.js +665 -0
  295. package/dist/detectors/fee-mechanism-exploitation.d.ts +20 -0
  296. package/dist/detectors/fee-mechanism-exploitation.js +400 -0
  297. package/dist/detectors/fee-on-transfer-balance-mismatch.d.ts +49 -0
  298. package/dist/detectors/fee-on-transfer-balance-mismatch.js +394 -0
  299. package/dist/detectors/fhe-encrypted-input-validation.d.ts +29 -0
  300. package/dist/detectors/fhe-encrypted-input-validation.js +210 -0
  301. package/dist/detectors/fhe-handle-leakage.d.ts +44 -0
  302. package/dist/detectors/fhe-handle-leakage.js +315 -0
  303. package/dist/detectors/fhe-oz-pattern-misuse.d.ts +26 -0
  304. package/dist/detectors/fhe-oz-pattern-misuse.js +311 -0
  305. package/dist/detectors/fhe-state-leakage.d.ts +8 -0
  306. package/dist/detectors/fhe-state-leakage.js +400 -0
  307. package/dist/detectors/fi-bridges.d.ts +33 -0
  308. package/dist/detectors/fi-bridges.js +428 -0
  309. package/dist/detectors/finance-access-control-price-oracle-man.d.ts +9 -0
  310. package/dist/detectors/finance-access-control-price-oracle-man.js +640 -0
  311. package/dist/detectors/finance-bridge-address0safetransferfrom.d.ts +8 -0
  312. package/dist/detectors/finance-bridge-address0safetransferfrom.js +574 -0
  313. package/dist/detectors/finance-business-logic-in-mint.d.ts +54 -0
  314. package/dist/detectors/finance-business-logic-in-mint.js +687 -0
  315. package/dist/detectors/finance-erc667-reentrancy.d.ts +7 -0
  316. package/dist/detectors/finance-erc667-reentrancy.js +509 -0
  317. package/dist/detectors/finance-flashloan-price-oracle-manipul.d.ts +7 -0
  318. package/dist/detectors/finance-flashloan-price-oracle-manipul.js +546 -0
  319. package/dist/detectors/finance-flashloan-reentrancy.d.ts +7 -0
  320. package/dist/detectors/finance-flashloan-reentrancy.js +547 -0
  321. package/dist/detectors/finance-swap-metapool-attack.d.ts +19 -0
  322. package/dist/detectors/finance-swap-metapool-attack.js +321 -0
  323. package/dist/detectors/flashloan-price-manipulation.d.ts +7 -0
  324. package/dist/detectors/flashloan-price-manipulation.js +950 -0
  325. package/dist/detectors/flashloan-reentrancy-rari.d.ts +28 -0
  326. package/dist/detectors/flashloan-reentrancy-rari.js +577 -0
  327. package/dist/detectors/flashloan-reentrancy.d.ts +7 -0
  328. package/dist/detectors/flashloan-reentrancy.js +383 -0
  329. package/dist/detectors/flashloan-token-migrate.d.ts +7 -0
  330. package/dist/detectors/flashloan-token-migrate.js +274 -0
  331. package/dist/detectors/force-fed-eth-state-corruption.d.ts +32 -0
  332. package/dist/detectors/force-fed-eth-state-corruption.js +293 -0
  333. package/dist/detectors/free-mint-bug.d.ts +41 -0
  334. package/dist/detectors/free-mint-bug.js +483 -0
  335. package/dist/detectors/front-running-orderbook-state-update.d.ts +37 -0
  336. package/dist/detectors/front-running-orderbook-state-update.js +471 -0
  337. package/dist/detectors/front-running-shared-collateral-write.d.ts +41 -0
  338. package/dist/detectors/front-running-shared-collateral-write.js +508 -0
  339. package/dist/detectors/fusion-v1-settlement-arbitrary-yul-calld.d.ts +30 -0
  340. package/dist/detectors/fusion-v1-settlement-arbitrary-yul-calld.js +354 -0
  341. package/dist/detectors/generalized-frontrunning.d.ts +7 -0
  342. package/dist/detectors/generalized-frontrunning.js +836 -0
  343. package/dist/detectors/governance-flash-loan.d.ts +62 -0
  344. package/dist/detectors/governance-flash-loan.js +452 -0
  345. package/dist/detectors/governance-flashloan-vote.d.ts +41 -0
  346. package/dist/detectors/governance-flashloan-vote.js +272 -0
  347. package/dist/detectors/halborn-security-report-aave-v3.d.ts +6 -0
  348. package/dist/detectors/halborn-security-report-aave-v3.js +357 -0
  349. package/dist/detectors/incorrect-access-control.d.ts +26 -0
  350. package/dist/detectors/incorrect-access-control.js +328 -0
  351. package/dist/detectors/incorrect-burn-accounting.d.ts +10 -0
  352. package/dist/detectors/incorrect-burn-accounting.js +387 -0
  353. package/dist/detectors/incorrect-dividends-calculation.d.ts +27 -0
  354. package/dist/detectors/incorrect-dividends-calculation.js +524 -0
  355. package/dist/detectors/incorrect-dividends.d.ts +27 -0
  356. package/dist/detectors/incorrect-dividends.js +485 -0
  357. package/dist/detectors/incorrect-input-validation.d.ts +23 -0
  358. package/dist/detectors/incorrect-input-validation.js +312 -0
  359. package/dist/detectors/incorrect-signature-verification.d.ts +26 -0
  360. package/dist/detectors/incorrect-signature-verification.js +530 -0
  361. package/dist/detectors/infinite-loop.d.ts +7 -0
  362. package/dist/detectors/infinite-loop.js +440 -0
  363. package/dist/detectors/infinite-number-of-loans.d.ts +13 -0
  364. package/dist/detectors/infinite-number-of-loans.js +565 -0
  365. package/dist/detectors/inheritance-override.d.ts +26 -0
  366. package/dist/detectors/inheritance-override.js +320 -0
  367. package/dist/detectors/initialization-access-control.d.ts +8 -0
  368. package/dist/detectors/initialization-access-control.js +659 -0
  369. package/dist/detectors/insecure-randomness.d.ts +73 -0
  370. package/dist/detectors/insecure-randomness.js +610 -0
  371. package/dist/detectors/insufficient-access-control-trusted-param.d.ts +39 -0
  372. package/dist/detectors/insufficient-access-control-trusted-param.js +356 -0
  373. package/dist/detectors/insufficient-dvn-threshold.d.ts +32 -0
  374. package/dist/detectors/insufficient-dvn-threshold.js +585 -0
  375. package/dist/detectors/integer-overflow-detector.d.ts +45 -0
  376. package/dist/detectors/integer-overflow-detector.js +284 -0
  377. package/dist/detectors/integer-overflow.d.ts +95 -0
  378. package/dist/detectors/integer-overflow.js +344 -0
  379. package/dist/detectors/integer-underflow.d.ts +7 -0
  380. package/dist/detectors/integer-underflow.js +422 -0
  381. package/dist/detectors/intent-settlement-balance-manipulation.d.ts +22 -0
  382. package/dist/detectors/intent-settlement-balance-manipulation.js +548 -0
  383. package/dist/detectors/l1-to-l2-message-reentrancy.d.ts +7 -0
  384. package/dist/detectors/l1-to-l2-message-reentrancy.js +545 -0
  385. package/dist/detectors/l2-withdrawal-validation.d.ts +8 -0
  386. package/dist/detectors/l2-withdrawal-validation.js +303 -0
  387. package/dist/detectors/lack-of-access-control.d.ts +7 -0
  388. package/dist/detectors/lack-of-access-control.js +425 -0
  389. package/dist/detectors/lack-of-calldata-validation.d.ts +16 -0
  390. package/dist/detectors/lack-of-calldata-validation.js +914 -0
  391. package/dist/detectors/lack-of-input-validation-reentrancy.d.ts +7 -0
  392. package/dist/detectors/lack-of-input-validation-reentrancy.js +637 -0
  393. package/dist/detectors/lack-of-slippage-control.d.ts +7 -0
  394. package/dist/detectors/lack-of-slippage-control.js +513 -0
  395. package/dist/detectors/lack-of-slippage-protection.d.ts +7 -0
  396. package/dist/detectors/lack-of-slippage-protection.js +474 -0
  397. package/dist/detectors/lack-of-validation-data.d.ts +23 -0
  398. package/dist/detectors/lack-of-validation-data.js +391 -0
  399. package/dist/detectors/lack-of-validation-pool.d.ts +7 -0
  400. package/dist/detectors/lack-of-validation-pool.js +492 -0
  401. package/dist/detectors/lack-of-validation-userdata.d.ts +7 -0
  402. package/dist/detectors/lack-of-validation-userdata.js +583 -0
  403. package/dist/detectors/lack-of-validation.d.ts +27 -0
  404. package/dist/detectors/lack-of-validation.js +609 -0
  405. package/dist/detectors/layerzero-dvn-quorum-missing.d.ts +22 -0
  406. package/dist/detectors/layerzero-dvn-quorum-missing.js +464 -0
  407. package/dist/detectors/layerzero-v2-unverified-origin.d.ts +40 -0
  408. package/dist/detectors/layerzero-v2-unverified-origin.js +368 -0
  409. package/dist/detectors/liquidation-accounting-desync.d.ts +14 -0
  410. package/dist/detectors/liquidation-accounting-desync.js +145 -0
  411. package/dist/detectors/liquidation-gain-manipulation.d.ts +42 -0
  412. package/dist/detectors/liquidation-gain-manipulation.js +606 -0
  413. package/dist/detectors/liquidation-price-rounding-advantage.d.ts +26 -0
  414. package/dist/detectors/liquidation-price-rounding-advantage.js +283 -0
  415. package/dist/detectors/liquidity-poisoning.d.ts +25 -0
  416. package/dist/detectors/liquidity-poisoning.js +339 -0
  417. package/dist/detectors/loans-malicious-proposal-price-oracle.d.ts +44 -0
  418. package/dist/detectors/loans-malicious-proposal-price-oracle.js +813 -0
  419. package/dist/detectors/logic-flaw.d.ts +186 -0
  420. package/dist/detectors/logic-flaw.js +3356 -0
  421. package/dist/detectors/manipulation-of-funds.d.ts +31 -0
  422. package/dist/detectors/manipulation-of-funds.js +304 -0
  423. package/dist/detectors/merkl-unsafe-claim-callback.d.ts +22 -0
  424. package/dist/detectors/merkl-unsafe-claim-callback.js +94 -0
  425. package/dist/detectors/mev-boost-timestamp.d.ts +7 -0
  426. package/dist/detectors/mev-boost-timestamp.js +318 -0
  427. package/dist/detectors/mev-merge-exploit.d.ts +29 -0
  428. package/dist/detectors/mev-merge-exploit.js +397 -0
  429. package/dist/detectors/mev-sandwich-vulnerability.d.ts +24 -0
  430. package/dist/detectors/mev-sandwich-vulnerability.js +648 -0
  431. package/dist/detectors/mev-slot-manipulation.d.ts +36 -0
  432. package/dist/detectors/mev-slot-manipulation.js +691 -0
  433. package/dist/detectors/mevbot-insufficient-validation.d.ts +48 -0
  434. package/dist/detectors/mevbot-insufficient-validation.js +574 -0
  435. package/dist/detectors/migration-rebalance-without-bound.d.ts +7 -0
  436. package/dist/detectors/migration-rebalance-without-bound.js +514 -0
  437. package/dist/detectors/mint-hardcoded-asset-parity.d.ts +31 -0
  438. package/dist/detectors/mint-hardcoded-asset-parity.js +356 -0
  439. package/dist/detectors/miscalculation-on-spendallowance.d.ts +7 -0
  440. package/dist/detectors/miscalculation-on-spendallowance.js +188 -0
  441. package/dist/detectors/misconfiguration.d.ts +27 -0
  442. package/dist/detectors/misconfiguration.js +410 -0
  443. package/dist/detectors/missing-access-control-caller-supplied-auth.d.ts +7 -0
  444. package/dist/detectors/missing-access-control-caller-supplied-auth.js +550 -0
  445. package/dist/detectors/missing-access-control-receiver-payout.d.ts +7 -0
  446. package/dist/detectors/missing-access-control-receiver-payout.js +460 -0
  447. package/dist/detectors/missing-access-control-role-or-transferfrom.d.ts +7 -0
  448. package/dist/detectors/missing-access-control-role-or-transferfrom.js +663 -0
  449. package/dist/detectors/missing-access-control.d.ts +19 -0
  450. package/dist/detectors/missing-access-control.js +781 -0
  451. package/dist/detectors/missing-sequencer-uptime-check.d.ts +30 -0
  452. package/dist/detectors/missing-sequencer-uptime-check.js +348 -0
  453. package/dist/detectors/missing-storage-gap.d.ts +19 -0
  454. package/dist/detectors/missing-storage-gap.js +193 -0
  455. package/dist/detectors/missing-swap-deadline-slippage.d.ts +31 -0
  456. package/dist/detectors/missing-swap-deadline-slippage.js +231 -0
  457. package/dist/detectors/missing-zk-proof-verification.d.ts +60 -0
  458. package/dist/detectors/missing-zk-proof-verification.js +547 -0
  459. package/dist/detectors/my-experience-with-yearn-finance.d.ts +7 -0
  460. package/dist/detectors/my-experience-with-yearn-finance.js +552 -0
  461. package/dist/detectors/network-bridge-ronin.d.ts +7 -0
  462. package/dist/detectors/network-bridge-ronin.js +408 -0
  463. package/dist/detectors/network-bridge.d.ts +7 -0
  464. package/dist/detectors/network-bridge.js +444 -0
  465. package/dist/detectors/network-underflow.d.ts +7 -0
  466. package/dist/detectors/network-underflow.js +517 -0
  467. package/dist/detectors/nft-denial-of-service.d.ts +7 -0
  468. package/dist/detectors/nft-denial-of-service.js +223 -0
  469. package/dist/detectors/nft-marketplace-order-reentrancy.d.ts +7 -0
  470. package/dist/detectors/nft-marketplace-order-reentrancy.js +427 -0
  471. package/dist/detectors/nft-token-standard-access-control.d.ts +7 -0
  472. package/dist/detectors/nft-token-standard-access-control.js +455 -0
  473. package/dist/detectors/oracle-manipulation-amm-spot-price.d.ts +42 -0
  474. package/dist/detectors/oracle-manipulation-amm-spot-price.js +321 -0
  475. package/dist/detectors/oracle-manipulation-liquidity-withdrawal.d.ts +27 -0
  476. package/dist/detectors/oracle-manipulation-liquidity-withdrawal.js +192 -0
  477. package/dist/detectors/oracle-manipulation.d.ts +90 -0
  478. package/dist/detectors/oracle-manipulation.js +1023 -0
  479. package/dist/detectors/oracle-vortex-manipulation.d.ts +30 -0
  480. package/dist/detectors/oracle-vortex-manipulation.js +473 -0
  481. package/dist/detectors/overpriced-asset-in-oracle.d.ts +41 -0
  482. package/dist/detectors/overpriced-asset-in-oracle.js +420 -0
  483. package/dist/detectors/oz-access-control-roles.d.ts +33 -0
  484. package/dist/detectors/oz-access-control-roles.js +359 -0
  485. package/dist/detectors/pair-manipulation-transfer-hook.d.ts +38 -0
  486. package/dist/detectors/pair-manipulation-transfer-hook.js +366 -0
  487. package/dist/detectors/parameter-access-control.d.ts +47 -0
  488. package/dist/detectors/parameter-access-control.js +511 -0
  489. package/dist/detectors/parameter-manipulation.d.ts +7 -0
  490. package/dist/detectors/parameter-manipulation.js +505 -0
  491. package/dist/detectors/parity-multisig-delegatecall.d.ts +7 -0
  492. package/dist/detectors/parity-multisig-delegatecall.js +707 -0
  493. package/dist/detectors/permissionless-claim-amm-spot-pricing.d.ts +7 -0
  494. package/dist/detectors/permissionless-claim-amm-spot-pricing.js +351 -0
  495. package/dist/detectors/permit-future-dated-deadline.d.ts +31 -0
  496. package/dist/detectors/permit-future-dated-deadline.js +339 -0
  497. package/dist/detectors/phishing-attack-bybit.d.ts +37 -0
  498. package/dist/detectors/phishing-attack-bybit.js +513 -0
  499. package/dist/detectors/post-insolvency-check.d.ts +7 -0
  500. package/dist/detectors/post-insolvency-check.js +277 -0
  501. package/dist/detectors/precision-loss-vulnerability.d.ts +7 -0
  502. package/dist/detectors/precision-loss-vulnerability.js +472 -0
  503. package/dist/detectors/precision-truncation.d.ts +8 -0
  504. package/dist/detectors/precision-truncation.js +425 -0
  505. package/dist/detectors/price-dependency-veth.d.ts +41 -0
  506. package/dist/detectors/price-dependency-veth.js +588 -0
  507. package/dist/detectors/price-feed-verification.d.ts +7 -0
  508. package/dist/detectors/price-feed-verification.js +557 -0
  509. package/dist/detectors/price-manipulation-reentrancy.d.ts +32 -0
  510. package/dist/detectors/price-manipulation-reentrancy.js +445 -0
  511. package/dist/detectors/price-manipulation-via-reentranc.d.ts +7 -0
  512. package/dist/detectors/price-manipulation-via-reentranc.js +569 -0
  513. package/dist/detectors/price-oracle-manipulation.d.ts +25 -0
  514. package/dist/detectors/price-oracle-manipulation.js +530 -0
  515. package/dist/detectors/project-instant-rewards-unlocked.d.ts +6 -0
  516. package/dist/detectors/project-instant-rewards-unlocked.js +462 -0
  517. package/dist/detectors/protocol-reentrancy.d.ts +7 -0
  518. package/dist/detectors/protocol-reentrancy.js +457 -0
  519. package/dist/detectors/proxy-init-race.d.ts +11 -0
  520. package/dist/detectors/proxy-init-race.js +634 -0
  521. package/dist/detectors/proxy-storage-slot-collision.d.ts +7 -0
  522. package/dist/detectors/proxy-storage-slot-collision.js +135 -0
  523. package/dist/detectors/public-internal-function.d.ts +39 -0
  524. package/dist/detectors/public-internal-function.js +233 -0
  525. package/dist/detectors/quote-silent-zero.d.ts +25 -0
  526. package/dist/detectors/quote-silent-zero.js +156 -0
  527. package/dist/detectors/readonly-reentrancy.d.ts +9 -0
  528. package/dist/detectors/readonly-reentrancy.js +108 -0
  529. package/dist/detectors/receipt-redemption-missing-validation.d.ts +31 -0
  530. package/dist/detectors/receipt-redemption-missing-validation.js +453 -0
  531. package/dist/detectors/reentrancy-balance.d.ts +36 -0
  532. package/dist/detectors/reentrancy-balance.js +577 -0
  533. package/dist/detectors/reentrancy-business-logic-game.d.ts +36 -0
  534. package/dist/detectors/reentrancy-business-logic-game.js +616 -0
  535. package/dist/detectors/reentrancy-on-sell-nft.d.ts +23 -0
  536. package/dist/detectors/reentrancy-on-sell-nft.js +510 -0
  537. package/dist/detectors/reflection-token-balance-desync.d.ts +28 -0
  538. package/dist/detectors/reflection-token-balance-desync.js +246 -0
  539. package/dist/detectors/registry-engine.d.ts +34 -0
  540. package/dist/detectors/registry-engine.js +388 -0
  541. package/dist/detectors/rollup-unvalidated-state-update.d.ts +35 -0
  542. package/dist/detectors/rollup-unvalidated-state-update.js +286 -0
  543. package/dist/detectors/s-horizon-bridge-private-key-compromis.d.ts +8 -0
  544. package/dist/detectors/s-horizon-bridge-private-key-compromis.js +615 -0
  545. package/dist/detectors/share-price-manipulation.d.ts +7 -0
  546. package/dist/detectors/share-price-manipulation.js +653 -0
  547. package/dist/detectors/signature-replay.d.ts +30 -0
  548. package/dist/detectors/signature-replay.js +367 -0
  549. package/dist/detectors/simpleswap-unverified-approval.d.ts +27 -0
  550. package/dist/detectors/simpleswap-unverified-approval.js +198 -0
  551. package/dist/detectors/single-spot-oracle-collateral-valuation.d.ts +22 -0
  552. package/dist/detectors/single-spot-oracle-collateral-valuation.js +419 -0
  553. package/dist/detectors/skim-token-balance.d.ts +7 -0
  554. package/dist/detectors/skim-token-balance.js +788 -0
  555. package/dist/detectors/sky-oft-governance-payload.d.ts +7 -0
  556. package/dist/detectors/sky-oft-governance-payload.js +515 -0
  557. package/dist/detectors/sky-oft-governance-truncation.d.ts +32 -0
  558. package/dist/detectors/sky-oft-governance-truncation.js +377 -0
  559. package/dist/detectors/solana-evm-bridge-truncation.d.ts +7 -0
  560. package/dist/detectors/solana-evm-bridge-truncation.js +638 -0
  561. package/dist/detectors/solhint-unchecked-low-level-call.d.ts +74 -0
  562. package/dist/detectors/solhint-unchecked-low-level-call.js +463 -0
  563. package/dist/detectors/stablecoin-pair-spot-oracle.d.ts +7 -0
  564. package/dist/detectors/stablecoin-pair-spot-oracle.js +364 -0
  565. package/dist/detectors/staked-rate-as-oracle.d.ts +44 -0
  566. package/dist/detectors/staked-rate-as-oracle.js +497 -0
  567. package/dist/detectors/stale-oracle.d.ts +63 -0
  568. package/dist/detectors/stale-oracle.js +649 -0
  569. package/dist/detectors/starkware-proof-validation-gap.d.ts +18 -0
  570. package/dist/detectors/starkware-proof-validation-gap.js +629 -0
  571. package/dist/detectors/steth-transfer-reentrancy.d.ts +8 -0
  572. package/dist/detectors/steth-transfer-reentrancy.js +317 -0
  573. package/dist/detectors/storage-collision-malicious-proposal.d.ts +27 -0
  574. package/dist/detectors/storage-collision-malicious-proposal.js +386 -0
  575. package/dist/detectors/timestamp-manipulation.d.ts +49 -0
  576. package/dist/detectors/timestamp-manipulation.js +383 -0
  577. package/dist/detectors/token-access-control.d.ts +7 -0
  578. package/dist/detectors/token-access-control.js +544 -0
  579. package/dist/detectors/token-incorrect-signature-verification.d.ts +23 -0
  580. package/dist/detectors/token-incorrect-signature-verification.js +434 -0
  581. package/dist/detectors/token-transfer-logic-flaw.d.ts +33 -0
  582. package/dist/detectors/token-transfer-logic-flaw.js +267 -0
  583. package/dist/detectors/transfer-double-debit-pool-recipient.d.ts +7 -0
  584. package/dist/detectors/transfer-double-debit-pool-recipient.js +542 -0
  585. package/dist/detectors/treasury-reentrancy.d.ts +7 -0
  586. package/dist/detectors/treasury-reentrancy.js +442 -0
  587. package/dist/detectors/tstore-poison.d.ts +32 -0
  588. package/dist/detectors/tstore-poison.js +417 -0
  589. package/dist/detectors/tstore-race-condition.d.ts +7 -0
  590. package/dist/detectors/tstore-race-condition.js +632 -0
  591. package/dist/detectors/types.d.ts +85 -0
  592. package/dist/detectors/types.js +20 -0
  593. package/dist/detectors/unauthorized-payer-transferfrom.d.ts +66 -0
  594. package/dist/detectors/unauthorized-payer-transferfrom.js +339 -0
  595. package/dist/detectors/unauthorized-transferfrom-shell.d.ts +7 -0
  596. package/dist/detectors/unauthorized-transferfrom-shell.js +504 -0
  597. package/dist/detectors/unauthorized-transferfrom.d.ts +16 -0
  598. package/dist/detectors/unauthorized-transferfrom.js +838 -0
  599. package/dist/detectors/unbound-zk-verifier-input.d.ts +7 -0
  600. package/dist/detectors/unbound-zk-verifier-input.js +445 -0
  601. package/dist/detectors/unbounded-share-price-collateral-oracle.d.ts +48 -0
  602. package/dist/detectors/unbounded-share-price-collateral-oracle.js +566 -0
  603. package/dist/detectors/uncapped-reward-emission.d.ts +7 -0
  604. package/dist/detectors/uncapped-reward-emission.js +493 -0
  605. package/dist/detectors/unchecked-call-forwarding.d.ts +31 -0
  606. package/dist/detectors/unchecked-call-forwarding.js +330 -0
  607. package/dist/detectors/unchecked-external-call-unconditional-state-mutation.d.ts +18 -0
  608. package/dist/detectors/unchecked-external-call-unconditional-state-mutation.js +311 -0
  609. package/dist/detectors/unchecked-external-call.d.ts +66 -0
  610. package/dist/detectors/unchecked-external-call.js +389 -0
  611. package/dist/detectors/unchecked-oft-return.d.ts +13 -0
  612. package/dist/detectors/unchecked-oft-return.js +118 -0
  613. package/dist/detectors/unguarded-governance-execution.d.ts +35 -0
  614. package/dist/detectors/unguarded-governance-execution.js +422 -0
  615. package/dist/detectors/unguarded-governance-executor.d.ts +35 -0
  616. package/dist/detectors/unguarded-governance-executor.js +349 -0
  617. package/dist/detectors/unindexed-event-address.d.ts +7 -0
  618. package/dist/detectors/unindexed-event-address.js +268 -0
  619. package/dist/detectors/uninitialized-implementation.d.ts +27 -0
  620. package/dist/detectors/uninitialized-implementation.js +333 -0
  621. package/dist/detectors/uninitialized-storage-pointer.d.ts +7 -0
  622. package/dist/detectors/uninitialized-storage-pointer.js +110 -0
  623. package/dist/detectors/uniswap-skim-token-balance-attack.d.ts +8 -0
  624. package/dist/detectors/uniswap-skim-token-balance-attack.js +331 -0
  625. package/dist/detectors/uniswap-v4-hook-state-manipulation.d.ts +7 -0
  626. package/dist/detectors/uniswap-v4-hook-state-manipulation.js +296 -0
  627. package/dist/detectors/unprotected-admin-or-fund-sink.d.ts +7 -0
  628. package/dist/detectors/unprotected-admin-or-fund-sink.js +643 -0
  629. package/dist/detectors/unprotected-dex-swap.d.ts +43 -0
  630. package/dist/detectors/unprotected-dex-swap.js +334 -0
  631. package/dist/detectors/unprotected-initializer.d.ts +7 -0
  632. package/dist/detectors/unprotected-initializer.js +707 -0
  633. package/dist/detectors/unprotected-pair-initializer.d.ts +22 -0
  634. package/dist/detectors/unprotected-pair-initializer.js +359 -0
  635. package/dist/detectors/unprotected-upgrade-function.d.ts +7 -0
  636. package/dist/detectors/unprotected-upgrade-function.js +180 -0
  637. package/dist/detectors/unreachable-code-0.8.28.d.ts +19 -0
  638. package/dist/detectors/unreachable-code-0.8.28.js +206 -0
  639. package/dist/detectors/unsafe-proxy-storage.d.ts +7 -0
  640. package/dist/detectors/unsafe-proxy-storage.js +436 -0
  641. package/dist/detectors/unsafe-transient-storage.d.ts +7 -0
  642. package/dist/detectors/unsafe-transient-storage.js +1052 -0
  643. package/dist/detectors/unsafe-tx-origin.d.ts +9 -0
  644. package/dist/detectors/unsafe-tx-origin.js +179 -0
  645. package/dist/detectors/unsigned-validity-window.d.ts +20 -0
  646. package/dist/detectors/unsigned-validity-window.js +220 -0
  647. package/dist/detectors/unvalidated-interface-address.d.ts +25 -0
  648. package/dist/detectors/unvalidated-interface-address.js +377 -0
  649. package/dist/detectors/uups-uninitialized-storage.d.ts +9 -0
  650. package/dist/detectors/uups-uninitialized-storage.js +366 -0
  651. package/dist/detectors/v2-error-k-value-attack.d.ts +33 -0
  652. package/dist/detectors/v2-error-k-value-attack.js +276 -0
  653. package/dist/detectors/v2-k-invariant-bypass.d.ts +33 -0
  654. package/dist/detectors/v2-k-invariant-bypass.js +283 -0
  655. package/dist/detectors/v4-hook-reentrancy.d.ts +9 -0
  656. package/dist/detectors/v4-hook-reentrancy.js +488 -0
  657. package/dist/detectors/vault-inflation-rounding.d.ts +23 -0
  658. package/dist/detectors/vault-inflation-rounding.js +477 -0
  659. package/dist/detectors/vault-share-price-manipulation.d.ts +7 -0
  660. package/dist/detectors/vault-share-price-manipulation.js +332 -0
  661. package/dist/detectors/vortex-interaction-guard.d.ts +45 -0
  662. package/dist/detectors/vortex-interaction-guard.js +275 -0
  663. package/dist/detectors/vortex-protocol-reentrancy-guard.d.ts +27 -0
  664. package/dist/detectors/vortex-protocol-reentrancy-guard.js +408 -0
  665. package/dist/detectors/vulnerable-price-dependency.d.ts +41 -0
  666. package/dist/detectors/vulnerable-price-dependency.js +473 -0
  667. package/dist/detectors/weak-random-mint.d.ts +37 -0
  668. package/dist/detectors/weak-random-mint.js +271 -0
  669. package/dist/detectors/withdraw-be-to-withdraw.d.ts +26 -0
  670. package/dist/detectors/withdraw-be-to-withdraw.js +329 -0
  671. package/dist/detectors/wrong-function-visibility.d.ts +29 -0
  672. package/dist/detectors/wrong-function-visibility.js +147 -0
  673. package/dist/detectors/wrong-price-calculation.d.ts +42 -0
  674. package/dist/detectors/wrong-price-calculation.js +387 -0
  675. package/dist/detectors/yearn-vault-v2-share-price-manipulation.d.ts +32 -0
  676. package/dist/detectors/yearn-vault-v2-share-price-manipulation.js +248 -0
  677. package/dist/detectors/zero-fee.d.ts +7 -0
  678. package/dist/detectors/zero-fee.js +596 -0
  679. package/dist/detectors/zetachain-gateway-hack-analysis.d.ts +7 -0
  680. package/dist/detectors/zetachain-gateway-hack-analysis.js +629 -0
  681. package/dist/detectors/zk-rollup-da-gap.d.ts +8 -0
  682. package/dist/detectors/zk-rollup-da-gap.js +322 -0
  683. package/dist/detectors/zksync-batch-validation.d.ts +8 -0
  684. package/dist/detectors/zksync-batch-validation.js +461 -0
  685. package/dist/detectors/zksync-era-rollup-state-update.d.ts +60 -0
  686. package/dist/detectors/zksync-era-rollup-state-update.js +360 -0
  687. package/dist/detectors/zksync-simulation-drift.d.ts +35 -0
  688. package/dist/detectors/zksync-simulation-drift.js +309 -0
  689. package/dist/exit-codes.d.ts +15 -0
  690. package/dist/exit-codes.js +18 -0
  691. package/dist/formatters/github-actions.d.ts +2 -0
  692. package/dist/formatters/github-actions.js +61 -0
  693. package/dist/formatters/sarif.d.ts +24 -0
  694. package/dist/formatters/sarif.js +670 -0
  695. package/dist/formatters/text.d.ts +14 -0
  696. package/dist/formatters/text.js +152 -0
  697. package/dist/fp-rates.json +70 -0
  698. package/dist/identity/diff-baseline.d.ts +16 -0
  699. package/dist/identity/diff-baseline.js +152 -0
  700. package/dist/identity/hashing.d.ts +39 -0
  701. package/dist/identity/hashing.js +96 -0
  702. package/dist/index.d.ts +174 -0
  703. package/dist/index.js +358 -0
  704. package/dist/parallel-scan.d.ts +66 -0
  705. package/dist/parallel-scan.js +227 -0
  706. package/dist/registry.d.ts +17 -0
  707. package/dist/registry.js +118 -0
  708. package/dist/rules/glob.d.ts +5 -0
  709. package/dist/rules/glob.js +76 -0
  710. package/dist/rules/suppressions.d.ts +23 -0
  711. package/dist/rules/suppressions.js +136 -0
  712. package/dist/rules/tiers.d.ts +23 -0
  713. package/dist/rules/tiers.js +341 -0
  714. package/dist/scan-worker.d.ts +1 -0
  715. package/dist/scan-worker.js +61 -0
  716. package/dist/scan.d.ts +24 -0
  717. package/dist/scan.js +558 -0
  718. package/dist/semantic/contracts.d.ts +10 -0
  719. package/dist/semantic/contracts.js +141 -0
  720. package/dist/semantic/diagnostics.d.ts +29 -0
  721. package/dist/semantic/diagnostics.js +25 -0
  722. package/dist/semantic/eog.d.ts +56 -0
  723. package/dist/semantic/eog.js +545 -0
  724. package/dist/semantic/imports.d.ts +88 -0
  725. package/dist/semantic/imports.js +246 -0
  726. package/dist/semantic/index.d.ts +2 -0
  727. package/dist/semantic/index.js +8 -0
  728. package/dist/semantic/inheritance.d.ts +33 -0
  729. package/dist/semantic/inheritance.js +137 -0
  730. package/dist/semantic/model.d.ts +95 -0
  731. package/dist/semantic/model.js +232 -0
  732. package/dist/semantic/taint-tracker.d.ts +49 -0
  733. package/dist/semantic/taint-tracker.js +410 -0
  734. package/dist/semantic/types.d.ts +119 -0
  735. package/dist/semantic/types.js +18 -0
  736. package/dist/severity.d.ts +10 -0
  737. package/dist/severity.js +78 -0
  738. package/package.json +52 -0
@@ -0,0 +1,645 @@
1
+ "use strict";
2
+ /**
3
+ * Classic intra-function reentrancy detector. Extracted from
4
+ * `src/index.ts` per roadmap item 1.1 (split god-file into focused
5
+ * modules). Public API surface is unchanged — `src/index.ts`
6
+ * re-exports `ReentrancyDetector` so downstream consumers
7
+ * (`createDefaultDetectorRegistry`, third-party imports) continue to
8
+ * see it at the same path.
9
+ *
10
+ * The detector class flags an external call (call/delegatecall/
11
+ * staticcall/send/transfer) followed by a state-modifying operation
12
+ * in the same function — the canonical CEI violation. See
13
+ * `docs/detectors/check-effects-interactions.md` for the user-facing
14
+ * description.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ReentrancyDetector = void 0;
18
+ const ast_1 = require("./_common/ast");
19
+ /**
20
+ * Detects classic reentrancy vulnerabilities:
21
+ * 1. An external call (call/delegatecall/staticcall/send/transfer)
22
+ * 2. Followed by a state-modifying operation in the same function
23
+ *
24
+ * This violates Checks-Effects-Interactions (CEI). To reduce false
25
+ * positives we only flag when state modification *follows* a detected
26
+ * external call — not when state is modified before the call (which is
27
+ * the safe CEI pattern).
28
+ */
29
+ class ReentrancyDetector {
30
+ id = 'classic-reentrancy';
31
+ patternKey = 'classic-reentrancy';
32
+ supportedAstKinds = ['parser', 'solc'];
33
+ findings = [];
34
+ currentFile = '';
35
+ // Per-function state
36
+ currentContract = '';
37
+ currentContractNode = null;
38
+ currentFunction = '';
39
+ skipCurrentFunction = false;
40
+ stateVariablesByContract = new Map();
41
+ localVariables = new Set();
42
+ externalCalls = [];
43
+ // Tracks how many enclosing try/catch bodies the walker is currently inside.
44
+ // ExpressionStatement suppresses its own finding emission while > 0 because
45
+ // the TryStatement handler already scans bodies for the first state write
46
+ // and emits one finding per try site; without this guard a second try in
47
+ // the same function would see the first try's call expression in
48
+ // externalCalls and double-report the second try's in-body mutation.
49
+ inTryBodyDepth = 0;
50
+ semantic = undefined;
51
+ setFile(file) {
52
+ this.currentFile = file;
53
+ this.findings = [];
54
+ this.currentContract = '';
55
+ this.currentContractNode = null;
56
+ this.currentFunction = '';
57
+ this.skipCurrentFunction = false;
58
+ this.stateVariablesByContract.clear();
59
+ this.localVariables.clear();
60
+ this.externalCalls = [];
61
+ this.inTryBodyDepth = 0;
62
+ }
63
+ setSemanticModel(model) {
64
+ // SemanticModel adoption (roadmap 3.3 / Slice 3). The model lets
65
+ // this detector see inherited CEI-violating functions across files.
66
+ // When undefined the detector behaves exactly as before — the
67
+ // inherited-walk in ContractDefinition:exit is skipped.
68
+ this.semantic = model;
69
+ }
70
+ getFindings() {
71
+ return this.findings;
72
+ }
73
+ ContractDefinition(node) {
74
+ this.currentContract = node.name || '<anonymous>';
75
+ this.currentContractNode = node;
76
+ if (!this.stateVariablesByContract.has(this.currentContract)) {
77
+ this.stateVariablesByContract.set(this.currentContract, new Set());
78
+ }
79
+ }
80
+ ContractDefinition_post(node) {
81
+ // After visiting locally-declared FunctionDefinitions, also scan the
82
+ // contract's MRO for inherited externally-callable functions with
83
+ // the same CEI-violating shape. Findings anchor at the current
84
+ // contract's def line so the operator can locate the surface in the
85
+ // file under scan. Pattern matches access-control.ts (Slice 2b).
86
+ this.walkInheritedFunctions(node);
87
+ this.currentContract = '';
88
+ this.currentContractNode = null;
89
+ }
90
+ walkInheritedFunctions(contractNode) {
91
+ if (!this.semantic)
92
+ return;
93
+ if (!contractNode)
94
+ return;
95
+ const myId = `${this.currentFile}::${this.currentContract}`;
96
+ const myInfo = this.semantic.contracts.get(myId);
97
+ if (!myInfo || myInfo.bases.length === 0)
98
+ return;
99
+ // Functions declared locally on this contract are handled by the
100
+ // regular visitor walk; skip them so an override doesn't double-emit.
101
+ const localFnNames = new Set();
102
+ const members = Array.isArray(contractNode?.subNodes) ? contractNode.subNodes
103
+ : Array.isArray(contractNode?.nodes) ? contractNode.nodes
104
+ : [];
105
+ for (const m of members) {
106
+ if (m?.type === 'FunctionDefinition' && typeof m?.name === 'string') {
107
+ localFnNames.add(m.name);
108
+ }
109
+ }
110
+ const derivedContract = this.currentContract;
111
+ const anchorLoc = contractNode?.loc?.start;
112
+ const anchorLine = anchorLoc?.line || 1;
113
+ const anchorCol = anchorLoc?.column || 0;
114
+ for (const inheritedFn of this.semantic.inheritedFunctions(myId)) {
115
+ if (inheritedFn.contractId === myId)
116
+ continue;
117
+ if (!inheritedFn.name)
118
+ continue;
119
+ if (localFnNames.has(inheritedFn.name))
120
+ continue;
121
+ const fnNode = inheritedFn.node;
122
+ if (!fnNode)
123
+ continue;
124
+ if (!this.isExternallyCallableForInherited(fnNode))
125
+ continue;
126
+ const body = fnNode.body;
127
+ if (!body || !Array.isArray(body.statements))
128
+ continue;
129
+ const declarer = this.semantic.contracts.get(inheritedFn.contractId);
130
+ if (!declarer || !declarer.node)
131
+ continue;
132
+ const declarerName = declarer.name || '<unknown>';
133
+ // Populate state vars for the declarer if not already known (the
134
+ // declarer may not have been walked by the regular visitor when
135
+ // its source unit isn't part of this scan).
136
+ if (!this.stateVariablesByContract.has(declarerName)) {
137
+ const declarerVars = new Set();
138
+ const declarerMembers = Array.isArray(declarer.node?.subNodes) ? declarer.node.subNodes
139
+ : Array.isArray(declarer.node?.nodes) ? declarer.node.nodes
140
+ : [];
141
+ for (const m of declarerMembers) {
142
+ if (m?.type === 'StateVariableDeclaration') {
143
+ for (const v of m.variables || []) {
144
+ if (v?.name)
145
+ declarerVars.add(v.name);
146
+ }
147
+ }
148
+ }
149
+ this.stateVariablesByContract.set(declarerName, declarerVars);
150
+ }
151
+ // Swap instance state so the existing per-statement handlers
152
+ // (ExpressionStatement, VariableDeclarationStatement, etc.) treat
153
+ // the inherited body as if it were the current scope. Restored on
154
+ // every loop iteration regardless of whether a finding fired.
155
+ const savedContract = this.currentContract;
156
+ const savedFunction = this.currentFunction;
157
+ const savedSkip = this.skipCurrentFunction;
158
+ const savedLocalVars = this.localVariables;
159
+ const savedExternalCalls = this.externalCalls;
160
+ const savedTryDepth = this.inTryBodyDepth;
161
+ const findingsBefore = this.findings.length;
162
+ this.currentContract = declarerName;
163
+ this.currentFunction = inheritedFn.name;
164
+ this.skipCurrentFunction = this.hasReentrancyGuardModifier(fnNode);
165
+ this.localVariables = new Set();
166
+ this.externalCalls = [];
167
+ this.inTryBodyDepth = 0;
168
+ for (const p of fnNode.parameters || []) {
169
+ if (p?.name)
170
+ this.localVariables.add(p.name);
171
+ }
172
+ for (const p of fnNode.returnParameters || []) {
173
+ if (p?.name)
174
+ this.localVariables.add(p.name);
175
+ }
176
+ try {
177
+ if (!this.skipCurrentFunction) {
178
+ this.dispatchStatementForInherited(body);
179
+ }
180
+ }
181
+ finally {
182
+ this.currentContract = savedContract;
183
+ this.currentFunction = savedFunction;
184
+ this.skipCurrentFunction = savedSkip;
185
+ this.localVariables = savedLocalVars;
186
+ this.externalCalls = savedExternalCalls;
187
+ this.inTryBodyDepth = savedTryDepth;
188
+ }
189
+ // Patch any findings emitted during the inherited walk to anchor
190
+ // at the derived contract and carry an instance_key discriminator
191
+ // (so multiple inherited findings on the same derived contract
192
+ // don't collide in computeFindingId — same pattern as Slice 2a/2b).
193
+ for (let i = findingsBefore; i < this.findings.length; i++) {
194
+ const f = this.findings[i];
195
+ f.line = anchorLine;
196
+ f.endLine = anchorLine;
197
+ f.column = anchorCol;
198
+ f.contract = derivedContract;
199
+ f.contractName = derivedContract;
200
+ f.sourceLocation = { line: anchorLine, column: anchorCol };
201
+ f.instance_key = `${derivedContract}::${inheritedFn.name}`;
202
+ f.message =
203
+ `Potential reentrancy: inherited function '${inheritedFn.name}' from ${declarerName} ` +
204
+ `performs an external call followed by a state modification (CEI violation reachable ` +
205
+ `through ${derivedContract}).`;
206
+ }
207
+ }
208
+ }
209
+ // Visitor-style external-callability check (subset of the helper used
210
+ // in src/detectors/access-control.ts — kept self-contained here to
211
+ // avoid cross-detector coupling). Returns true for public/external
212
+ // visibility; treats fallback/receive as externally callable too.
213
+ isExternallyCallableForInherited(fnNode) {
214
+ if (!fnNode)
215
+ return false;
216
+ if (fnNode.isConstructor === true)
217
+ return false;
218
+ const kind = String(fnNode.kind || '').toLowerCase();
219
+ if (kind === 'constructor')
220
+ return false;
221
+ const visibility = String(fnNode.visibility || '').toLowerCase();
222
+ if (visibility === 'public' || visibility === 'external')
223
+ return true;
224
+ if (kind === 'fallback' || kind === 'receive')
225
+ return true;
226
+ if (fnNode.isFallback === true || fnNode.isReceiveEther === true)
227
+ return true;
228
+ return false;
229
+ }
230
+ // Dispatch a single statement node into the appropriate per-type
231
+ // handler so the inherited body produces the same per-statement
232
+ // observations (external-call recording, state-write detection) as
233
+ // the normal visitor walk would. We only route the statement types
234
+ // the detector actually observes; everything else is a no-op.
235
+ dispatchStatementForInherited(stmt) {
236
+ if (!stmt || typeof stmt !== 'object')
237
+ return;
238
+ switch (stmt.type) {
239
+ case 'Block':
240
+ for (const child of stmt.statements || [])
241
+ this.dispatchStatementForInherited(child);
242
+ return;
243
+ case 'VariableDeclarationStatement':
244
+ this.VariableDeclarationStatement(stmt);
245
+ return;
246
+ case 'ExpressionStatement':
247
+ this.ExpressionStatement(stmt);
248
+ return;
249
+ case 'IfStatement':
250
+ this.dispatchStatementForInherited(stmt.trueBody);
251
+ this.dispatchStatementForInherited(stmt.falseBody);
252
+ return;
253
+ case 'ForStatement':
254
+ case 'WhileStatement':
255
+ case 'DoWhileStatement':
256
+ this.dispatchStatementForInherited(stmt.body);
257
+ return;
258
+ case 'UncheckedStatement':
259
+ this.dispatchStatementForInherited(stmt.body || stmt.block);
260
+ return;
261
+ case 'TryStatement':
262
+ this.TryStatement(stmt);
263
+ this.dispatchStatementForInherited(stmt.body);
264
+ for (const c of stmt.catchClauses || []) {
265
+ if (c?.body)
266
+ this.dispatchStatementForInherited(c.body);
267
+ }
268
+ this.TryStatement_post(stmt);
269
+ return;
270
+ default:
271
+ return;
272
+ }
273
+ }
274
+ StateVariableDeclaration(node) {
275
+ const stateVariables = this.getCurrentStateVariables();
276
+ for (const variable of node.variables || []) {
277
+ if (variable.name) {
278
+ stateVariables.add(variable.name);
279
+ }
280
+ }
281
+ }
282
+ FunctionDefinition(node) {
283
+ this.currentFunction = node.name || '<anonymous>';
284
+ this.skipCurrentFunction = this.hasReentrancyGuardModifier(node);
285
+ this.localVariables = new Set();
286
+ this.externalCalls = [];
287
+ this.inTryBodyDepth = 0;
288
+ for (const parameter of node.parameters || []) {
289
+ if (parameter.name) {
290
+ this.localVariables.add(parameter.name);
291
+ }
292
+ }
293
+ for (const parameter of node.returnParameters || []) {
294
+ if (parameter.name) {
295
+ this.localVariables.add(parameter.name);
296
+ }
297
+ }
298
+ }
299
+ FunctionDefinition_post(_node) {
300
+ this.currentFunction = '';
301
+ this.skipCurrentFunction = false;
302
+ this.localVariables.clear();
303
+ this.externalCalls = [];
304
+ this.inTryBodyDepth = 0;
305
+ }
306
+ /**
307
+ * Catch variable declarations where the initializer is an external call.
308
+ * E.g. (bool success, ) = msg.sender.call{value: amount}("");
309
+ */
310
+ VariableDeclarationStatement(node) {
311
+ for (const variable of node.variables || []) {
312
+ if (variable?.name) {
313
+ this.localVariables.add(variable.name);
314
+ }
315
+ }
316
+ if (!this.currentFunction || this.skipCurrentFunction)
317
+ return;
318
+ if (!node.initialValue)
319
+ return;
320
+ if (this.isExternalCall(node.initialValue)) {
321
+ this.externalCalls.push(node.initialValue);
322
+ }
323
+ }
324
+ /**
325
+ * Catch expression statements that are direct external calls.
326
+ * E.g. msg.sender.call{value: amount}(""); (without tuple assignment)
327
+ */
328
+ ExpressionStatement(node) {
329
+ if (!this.currentFunction || this.skipCurrentFunction)
330
+ return;
331
+ if (!node.expression)
332
+ return;
333
+ // tryLoc-with-floor: solc-walker may yield loc=0 on inner expressions.
334
+ const loc = (0, ast_1.tryLoc)(node) ?? { line: 0, endLine: 0, column: 0 };
335
+ const { line, endLine, column } = loc;
336
+ const externalCall = this.findExternalCall(node.expression);
337
+ // Check for state-modifying operations after an external call. Skip when
338
+ // the walker is currently inside a try/catch body — TryStatement scans
339
+ // those bodies itself and emits a single finding per try site, so we'd
340
+ // otherwise double-report (once from TryStatement, once here using a
341
+ // prior call from the enclosing scope).
342
+ if (this.inTryBodyDepth === 0 && this.externalCalls.length > 0) {
343
+ if (this.isStateModification(node.expression)) {
344
+ const externalCallNode = this.externalCalls[0];
345
+ this.findings.push({
346
+ file: this.currentFile,
347
+ contract: this.currentContract,
348
+ 'function': this.currentFunction,
349
+ line: line,
350
+ endLine,
351
+ column,
352
+ pattern: 'classic-reentrancy',
353
+ confidence: 'high',
354
+ ruleId: 'classic-reentrancy',
355
+ severity: 'error',
356
+ message: `Potential reentrancy: state modification after external call in function '${this.currentFunction}'`,
357
+ contractName: this.currentContract,
358
+ functionName: this.currentFunction,
359
+ sourceLocation: {
360
+ line,
361
+ column
362
+ },
363
+ externalCallNode,
364
+ stateMutationNode: node.expression,
365
+ findingId: '',
366
+ contractHash: ''
367
+ });
368
+ }
369
+ }
370
+ if (externalCall) {
371
+ this.externalCalls.push(externalCall);
372
+ }
373
+ }
374
+ /**
375
+ * Solidity `try X.f(...) { ... } catch { ... }` always wraps an external call
376
+ * (or contract creation), so the try expression is itself the call site for
377
+ * classic-reentrancy purposes regardless of whether it parses as a low-level
378
+ * `.call(...)`. We scan success and catch bodies for the first state write
379
+ * and emit a single finding per try statement to avoid duplicating findings
380
+ * across paths that share the same underlying call. The try expression is
381
+ * also recorded as an external call in `TryStatement_post` so that a state
382
+ * write in the enclosing function *after* the try/catch is flagged via the
383
+ * normal post-call traversal — covering the `try f() { } catch { } x -= 1;`
384
+ * pattern that has empty (or emit-only) bodies but a real post-call write.
385
+ */
386
+ TryStatement(node) {
387
+ if (!this.currentFunction || this.skipCurrentFunction)
388
+ return;
389
+ if (!node.expression)
390
+ return;
391
+ for (const parameter of node.returnParameters || []) {
392
+ if (parameter?.name)
393
+ this.localVariables.add(parameter.name);
394
+ }
395
+ for (const clause of node.catchClauses || []) {
396
+ for (const parameter of clause?.parameters || []) {
397
+ if (parameter?.name)
398
+ this.localVariables.add(parameter.name);
399
+ }
400
+ }
401
+ // Suppress in-body ExpressionStatement emissions while we descend — see
402
+ // `inTryBodyDepth` field comment for the rationale.
403
+ this.inTryBodyDepth++;
404
+ const bodies = [];
405
+ if (node.body)
406
+ bodies.push(node.body);
407
+ for (const clause of node.catchClauses || []) {
408
+ if (clause?.body)
409
+ bodies.push(clause.body);
410
+ }
411
+ let mutation = null;
412
+ let mutationStatement = null;
413
+ for (const body of bodies) {
414
+ const found = this.findFirstStateMutationStatement(body);
415
+ if (found) {
416
+ mutation = found.expression;
417
+ mutationStatement = found.statement;
418
+ break;
419
+ }
420
+ }
421
+ if (!mutation || !mutationStatement)
422
+ return;
423
+ const callExpr = node.expression;
424
+ // tryLoc-with-floor + two-arg fallback: mutationStatement primary,
425
+ // node (the TryStatement) as fallback when the mutation is
426
+ // synthesised.
427
+ const loc = (0, ast_1.tryLoc)(mutationStatement, node) ?? { line: 0, endLine: 0, column: 0 };
428
+ const { line, endLine, column } = loc;
429
+ this.findings.push({
430
+ file: this.currentFile,
431
+ contract: this.currentContract,
432
+ 'function': this.currentFunction,
433
+ line,
434
+ endLine,
435
+ column,
436
+ pattern: 'classic-reentrancy',
437
+ confidence: 'high',
438
+ ruleId: 'classic-reentrancy',
439
+ severity: 'error',
440
+ message: `Potential reentrancy: state modification after external call in function '${this.currentFunction}'`,
441
+ contractName: this.currentContract,
442
+ functionName: this.currentFunction,
443
+ sourceLocation: { line, column },
444
+ externalCallNode: callExpr,
445
+ stateMutationNode: mutation,
446
+ findingId: '',
447
+ contractHash: ''
448
+ });
449
+ }
450
+ TryStatement_post(node) {
451
+ if (!this.currentFunction || this.skipCurrentFunction)
452
+ return;
453
+ if (!node.expression)
454
+ return;
455
+ if (this.inTryBodyDepth > 0)
456
+ this.inTryBodyDepth--;
457
+ // Record the try expression as an external call so the existing
458
+ // post-call traversal flags any state write that follows the try/catch
459
+ // in the enclosing function body.
460
+ this.externalCalls.push(node.expression);
461
+ }
462
+ findFirstStateMutationStatement(stmt) {
463
+ if (!stmt || typeof stmt !== 'object')
464
+ return null;
465
+ switch (stmt.type) {
466
+ case 'Block':
467
+ for (const child of stmt.statements || []) {
468
+ const found = this.findFirstStateMutationStatement(child);
469
+ if (found)
470
+ return found;
471
+ }
472
+ return null;
473
+ case 'ExpressionStatement':
474
+ if (stmt.expression && this.isStateModification(stmt.expression)) {
475
+ return { statement: stmt, expression: stmt.expression };
476
+ }
477
+ return null;
478
+ case 'IfStatement': {
479
+ const t = this.findFirstStateMutationStatement(stmt.trueBody);
480
+ if (t)
481
+ return t;
482
+ return this.findFirstStateMutationStatement(stmt.falseBody);
483
+ }
484
+ case 'ForStatement':
485
+ case 'WhileStatement':
486
+ case 'DoWhileStatement':
487
+ return this.findFirstStateMutationStatement(stmt.body);
488
+ case 'UncheckedStatement':
489
+ return this.findFirstStateMutationStatement(stmt.body);
490
+ case 'TryStatement':
491
+ return null;
492
+ default:
493
+ return null;
494
+ }
495
+ }
496
+ /**
497
+ * Check if an expression is an external call (call/delegatecall/staticcall/send/transfer)
498
+ */
499
+ isExternalCall(expr) {
500
+ if (!expr)
501
+ return false;
502
+ // Walk through FunctionCall -> NameValueExpression -> MemberAccess chain
503
+ let current = expr;
504
+ // Unwrap FunctionCall
505
+ if (current.type === 'FunctionCall') {
506
+ current = current.expression;
507
+ }
508
+ // Unwrap NameValueExpression (msg.sender.call{value: X}(""))
509
+ if (current?.type === 'NameValueExpression') {
510
+ current = current.expression;
511
+ }
512
+ // Check for MemberAccess with call/delegatecall/staticcall/send/transfer
513
+ if (current?.type === 'MemberAccess') {
514
+ const member = current.memberName?.toLowerCase();
515
+ return member === 'call' || member === 'delegatecall' || member === 'staticcall' || member === 'send' || member === 'transfer';
516
+ }
517
+ return false;
518
+ }
519
+ findExternalCall(expr) {
520
+ if (!expr || typeof expr !== 'object')
521
+ return null;
522
+ if (this.isExternalCall(expr))
523
+ return expr;
524
+ for (const key of [
525
+ 'expression',
526
+ 'left',
527
+ 'right',
528
+ 'subExpression',
529
+ 'base',
530
+ 'index',
531
+ 'initialValue',
532
+ 'arguments',
533
+ 'components'
534
+ ]) {
535
+ const value = expr[key];
536
+ if (Array.isArray(value)) {
537
+ for (const item of value) {
538
+ const found = this.findExternalCall(item);
539
+ if (found)
540
+ return found;
541
+ }
542
+ }
543
+ else {
544
+ const found = this.findExternalCall(value);
545
+ if (found)
546
+ return found;
547
+ }
548
+ }
549
+ return null;
550
+ }
551
+ /**
552
+ * Check if an expression modifies contract state.
553
+ * Heuristic: assignment operators only count when their left side resolves
554
+ * to a known state variable in the current contract.
555
+ */
556
+ isStateModification(expr) {
557
+ if (!expr)
558
+ return false;
559
+ // Binary operations with assignment operators like +=, -=, =, etc.
560
+ if (expr.type === 'BinaryOperation') {
561
+ const ops = ['=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=', '>>=', '>>>='];
562
+ if (ops.includes(expr.operator)) {
563
+ return this.isStateReference(expr.left);
564
+ }
565
+ }
566
+ if (expr.type === 'UnaryOperation') {
567
+ const ops = ['++', '--'];
568
+ if (ops.includes(expr.operator)) {
569
+ return this.isStateReference(expr.subExpression);
570
+ }
571
+ }
572
+ // Function calls that mutate state (e.g., _update, _mint, _transfer)
573
+ // These are common in ERC20/ERC721 and often state-modifying
574
+ if (expr.type === 'FunctionCall') {
575
+ const name = expr.expression?.name || '';
576
+ if (name === 'selfdestruct' || name === 'suicide') {
577
+ return true;
578
+ }
579
+ if (name.startsWith('_') || name === '_mint' || name === '_burn' || name === '_transfer' || name === '_update') {
580
+ return true;
581
+ }
582
+ }
583
+ return false;
584
+ }
585
+ getCurrentStateVariables() {
586
+ if (!this.stateVariablesByContract.has(this.currentContract)) {
587
+ this.stateVariablesByContract.set(this.currentContract, new Set());
588
+ }
589
+ return this.stateVariablesByContract.get(this.currentContract);
590
+ }
591
+ hasReentrancyGuardModifier(node) {
592
+ for (const modifier of node.modifiers || []) {
593
+ const name = this.getNodeName(modifier).toLowerCase();
594
+ if (name === 'nonreentrant' || name.includes('reentrancyguard')) {
595
+ return true;
596
+ }
597
+ }
598
+ return false;
599
+ }
600
+ getNodeName(node) {
601
+ if (!node)
602
+ return '';
603
+ if (typeof node === 'string')
604
+ return node;
605
+ if (node.name)
606
+ return this.getNodeName(node.name);
607
+ if (node.type === 'Identifier')
608
+ return node.name || '';
609
+ if (node.type === 'ModifierInvocation')
610
+ return this.getNodeName(node.name);
611
+ if (node.type === 'MemberAccess')
612
+ return node.memberName || '';
613
+ return '';
614
+ }
615
+ isStateReference(expr) {
616
+ if (!expr)
617
+ return false;
618
+ if (expr.type === 'Identifier') {
619
+ const stateVariables = this.getCurrentStateVariables();
620
+ return stateVariables.has(expr.name) && !this.localVariables.has(expr.name);
621
+ }
622
+ if (expr.type === 'IndexAccess') {
623
+ return this.isStateReference(expr.base);
624
+ }
625
+ if (expr.type === 'MemberAccess') {
626
+ return this.isStateReference(expr.expression);
627
+ }
628
+ return false;
629
+ }
630
+ }
631
+ exports.ReentrancyDetector = ReentrancyDetector;
632
+ // Alias `_post` handlers to `:exit` so that `parser.visit` (which fires
633
+ // `<Type>:exit`) and the solc-walker (which fires `<Type>_post`) both reach
634
+ // the same hook. The detector's `TryStatement_post` registers the try
635
+ // expression as an external call once body traversal has completed; without
636
+ // the parser-side alias, post-try state writes would only be flagged on the
637
+ // solc-AST path.
638
+ const _reentrancyProto = ReentrancyDetector.prototype;
639
+ _reentrancyProto['TryStatement:exit'] = _reentrancyProto.TryStatement_post;
640
+ // Slice 3 (roadmap 3.3): walkInheritedFunctions runs in
641
+ // ContractDefinition_post; parser.visit fires <Type>:exit not <Type>_post,
642
+ // so route both events to the same handler. Same alias pattern as
643
+ // access-control.ts (Slice 2b).
644
+ _reentrancyProto['ContractDefinition:exit'] = _reentrancyProto.ContractDefinition_post;
645
+ //# sourceMappingURL=classic-reentrancy.js.map
@@ -0,0 +1,29 @@
1
+ import type { ScanResult } from '../index';
2
+ export declare class CoinbaseMorphoWethLoanPolicyDetector {
3
+ readonly id = "coinbase-morpho-wethloan-policy";
4
+ readonly patternKey = "coinbase-morpho-wethloan-policy";
5
+ readonly supportedAstKinds: "parser"[];
6
+ private currentFile;
7
+ private contracts;
8
+ private findings;
9
+ setFile(file: string): void;
10
+ getFindings(): ScanResult[];
11
+ SourceUnit(node: any): void;
12
+ private analyzeContracts;
13
+ private findPolicyVariantPairs;
14
+ private checkDuplicateInstallation;
15
+ private findInstallFunction;
16
+ private extractUniquenessGuard;
17
+ private extractGuardFromNegation;
18
+ private indexAccessBaseVar;
19
+ private indexAccessKey;
20
+ private keySignature;
21
+ private getCalleeName;
22
+ private resolveFunctionDefinition;
23
+ private functionContainsMappedUniquenessPattern;
24
+ private rejectsWethCollateral;
25
+ private isWethRejection;
26
+ private isCollateralTerm;
27
+ private isWethTerm;
28
+ private makeFinding;
29
+ }