@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
package/dist/cli.js ADDED
@@ -0,0 +1,755 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.parseCiSeverityThreshold = parseCiSeverityThreshold;
38
+ exports.getExitCode = getExitCode;
39
+ exports.resolveScanFiles = resolveScanFiles;
40
+ exports.runScanCommand = runScanCommand;
41
+ exports.runScanCommandParallel = runScanCommandParallel;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const commander_1 = require("commander");
45
+ let fpRatesData = {};
46
+ try {
47
+ fpRatesData = require('./fp-rates.json');
48
+ }
49
+ catch (e) {
50
+ // Missing FP-rate entry for a rule defaults to native severity without crash
51
+ }
52
+ // Single source of truth for the version: read it from package.json at runtime
53
+ // (dist/cli.js -> ../package.json) so `solast --version` can never drift from
54
+ // the published package. The literal is only a fallback if resolution fails.
55
+ let pkgVersion = '0.1.0';
56
+ try {
57
+ pkgVersion = require('../package.json').version || pkgVersion;
58
+ }
59
+ catch (e) {
60
+ // keep the fallback literal above
61
+ }
62
+ const index_1 = require("./index");
63
+ const parallel_scan_1 = require("./parallel-scan");
64
+ const files_1 = require("./dedup/files");
65
+ const registry_1 = require("./registry");
66
+ const sarif_1 = require("./formatters/sarif");
67
+ const text_1 = require("./formatters/text");
68
+ const github_actions_1 = require("./formatters/github-actions");
69
+ const config_1 = require("./config");
70
+ const exit_codes_1 = require("./exit-codes");
71
+ const glob_1 = require("./rules/glob");
72
+ const severity_1 = require("./severity");
73
+ const diff_baseline_1 = require("./identity/diff-baseline");
74
+ function buildScanOptions(options) {
75
+ const rules = [...(options.rule || [])];
76
+ const enabledRules = [...(options.enable || [])];
77
+ const ignorePatterns = [...(options.ignorePattern || [])];
78
+ const scanOptions = {};
79
+ if (rules.length > 0)
80
+ scanOptions.rules = rules;
81
+ if (enabledRules.length > 0)
82
+ scanOptions.enabledRules = enabledRules;
83
+ if (ignorePatterns.length > 0)
84
+ scanOptions.ignorePatterns = ignorePatterns;
85
+ if (options.dedup)
86
+ scanOptions.dedup = true;
87
+ if (options.tier && options.tier !== 'all')
88
+ scanOptions.tier = options.tier;
89
+ // Only forward detectorOptions when non-empty — loadProjectConfig
90
+ // always returns a `{}` for it, and an empty object would leak into
91
+ // ScanOptions equality checks (dedup-unit).
92
+ if (options.detectorOptions && Object.keys(options.detectorOptions).length > 0) {
93
+ scanOptions.detectorOptions = options.detectorOptions;
94
+ }
95
+ return scanOptions;
96
+ }
97
+ function parseSeverityThreshold(value) {
98
+ if (value === undefined)
99
+ return undefined;
100
+ const normalized = value.trim().toLowerCase();
101
+ return severity_1.CANONICAL_SEVERITIES.includes(normalized)
102
+ ? normalized
103
+ : undefined;
104
+ }
105
+ function parseCiSeverityThreshold(value) {
106
+ if (value === undefined)
107
+ return undefined;
108
+ const canonical = parseSeverityThreshold(value);
109
+ if (canonical)
110
+ return canonical;
111
+ const normalized = value.trim().toLowerCase();
112
+ const legacyAliases = {
113
+ error: 'high',
114
+ warning: 'medium',
115
+ note: 'informational',
116
+ none: 'none',
117
+ };
118
+ return legacyAliases[normalized];
119
+ }
120
+ function stripTomlQuotes(value) {
121
+ const trimmed = value.trim();
122
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
123
+ return trimmed.slice(1, -1);
124
+ }
125
+ return trimmed;
126
+ }
127
+ function readCiSeverityThresholdConfig(cwd) {
128
+ for (const fileName of ['solast.toml', '.solast.toml']) {
129
+ const file = path.join(cwd, fileName);
130
+ if (!fs.existsSync(file))
131
+ continue;
132
+ const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
133
+ let section = '';
134
+ for (const rawLine of lines) {
135
+ const line = rawLine.replace(/\s+#.*$/, '').trim();
136
+ if (!line)
137
+ continue;
138
+ const sectionMatch = line.match(/^\[([^\]]+)\]$/);
139
+ if (sectionMatch) {
140
+ section = sectionMatch[1].trim();
141
+ continue;
142
+ }
143
+ if (section !== 'ci')
144
+ continue;
145
+ const assignment = line.match(/^([A-Za-z0-9_-]+)\s*=\s*(.+)$/);
146
+ if (!assignment)
147
+ continue;
148
+ if (assignment[1] === 'severity_threshold') {
149
+ return stripTomlQuotes(assignment[2]);
150
+ }
151
+ }
152
+ return undefined;
153
+ }
154
+ return undefined;
155
+ }
156
+ function resolveSeverityThreshold(options, cwd, stderr) {
157
+ const cliThreshold = options.severityThreshold;
158
+ if (cliThreshold !== undefined) {
159
+ const parsed = parseSeverityThreshold(cliThreshold);
160
+ if (parsed)
161
+ return { threshold: parsed, filtersOutput: true };
162
+ stderr(`error: --severity-threshold must be one of: ${severity_1.CANONICAL_SEVERITIES.join(', ')}`);
163
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
164
+ }
165
+ if (!options.ci) {
166
+ return { threshold: undefined, filtersOutput: false };
167
+ }
168
+ const configuredThreshold = readCiSeverityThresholdConfig(cwd);
169
+ if (configuredThreshold !== undefined) {
170
+ const parsed = parseCiSeverityThreshold(configuredThreshold);
171
+ if (parsed === 'none')
172
+ return { threshold: undefined, filtersOutput: false, ciGateDisabled: true };
173
+ if (parsed)
174
+ return { threshold: parsed, filtersOutput: false };
175
+ stderr(`error: ci.severity_threshold must be one of: ${severity_1.CANONICAL_SEVERITIES.join(', ')}, error, warning, note, none`);
176
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
177
+ }
178
+ // If running in CI mode and no threshold is configured, default to 'high'
179
+ // (which corresponds to the old 'error' default).
180
+ if (options.ci) {
181
+ return { threshold: 'high', filtersOutput: false };
182
+ }
183
+ return { threshold: undefined, filtersOutput: false };
184
+ }
185
+ function isUserError(result) {
186
+ return result.ruleId === 'error' || result.ruleId === 'parse-error';
187
+ }
188
+ // 'scan-error' marks a detector crash (registry.runAll threw): an internal
189
+ // tool failure per the exit-code contract, not a security finding and not a
190
+ // user/input error.
191
+ function isInternalError(result) {
192
+ return result.ruleId === 'scan-error';
193
+ }
194
+ function isReportableVulnerability(result) {
195
+ return !isUserError(result) && !isInternalError(result);
196
+ }
197
+ function getExitCode(results) {
198
+ if (results.some(isInternalError)) {
199
+ return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
200
+ }
201
+ if (results.some(isUserError)) {
202
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
203
+ }
204
+ if (results.some(isReportableVulnerability)) {
205
+ return exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND;
206
+ }
207
+ return exit_codes_1.EXIT_CODES.OK;
208
+ }
209
+ function validateDiffBaselineOptions(options, stderr) {
210
+ if (options.diffBaseline && options.rule && options.rule.length > 0) {
211
+ stderr('error: --diff-baseline cannot be combined with --rule');
212
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
213
+ }
214
+ return undefined;
215
+ }
216
+ function validateIgnorePatternOptions(options, stderr) {
217
+ if (!options.ignorePattern || options.ignorePattern.length === 0)
218
+ return undefined;
219
+ const normalized = [];
220
+ try {
221
+ for (const pattern of options.ignorePattern) {
222
+ normalized.push((0, glob_1.validateGlobPattern)(pattern));
223
+ }
224
+ }
225
+ catch (e) {
226
+ if (e instanceof glob_1.GlobPatternError) {
227
+ stderr(`error: invalid --ignore-pattern: ${e.message}`);
228
+ }
229
+ else {
230
+ stderr(`error: invalid --ignore-pattern: ${e instanceof Error ? e.message : String(e)}`);
231
+ }
232
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
233
+ }
234
+ options.ignorePattern = normalized;
235
+ return undefined;
236
+ }
237
+ function loadScanConfig(cwd, targets, stderr) {
238
+ try {
239
+ return (0, config_1.loadProjectConfig)(cwd, targets);
240
+ }
241
+ catch (e) {
242
+ if (e instanceof config_1.ConfigUserError) {
243
+ stderr(`error: ${e.message}`);
244
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
245
+ }
246
+ const message = e instanceof Error ? e.message : String(e);
247
+ stderr(`error: could not read SolAST config: ${message}`);
248
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
249
+ }
250
+ }
251
+ function formatNdjson(results, dedupMeta) {
252
+ const lines = results.map(result => JSON.stringify(scanResultToNdjsonObject(result)));
253
+ if (dedupMeta && dedupMeta.rawCount !== dedupMeta.uniqueCount) {
254
+ lines.push(JSON.stringify({ type: 'dedup_summary', dedup_summary: { raw_count: dedupMeta.rawCount, unique_count: dedupMeta.uniqueCount } }));
255
+ }
256
+ return lines.join('\n');
257
+ }
258
+ function getIgnoreSuppressionMetadata(results) {
259
+ return results._ignoreSuppression;
260
+ }
261
+ function applyIgnorePatternFilter(results, options) {
262
+ if (!options.ignorePattern || options.ignorePattern.length === 0)
263
+ return results;
264
+ const meta = getIgnoreSuppressionMetadata(results) || {
265
+ patterns: options.ignorePattern.slice(),
266
+ suppressedDetectorIds: inferSuppressedDetectorIds(options),
267
+ suppressedFindingCount: 0,
268
+ };
269
+ results._ignoreSuppression = {
270
+ patterns: meta.patterns.length > 0 ? meta.patterns : options.ignorePattern.slice(),
271
+ suppressedDetectorIds: meta.suppressedDetectorIds.slice().sort((a, b) => a.localeCompare(b)),
272
+ suppressedFindingCount: meta.suppressedFindingCount,
273
+ };
274
+ return results;
275
+ }
276
+ function inferSuppressedDetectorIds(options) {
277
+ if (!options.ignorePattern || options.ignorePattern.length === 0)
278
+ return [];
279
+ return (0, registry_1.createDefaultDetectorRegistry)()
280
+ .ignoredDetectorIds(options.rule, options.enable, options.ignorePattern);
281
+ }
282
+ function emitVerboseIgnoreSuppression(results, options, stderr) {
283
+ if (!options.verbose)
284
+ return;
285
+ const meta = getIgnoreSuppressionMetadata(results);
286
+ if (!meta || meta.patterns.length === 0)
287
+ return;
288
+ const ids = meta.suppressedDetectorIds;
289
+ stderr(`SolAST: ${ids.length} detector(s) ignored by --ignore-pattern${ids.length > 0 ? `: ${ids.join(', ')}` : ''}`);
290
+ }
291
+ function emitSourceSuppressionDiagnostics(results, stderr) {
292
+ const diagnostics = results._sourceSuppressionDiagnostics;
293
+ if (!Array.isArray(diagnostics))
294
+ return;
295
+ for (const diagnostic of diagnostics) {
296
+ if (diagnostic && typeof diagnostic.message === 'string') {
297
+ stderr(diagnostic.message);
298
+ }
299
+ }
300
+ }
301
+ // Per-finding object shape used by formatNdjson for `--format json` NDJSON output.
302
+ function scanResultToNdjsonObject(result) {
303
+ return {
304
+ finding_id: result.findingId,
305
+ file_path: result.file,
306
+ finding_type: result.ruleId,
307
+ severity: result.severity,
308
+ contract_name: result.contractName,
309
+ function_name: result.functionName,
310
+ source_location: {
311
+ line: result.line,
312
+ column: result.column ?? 0
313
+ },
314
+ external_call_node: result.externalCallNode,
315
+ state_mutation_node: result.stateMutationNode,
316
+ caller: result.caller,
317
+ delegate_target: result.delegateTarget,
318
+ initializer_path: result.initializerPath,
319
+ message: result.message,
320
+ contract_hash: result.contractHash,
321
+ source: result.provenance,
322
+ tier: result.tier
323
+ };
324
+ }
325
+ function applyDiffBaselineFilter(findings, options, cwdImpl, stderr) {
326
+ const cwd = cwdImpl();
327
+ try {
328
+ const baselineKeys = (0, diff_baseline_1.loadBaselineKeys)(options.diffBaseline, cwd);
329
+ return (0, diff_baseline_1.filterNewFindings)(findings, baselineKeys, cwd);
330
+ }
331
+ catch (e) {
332
+ if (e instanceof diff_baseline_1.DiffBaselineUserError) {
333
+ stderr(`error: ${e.message}`);
334
+ }
335
+ else {
336
+ stderr(`error: could not load diff baseline: ${e instanceof Error ? e.message : String(e)}`);
337
+ }
338
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
339
+ }
340
+ }
341
+ function emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl) {
342
+ const formatImpl = deps.formatFindings || text_1.formatFindings;
343
+ results = applyIgnorePatternFilter(results, options);
344
+ emitVerboseIgnoreSuppression(results, options, stderr);
345
+ emitSourceSuppressionDiagnostics(results, stderr);
346
+ const jsonShorthand = options.json === true;
347
+ const format = jsonShorthand ? 'json' : (options.format || 'text');
348
+ const ci = options.ci === true;
349
+ const quiet = options.quiet === true;
350
+ for (const r of results) {
351
+ if (isUserError(r) || isInternalError(r)) {
352
+ stderr(`error: ${r.file}: ${r.message}`);
353
+ }
354
+ }
355
+ const hasUserErrors = results.some(isUserError);
356
+ const hasInternalErrors = results.some(isInternalError);
357
+ if (hasInternalErrors && ci) {
358
+ return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
359
+ }
360
+ if (hasUserErrors && ci) {
361
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
362
+ }
363
+ let threshold;
364
+ const resolved = resolveSeverityThreshold(options, cwdImpl(), stderr);
365
+ if (typeof resolved === 'number')
366
+ return resolved;
367
+ threshold = resolved.threshold;
368
+ const thresholdFiltersOutput = resolved.filtersOutput;
369
+ let findings = results.filter(isReportableVulnerability);
370
+ if (thresholdFiltersOutput) {
371
+ findings = findings.filter(f => (0, severity_1.atOrAboveThreshold)((0, severity_1.normalizeSeverity)(f.severity), threshold));
372
+ }
373
+ const dedupMeta = results._dedup;
374
+ const ignoreMeta = getIgnoreSuppressionMetadata(results);
375
+ if (options.diffBaseline) {
376
+ if (hasUserErrors) {
377
+ // Don't run diff when the scan itself surfaced a user-level error —
378
+ // the per-file error messages were already emitted above; treat
379
+ // the run as a normal user-error exit.
380
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
381
+ }
382
+ const filtered = applyDiffBaselineFilter(findings, options, cwdImpl, stderr);
383
+ if (typeof filtered === 'number')
384
+ return filtered;
385
+ findings = filtered;
386
+ }
387
+ // Location-sort findings for deterministic output across all formats
388
+ // (SARIF also sorts internally); decouples output from registration order.
389
+ findings = findings.slice().sort((a, b) => a.file.localeCompare(b.file) || (a.line || 0) - (b.line || 0) || (a.column || 0) - (b.column || 0) || a.ruleId.localeCompare(b.ruleId));
390
+ // Note: per-file parse errors do NOT blank the report — findings from
391
+ // files that parsed are still emitted (the run still exits USER_ERROR).
392
+ // Suppressing the whole report because one vendored/exotic file failed
393
+ // to parse silently destroyed results for every other file.
394
+ const isCleanDiffBaseline = options.diffBaseline && findings.length === 0;
395
+ const output = isCleanDiffBaseline && format !== 'sarif'
396
+ ? ''
397
+ : format === 'json'
398
+ ? formatNdjson(findings, options.diffBaseline ? undefined : dedupMeta)
399
+ : format === 'sarif'
400
+ ? (0, sarif_1.formatSarif)(findings, {
401
+ rootDir: cwdImpl(),
402
+ fpThresholdPct: options.fpThreshold,
403
+ fpRates: fpRatesData,
404
+ severityOverrides: options.severityOverrides,
405
+ sarifSeverityTuning: options.sarifSeverityTuning,
406
+ })
407
+ : formatImpl(findings, {
408
+ cwd: cwdImpl(),
409
+ color: options.color === false ? 'never' : 'auto',
410
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
411
+ env: process.env,
412
+ rawCount: dedupMeta?.rawCount,
413
+ uniqueCount: dedupMeta?.uniqueCount,
414
+ dedupActive: Boolean(dedupMeta),
415
+ suppressedDetectorCount: ignoreMeta?.suppressedDetectorIds.length,
416
+ });
417
+ const emittedOutput = ci && format === 'text' ? '' : output;
418
+ if (options.output) {
419
+ try {
420
+ // --output always receives the full formatted report; CI mode only
421
+ // suppresses the stdout copy (annotations still go to stdout below).
422
+ writeFileImpl(options.output, output ? `${output}\n` : '');
423
+ }
424
+ catch (e) {
425
+ const message = e instanceof Error ? e.message : String(e);
426
+ stderr(`error: could not write output file '${options.output}': ${message}`);
427
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
428
+ }
429
+ }
430
+ else if (quiet) {
431
+ // --quiet silences stdout for all formats (text/json/sarif).
432
+ // The exit code still gates the run; text mode keeps a one-line stderr
433
+ // breadcrumb so a non-CI caller knows why the run failed.
434
+ if (findings.length > 0 && format === 'text' && !ci) {
435
+ stderr(`SolAST: ${findings.length} finding(s) blocked the run — re-run without --quiet for details`);
436
+ }
437
+ }
438
+ else {
439
+ if (emittedOutput) {
440
+ stdout(emittedOutput);
441
+ }
442
+ }
443
+ if (ci && threshold) {
444
+ const shouldEmitGithubAnnotations = !quiet && format === 'text';
445
+ const gatedFindings = findings.filter(f => (0, severity_1.atOrAboveThreshold)((0, severity_1.normalizeSeverity)(f.severity), threshold));
446
+ for (const finding of gatedFindings) {
447
+ const level = (0, sarif_1.sarifLevelForFinding)(finding, {
448
+ fpThresholdPct: options.fpThreshold,
449
+ fpRates: fpRatesData,
450
+ severityOverrides: options.severityOverrides,
451
+ sarifSeverityTuning: options.sarifSeverityTuning,
452
+ });
453
+ if (shouldEmitGithubAnnotations && level === 'error') {
454
+ stdout((0, github_actions_1.formatGithubActionsAnnotation)(finding, level, cwdImpl()));
455
+ }
456
+ }
457
+ // We only stderr if ciCount > 0 or if we want to keep the breadcrumb.
458
+ // Let's just output the breadcrumb like it used to.
459
+ const ciCount = gatedFindings.length;
460
+ stderr(`${ciCount} findings ≥ ${threshold}`);
461
+ return ciCount > 0 ? exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND : exit_codes_1.EXIT_CODES.OK;
462
+ }
463
+ if (ci && resolved.ciGateDisabled) {
464
+ stderr('0 findings ≥ none');
465
+ return exit_codes_1.EXIT_CODES.OK;
466
+ }
467
+ if (hasInternalErrors) {
468
+ return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
469
+ }
470
+ if (hasUserErrors) {
471
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
472
+ }
473
+ return findings.length > 0 ? exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND : exit_codes_1.EXIT_CODES.OK;
474
+ }
475
+ function collectSolidityFiles(dir) {
476
+ const files = [];
477
+ const entries = fs.readdirSync(dir).sort((a, b) => a.localeCompare(b));
478
+ for (const entry of entries) {
479
+ const fullPath = path.join(dir, entry);
480
+ let stat;
481
+ try {
482
+ stat = fs.statSync(fullPath);
483
+ }
484
+ catch {
485
+ // Broken symlink or unreadable entry (common under node_modules/.bin
486
+ // and pnpm layouts) — skip it instead of aborting the whole scan.
487
+ continue;
488
+ }
489
+ if (stat.isDirectory()) {
490
+ files.push(...collectSolidityFiles(fullPath));
491
+ }
492
+ else if (stat.isFile() && entry.endsWith('.sol')) {
493
+ files.push(fullPath);
494
+ }
495
+ }
496
+ return files;
497
+ }
498
+ function resolveScanFiles(inputPaths) {
499
+ const paths = Array.isArray(inputPaths) ? inputPaths : [inputPaths];
500
+ const discovered = new Map();
501
+ for (const inputPath of paths) {
502
+ let realPath;
503
+ let stat;
504
+ try {
505
+ realPath = fs.realpathSync(inputPath);
506
+ stat = fs.statSync(realPath);
507
+ }
508
+ catch (e) {
509
+ throw new Error(`Path not found: ${inputPath}`);
510
+ }
511
+ if (stat.isDirectory()) {
512
+ const files = collectSolidityFiles(realPath);
513
+ if (files.length === 0) {
514
+ throw new Error(`No Solidity files found in directory: ${inputPath}`);
515
+ }
516
+ for (const file of files) {
517
+ discovered.set(path.resolve(file), file);
518
+ }
519
+ }
520
+ else if (stat.isFile()) {
521
+ if (!realPath.endsWith('.sol')) {
522
+ throw new Error(`Not a Solidity file: ${inputPath}`);
523
+ }
524
+ discovered.set(path.resolve(realPath), realPath);
525
+ }
526
+ else {
527
+ throw new Error(`Path is not a file or directory: ${inputPath}`);
528
+ }
529
+ }
530
+ return [...discovered.values()].sort((a, b) => a.localeCompare(b));
531
+ }
532
+ function runScanCommand(targetPath, options = {}, deps = {}) {
533
+ const discoverImpl = deps.discoverFiles || index_1.discoverFiles;
534
+ const scanFilesImpl = deps.scanFiles || index_1.scanFiles;
535
+ const cwdImpl = deps.cwd || (() => process.cwd());
536
+ const stdout = deps.stdout || ((message) => process.stdout.write(`${message}\n`));
537
+ const stderr = deps.stderr || console.error;
538
+ const writeFileImpl = deps.writeFile || ((p, c) => fs.writeFileSync(p, c));
539
+ const paths = Array.isArray(targetPath) ? targetPath : [targetPath];
540
+ const jsonShorthand = options.json === true;
541
+ const format = jsonShorthand ? 'json' : (options.format || 'text');
542
+ const ci = options.ci === true;
543
+ const quiet = options.quiet === true;
544
+ // Machine-readable formats must not interleave human-friendly
545
+ // discovery messages on stderr: a non-empty stderr breaks shell
546
+ // scripts that assert empty error streams on a clean run.
547
+ const suppressDiscoveryMessage = ci || quiet || format === 'json' || format === 'sarif' || Boolean(options.diffBaseline);
548
+ if (paths.length === 0) {
549
+ stderr('error: missing required path argument');
550
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
551
+ }
552
+ const diffBaselineOptionError = validateDiffBaselineOptions(options, stderr);
553
+ if (diffBaselineOptionError !== undefined)
554
+ return diffBaselineOptionError;
555
+ const ignorePatternOptionError = validateIgnorePatternOptions(options, stderr);
556
+ if (ignorePatternOptionError !== undefined)
557
+ return ignorePatternOptionError;
558
+ const scanOptions = buildScanOptions(options);
559
+ const configResult = loadScanConfig(cwdImpl(), paths, stderr);
560
+ if (typeof configResult === 'number')
561
+ return configResult;
562
+ options = { ...options, severityOverrides: configResult.severityOverrides, detectorOptions: configResult.detectorOptions };
563
+ // `scanOptions` was built from `options` before the project config
564
+ // was loaded, so per-detector options from .solast.yml have to be
565
+ // folded in here — without this the detectorOptions never reach the
566
+ // registry and a configured detector silently runs with its defaults.
567
+ // Guard on non-empty: loadProjectConfig always returns a `{}`, which
568
+ // would otherwise leak into ScanOptions equality checks.
569
+ if (configResult.detectorOptions && Object.keys(configResult.detectorOptions).length > 0) {
570
+ scanOptions.detectorOptions = configResult.detectorOptions;
571
+ }
572
+ let results;
573
+ try {
574
+ if (deps.scan) {
575
+ if (deps.discoverFiles) {
576
+ const files = discoverImpl(paths);
577
+ if (!suppressDiscoveryMessage)
578
+ stderr(`Discovered ${files.length} Solidity file(s).`);
579
+ }
580
+ results = deps.scan(paths, scanOptions);
581
+ }
582
+ else {
583
+ let files;
584
+ try {
585
+ files = deps.discoverFiles ? discoverImpl(paths) : resolveScanFiles(paths);
586
+ }
587
+ catch (e) {
588
+ const message = e instanceof Error ? e.message : String(e);
589
+ stderr(`error: ${message}`);
590
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
591
+ }
592
+ if (!deps.scanFiles)
593
+ files = (0, files_1.deduplicateFilesByContent)(files);
594
+ if (!suppressDiscoveryMessage)
595
+ stderr(`Discovered ${files.length} Solidity file(s).`);
596
+ results = scanFilesImpl(files, scanOptions);
597
+ }
598
+ }
599
+ catch (e) {
600
+ const message = e instanceof Error ? e.message : String(e);
601
+ stderr(`SolAST internal error: ${message}`);
602
+ return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
603
+ }
604
+ return emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl);
605
+ }
606
+ /**
607
+ * Async sibling of `runScanCommand` that runs the scan across a worker
608
+ * thread pool when `options.workers > 1`. Falls through to the sync
609
+ * `runScanCommand` whenever the worker count is 0/1 or the file count
610
+ * is below the threshold inside `scanFilesParallel`. The CLI binding
611
+ * routes here when the user passes `--workers <n>`; everything else
612
+ * keeps the existing synchronous code path so this PR doesn't perturb
613
+ * behaviour for callers that don't opt in.
614
+ */
615
+ async function runScanCommandParallel(targetPath, options = {}, deps = {}) {
616
+ const workerCount = (0, parallel_scan_1.resolveWorkerCount)(options.workers);
617
+ const discoverImpl = deps.discoverFiles || index_1.discoverFiles;
618
+ const cwdImpl = deps.cwd || (() => process.cwd());
619
+ const stdout = deps.stdout || ((message) => process.stdout.write(`${message}\n`));
620
+ const stderr = deps.stderr || console.error;
621
+ const writeFileImpl = deps.writeFile || ((p, c) => fs.writeFileSync(p, c));
622
+ const paths = Array.isArray(targetPath) ? targetPath : [targetPath];
623
+ const jsonShorthand = options.json === true;
624
+ const format = jsonShorthand ? 'json' : (options.format || 'text');
625
+ const ci = options.ci === true;
626
+ const quiet = options.quiet === true;
627
+ let scanOptions = buildScanOptions(options);
628
+ const suppressDiscoveryMessage = ci || quiet || format === 'json' || format === 'sarif' || Boolean(options.diffBaseline);
629
+ if (paths.length === 0) {
630
+ stderr('error: missing required path argument');
631
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
632
+ }
633
+ const diffBaselineOptionError = validateDiffBaselineOptions(options, stderr);
634
+ if (diffBaselineOptionError !== undefined)
635
+ return diffBaselineOptionError;
636
+ const ignorePatternOptionError = validateIgnorePatternOptions(options, stderr);
637
+ if (ignorePatternOptionError !== undefined)
638
+ return ignorePatternOptionError;
639
+ const configResult = loadScanConfig(cwdImpl(), paths, stderr);
640
+ if (typeof configResult === 'number')
641
+ return configResult;
642
+ options = { ...options, severityOverrides: configResult.severityOverrides, detectorOptions: configResult.detectorOptions };
643
+ let results;
644
+ try {
645
+ scanOptions = buildScanOptions(options);
646
+ let files;
647
+ try {
648
+ files = deps.discoverFiles ? discoverImpl(paths) : resolveScanFiles(paths);
649
+ }
650
+ catch (e) {
651
+ const message = e instanceof Error ? e.message : String(e);
652
+ stderr(`error: ${message}`);
653
+ return exit_codes_1.EXIT_CODES.USER_ERROR;
654
+ }
655
+ files = (0, files_1.deduplicateFilesByContent)(files);
656
+ if (!suppressDiscoveryMessage)
657
+ stderr(`Discovered ${files.length} Solidity file(s).`);
658
+ // The dispatcher gates on `files.length >= workerCount * minFilesPerWorker`
659
+ // and falls through to the sync `scanFiles` when the file set is
660
+ // too small to amortise worker startup. That keeps the behaviour
661
+ // stable for tiny scans even if the user explicitly asked for
662
+ // workers.
663
+ if (workerCount <= 1) {
664
+ results = (0, index_1.scanFiles)(files, scanOptions);
665
+ }
666
+ else {
667
+ results = await (0, parallel_scan_1.scanFilesParallel)(files, { ...scanOptions, workerCount });
668
+ }
669
+ }
670
+ catch (e) {
671
+ const message = e instanceof Error ? e.message : String(e);
672
+ stderr(`SolAST internal error: ${message}`);
673
+ return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
674
+ }
675
+ return emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl);
676
+ }
677
+ const program = new commander_1.Command();
678
+ program.enablePositionalOptions();
679
+ program
680
+ .name('solast')
681
+ .description('Static analysis CLI for Solidity smart contracts')
682
+ .version(pkgVersion)
683
+ .showHelpAfterError()
684
+ .argument('[paths...]', 'path(s) to .sol files or directories of .sol files')
685
+ .action(async (paths, options) => {
686
+ process.exitCode = await runScanCommandParallel(paths, { ...options, format: 'text' });
687
+ });
688
+ program
689
+ .command('scan')
690
+ .description('Scan Solidity files for known issues')
691
+ .argument('[paths...]', 'path(s) to .sol files or directories of .sol files')
692
+ .addOption(new commander_1.Option('--format <format>', 'output format: text severity report, json NDJSON, or sarif 2.1.0; severities are critical, high, medium, low, informational').choices(['text', 'json', 'sarif']).default('text'))
693
+ .option('--ci', 'run in CI mode: keep the selected output format and gate the exit code by SARIF severity threshold')
694
+ .option('--severity-threshold <level>', 'filter findings below this severity (critical, high, medium, low, informational)')
695
+ .option('--output <file>', 'write findings to a file instead of stdout')
696
+ .option('--no-color', 'suppress ANSI severity colors in text output')
697
+ .option('--quiet', 'silence stdout and discovery messages; on findings, exit 1 with a one-line stderr summary (intended for editor and Foundry pre-test integration)')
698
+ .option('--json', 'shorthand for --format json with discovery messages suppressed; output is one NDJSON object per finding')
699
+ .option('--tier <tier>', 'restrict scan to a rule tier (core, extended, all)', value => {
700
+ if (!['core', 'extended', 'all'].includes(value)) {
701
+ process.stderr.write('error: --tier must be one of core, extended, all\n');
702
+ process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
703
+ }
704
+ return value;
705
+ }, 'all')
706
+ .option('--rule <rule_id>', 'restrict scan to a rule id; repeat for multiple rules (e.g. --rule classic-reentrancy --rule check-effects-interactions)', (value, previous) => (previous || []).concat(value))
707
+ .option('--ignore-pattern <glob>', 'exclude detectors whose rule id matches this glob from execution; repeat for multiple ephemeral ignore patterns', (value, previous) => (previous || []).concat(value))
708
+ .option('--enable <rule_id>', 'enable an opt-in detector by rule id; repeat for multiple opt-in rules (e.g. --enable fhe-state-leakage)', (value, previous) => (previous || []).concat(value))
709
+ .option('--verbose', 'print additional scan diagnostics to stderr')
710
+ .option('--dedup', 'also deduplicate overlapping findings from bridge/cross-chain detectors using the shared rule-deduplication engine; content-identical Solidity files are always scanned once')
711
+ .option('--fp-threshold <pct>', 'dynamic severity downgrade threshold for noisy rules (default: 5). 0 disables downgrading.', value => {
712
+ const n = Number.parseFloat(value);
713
+ if (!Number.isFinite(n) || n < 0 || n > 100) {
714
+ process.stderr.write('error: --fp-threshold must be a number between 0 and 100\n');
715
+ process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
716
+ }
717
+ return n;
718
+ })
719
+ .option('--sarif-severity-tuning <state>', 'enable or disable FP-rate based SARIF severity tuning (default: on)', value => {
720
+ if (value !== 'on' && value !== 'off') {
721
+ process.stderr.write('error: --sarif-severity-tuning must be one of: on, off\n');
722
+ process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
723
+ }
724
+ return value === 'on';
725
+ }, true)
726
+ .option('--workers <n>', 'spread the scan across N worker_threads (clamped to CPU count, capped at 32). Threshold-gated: small file sets fall through to the synchronous path so worker startup never costs more than the parallelism saves.', value => {
727
+ if (!/^\d+$/.test(value.trim())) {
728
+ process.stderr.write('error: --workers must be a non-negative integer\n');
729
+ process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
730
+ }
731
+ return Number.parseInt(value, 10);
732
+ })
733
+ .option('--diff-baseline <path>', 'CI regression detection: compare the current scan against a checked-in SolAST NDJSON baseline and emit only net-new findings. Exits 1 only if new findings are present; cannot be combined with --rule.')
734
+ .addHelpText('after', `
735
+
736
+ Example:
737
+ $ solast scan --ci --severity-threshold high <path>
738
+ $ solast scan --workers 8 contracts/
739
+ `)
740
+ .action(async (paths, options, command) => {
741
+ if (paths.length === 0) {
742
+ process.stderr.write('error: missing required path argument\n');
743
+ process.exitCode = exit_codes_1.EXIT_CODES.USER_ERROR;
744
+ return;
745
+ }
746
+ // Always go through the parallel adapter so a `--workers <n>` flag
747
+ // takes effect; the adapter is a thin wrapper that delegates to
748
+ // the synchronous `runScanCommand` whenever workers are 0/1 or
749
+ // the file set is too small to amortise worker startup.
750
+ process.exitCode = await runScanCommandParallel(paths, options);
751
+ });
752
+ if (require.main === module) {
753
+ program.parse();
754
+ }
755
+ //# sourceMappingURL=cli.js.map