@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,914 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LackOfCalldataValidationDetector = void 0;
4
+ const dataflow_1 = require("./_common/dataflow");
5
+ const RULE_ID = 'lack-of-calldata-validation';
6
+ const PATTERN = 'lack-of-calldata-validation/socketgateway-unvalidated-call';
7
+ class LackOfCalldataValidationDetector {
8
+ id = RULE_ID;
9
+ patternKey = RULE_ID;
10
+ supportedAstKinds = ['parser', 'solc'];
11
+ currentFile = '';
12
+ sourceText;
13
+ findings = [];
14
+ setFile(file) {
15
+ this.currentFile = file;
16
+ this.findings = [];
17
+ }
18
+ setSourceText(sourceText) {
19
+ this.sourceText = sourceText;
20
+ }
21
+ getFindings() {
22
+ return this.findings;
23
+ }
24
+ SourceUnit(ast) {
25
+ if (ast?.nodeType === 'SourceUnit') {
26
+ this.findings.push(...this.runAst(ast, this.currentFile, this.sourceText));
27
+ }
28
+ }
29
+ ContractDefinition(node) {
30
+ if (node?.type !== 'ContractDefinition')
31
+ return;
32
+ this.findings.push(...this.runAst(node, this.currentFile, this.sourceText));
33
+ }
34
+ scanAst(ast, file, sourceText) {
35
+ return this.runAst(ast, file, sourceText);
36
+ }
37
+ runAst(ast, file, sourceText) {
38
+ if (!ast || typeof ast !== 'object')
39
+ return [];
40
+ const findings = [];
41
+ const lineOffsets = buildLineOffsets(sourceText);
42
+ const seen = new Set();
43
+ walkContracts(ast, contractNode => {
44
+ const contractName = getName(contractNode) || '<anonymous>';
45
+ const zeroAddressNames = collectZeroAddressConstants(contractNode);
46
+ const summaries = getContractFunctions(contractNode).map(fn => ({
47
+ node: fn,
48
+ name: getName(fn) || '<anonymous>',
49
+ parameters: getParameters(fn),
50
+ externallyCallable: isExternallyCallable(fn),
51
+ guarded: hasRecognizedGuardModifier(fn),
52
+ }));
53
+ const propagated = collectPropagatedParamTaint(summaries);
54
+ for (const summary of summaries) {
55
+ const body = getFunctionBody(summary.node);
56
+ if (!body)
57
+ continue;
58
+ const seededIndexes = new Set();
59
+ if (summary.externallyCallable && !summary.guarded) {
60
+ summary.parameters.forEach((_param, index) => seededIndexes.add(index));
61
+ }
62
+ for (const index of propagated.get(summary.name) || [])
63
+ seededIndexes.add(index);
64
+ if (seededIndexes.size === 0 || summary.guarded)
65
+ continue;
66
+ const tainted = new Set();
67
+ summary.parameters.forEach((param, index) => {
68
+ if (seededIndexes.has(index) && param?.name)
69
+ tainted.add(String(param.name));
70
+ });
71
+ if (tainted.size === 0)
72
+ continue;
73
+ const state = {
74
+ tainted,
75
+ targetValidated: new Set(),
76
+ selectorValidated: new Set(),
77
+ authorityGuarded: false,
78
+ };
79
+ const sink = analyzeBlockStatements(getBlockStatements(body), state, zeroAddressNames);
80
+ if (!sink)
81
+ continue;
82
+ const loc = getLoc(sink, lineOffsets);
83
+ const line = loc?.line || 0;
84
+ const column = loc?.column || 0;
85
+ const key = `${file}:${contractName}:${summary.name}:${RULE_ID}`;
86
+ if (seen.has(key))
87
+ continue;
88
+ seen.add(key);
89
+ findings.push({
90
+ file,
91
+ contract: contractName,
92
+ 'function': summary.name,
93
+ line,
94
+ endLine: line,
95
+ column,
96
+ pattern: PATTERN,
97
+ confidence: 'medium',
98
+ ruleId: RULE_ID,
99
+ severity: 'warning',
100
+ message: `Lack of calldata validation in '${contractName}.${summary.name}': caller-controlled target and calldata reach a low-level call without a selector validation plus target boundary before the call.`,
101
+ rationale: 'Mirrors the SocketGateway exploit shape: swap calldata supplied by the caller is forwarded to a token/router target before constraining the selector and target, enabling arbitrary token actions through the route.',
102
+ suggestedFix: 'Validate both the low-level call target and calldata selector before the call, route through typed interfaces, or restrict the executor with trusted access control.',
103
+ contractName,
104
+ functionName: summary.name,
105
+ sourceLocation: { line, column },
106
+ findingId: '',
107
+ contractHash: '',
108
+ });
109
+ }
110
+ });
111
+ return findings;
112
+ }
113
+ }
114
+ exports.LackOfCalldataValidationDetector = LackOfCalldataValidationDetector;
115
+ function collectPropagatedParamTaint(functions) {
116
+ const internalNames = new Set(functions.filter(fn => !fn.externallyCallable).map(fn => fn.name));
117
+ const propagated = new Map();
118
+ if (internalNames.size === 0)
119
+ return propagated;
120
+ // Outer fixed point: walk every function each pass, propagate taint
121
+ // through internal calls, repeat until no new (callee, arg-index)
122
+ // pairs are added.
123
+ (0, dataflow_1.runFixedPoint)(() => {
124
+ let changed = false;
125
+ for (const fn of functions) {
126
+ const tainted = new Set();
127
+ if (fn.externallyCallable && !fn.guarded) {
128
+ fn.parameters.forEach(param => { if (param?.name)
129
+ tainted.add(String(param.name)); });
130
+ }
131
+ for (const index of propagated.get(fn.name) || []) {
132
+ const name = fn.parameters[index]?.name;
133
+ if (name)
134
+ tainted.add(String(name));
135
+ }
136
+ if (tainted.size === 0)
137
+ continue;
138
+ // Inner fixed point: within a single function body, propagate
139
+ // taint through assignments and `var x = tainted_expr` declarations
140
+ // until the local tainted set stops growing.
141
+ (0, dataflow_1.runFixedPoint)(() => {
142
+ const before = tainted.size;
143
+ walk(fn.node.body, node => {
144
+ if (isAssignmentNode(node) && referencesTainted(getBinaryRight(node), tainted)) {
145
+ for (const name of collectAssignTargets(getBinaryLeft(node)))
146
+ tainted.add(name);
147
+ }
148
+ if (isNode(node, 'VariableDeclarationStatement') && referencesTainted(node.initialValue, tainted)) {
149
+ for (const decl of getVariableDeclarations(node)) {
150
+ if (decl?.name)
151
+ tainted.add(String(decl.name));
152
+ }
153
+ }
154
+ });
155
+ return tainted.size !== before;
156
+ }, { maxPasses: 8, name: 'lack-of-calldata-validation/intra-function-taint' });
157
+ walk(fn.node.body, node => {
158
+ if (!isNode(node, 'FunctionCall'))
159
+ return;
160
+ const callee = getCalleeName(node);
161
+ if (!internalNames.has(callee))
162
+ return;
163
+ const indexes = propagated.get(callee) || new Set();
164
+ getArguments(node).forEach((arg, index) => {
165
+ if (referencesTainted(arg, tainted) && !indexes.has(index)) {
166
+ indexes.add(index);
167
+ changed = true;
168
+ }
169
+ });
170
+ if (indexes.size > 0)
171
+ propagated.set(callee, indexes);
172
+ });
173
+ }
174
+ return changed;
175
+ }, { maxPasses: 12, name: 'lack-of-calldata-validation/inter-procedural-taint' });
176
+ return propagated;
177
+ }
178
+ function collectAssignmentTaint(stmt, tainted) {
179
+ (0, dataflow_1.runFixedPoint)(() => {
180
+ const before = tainted.size;
181
+ walk(stmt, node => {
182
+ if (isAssignmentNode(node) && referencesTainted(getBinaryRight(node), tainted)) {
183
+ for (const name of collectAssignTargets(getBinaryLeft(node)))
184
+ tainted.add(name);
185
+ }
186
+ if (isNode(node, 'VariableDeclarationStatement') && referencesTainted(node.initialValue, tainted)) {
187
+ for (const decl of getVariableDeclarations(node)) {
188
+ if (decl?.name)
189
+ tainted.add(String(decl.name));
190
+ }
191
+ }
192
+ });
193
+ return tainted.size !== before;
194
+ }, { maxPasses: 4, name: 'lack-of-calldata-validation/local-assignment-taint' });
195
+ }
196
+ function collectValidation(stmt, tainted, targetValidated, selectorValidated, zeroAddressNames) {
197
+ if (!isRequireOrAssertStatement(stmt))
198
+ return;
199
+ const condition = getArguments(stmt.expression)[0];
200
+ if (!condition)
201
+ return;
202
+ collectConditionValidations(condition, tainted, targetValidated, selectorValidated, zeroAddressNames);
203
+ }
204
+ function collectConditionValidations(condition, tainted, targetValidated, selectorValidated, zeroAddressNames) {
205
+ for (const name of collectTargetBoundedIdentifiers(condition, tainted, zeroAddressNames))
206
+ targetValidated.add(name);
207
+ for (const name of collectSelectorCheckedData(condition))
208
+ selectorValidated.add(name);
209
+ }
210
+ function analyzeBlockStatements(stmts, state, zeroAddressNames) {
211
+ for (const stmt of stmts) {
212
+ const sink = analyzeStatement(stmt, state, zeroAddressNames);
213
+ if (sink)
214
+ return sink;
215
+ }
216
+ return null;
217
+ }
218
+ function analyzeStatement(stmt, state, zeroAddressNames) {
219
+ if (!stmt || typeof stmt !== 'object')
220
+ return null;
221
+ collectAssignmentTaint(stmt, state.tainted);
222
+ if (!state.authorityGuarded && isAuthorityMsgSenderGuard(stmt, state.tainted)) {
223
+ state.authorityGuarded = true;
224
+ return null;
225
+ }
226
+ if (state.authorityGuarded)
227
+ return null;
228
+ if (isNode(stmt, 'IfStatement')) {
229
+ return analyzeIfStatement(stmt, state, zeroAddressNames);
230
+ }
231
+ if (isNode(stmt, 'Block') || isNode(stmt, 'UncheckedBlock')) {
232
+ return analyzeBlockStatements(getBlockStatements(stmt), state, zeroAddressNames);
233
+ }
234
+ if (isNode(stmt, 'ForStatement') || isNode(stmt, 'WhileStatement') || isNode(stmt, 'DoWhileStatement')) {
235
+ const body = stmt.body ?? stmt.statement;
236
+ if (body) {
237
+ const loopState = cloneAnalysisState(state);
238
+ const loopSink = analyzeBranchBody(body, loopState, zeroAddressNames);
239
+ if (loopSink)
240
+ return loopSink;
241
+ // Loop body may not execute; only propagate taint conservatively.
242
+ for (const t of loopState.tainted)
243
+ state.tainted.add(t);
244
+ }
245
+ return null;
246
+ }
247
+ if (isNode(stmt, 'TryStatement')) {
248
+ return analyzeTryStatement(stmt, state, zeroAddressNames);
249
+ }
250
+ collectValidation(stmt, state.tainted, state.targetValidated, state.selectorValidated, zeroAddressNames);
251
+ return findUnvalidatedCallSink(stmt, state.tainted, state.targetValidated, state.selectorValidated);
252
+ }
253
+ function analyzeIfStatement(stmt, state, zeroAddressNames) {
254
+ const condition = stmt.condition ?? stmt.conditionExpression;
255
+ const trueState = cloneAnalysisState(state);
256
+ if (condition) {
257
+ collectConditionValidations(condition, trueState.tainted, trueState.targetValidated, trueState.selectorValidated, zeroAddressNames);
258
+ }
259
+ const trueBody = stmt.trueBody ?? stmt.trueStatement;
260
+ if (trueBody) {
261
+ const trueSink = analyzeBranchBody(trueBody, trueState, zeroAddressNames);
262
+ if (trueSink)
263
+ return trueSink;
264
+ }
265
+ const falseBody = stmt.falseBody ?? stmt.falseStatement;
266
+ const falseState = cloneAnalysisState(state);
267
+ if (falseBody) {
268
+ const falseSink = analyzeBranchBody(falseBody, falseState, zeroAddressNames);
269
+ if (falseSink)
270
+ return falseSink;
271
+ }
272
+ mergeBranchStates(state, [trueState, falseState]);
273
+ return null;
274
+ }
275
+ function analyzeTryStatement(stmt, state, zeroAddressNames) {
276
+ const branchStates = [];
277
+ const tryBody = stmt.body;
278
+ if (tryBody) {
279
+ const tryState = cloneAnalysisState(state);
280
+ const trySink = analyzeBranchBody(tryBody, tryState, zeroAddressNames);
281
+ if (trySink)
282
+ return trySink;
283
+ branchStates.push(tryState);
284
+ }
285
+ const clauses = stmt.clauses || stmt.catchClauses || [];
286
+ for (const clause of clauses) {
287
+ const clauseBody = clause?.block || clause?.body;
288
+ if (!clauseBody)
289
+ continue;
290
+ const clauseState = cloneAnalysisState(state);
291
+ const clauseSink = analyzeBranchBody(clauseBody, clauseState, zeroAddressNames);
292
+ if (clauseSink)
293
+ return clauseSink;
294
+ branchStates.push(clauseState);
295
+ }
296
+ if (branchStates.length > 0)
297
+ mergeBranchStates(state, branchStates);
298
+ return null;
299
+ }
300
+ function analyzeBranchBody(body, state, zeroAddressNames) {
301
+ if (!body || typeof body !== 'object')
302
+ return null;
303
+ const stmts = getBlockStatements(body);
304
+ if (stmts.length > 0)
305
+ return analyzeBlockStatements(stmts, state, zeroAddressNames);
306
+ return analyzeStatement(body, state, zeroAddressNames);
307
+ }
308
+ function cloneAnalysisState(s) {
309
+ return {
310
+ tainted: new Set(s.tainted),
311
+ targetValidated: new Set(s.targetValidated),
312
+ selectorValidated: new Set(s.selectorValidated),
313
+ authorityGuarded: s.authorityGuarded,
314
+ };
315
+ }
316
+ function mergeBranchStates(target, branches) {
317
+ if (branches.length === 0)
318
+ return;
319
+ // Taint propagates conservatively (union) so later code sees any aliases learned in any branch.
320
+ for (const b of branches) {
321
+ for (const t of b.tainted)
322
+ target.tainted.add(t);
323
+ }
324
+ // Validations only persist past the join point if every branch established them.
325
+ target.targetValidated = intersectSets(branches.map(b => b.targetValidated));
326
+ target.selectorValidated = intersectSets(branches.map(b => b.selectorValidated));
327
+ target.authorityGuarded = branches.every(b => b.authorityGuarded);
328
+ }
329
+ function intersectSets(sets) {
330
+ if (sets.length === 0)
331
+ return new Set();
332
+ const [first, ...rest] = sets;
333
+ const out = new Set();
334
+ for (const v of first) {
335
+ if (rest.every(s => s.has(v)))
336
+ out.add(v);
337
+ }
338
+ return out;
339
+ }
340
+ function findUnvalidatedCallSink(stmt, tainted, targetValidated, selectorValidated) {
341
+ let found = null;
342
+ walk(stmt, node => {
343
+ if (found || !isNode(node, 'FunctionCall'))
344
+ return;
345
+ const call = lowLevelCall(node);
346
+ if (!call || (call.member !== 'call' && call.member !== 'delegatecall'))
347
+ return;
348
+ const dataArgs = call.args.filter(arg => !isEmptyCallData(arg));
349
+ if (dataArgs.length === 0)
350
+ return;
351
+ const targetTainted = referencesTainted(call.target, tainted);
352
+ const dataTainted = dataArgs.some(arg => referencesTainted(arg, tainted));
353
+ if (!targetTainted || !dataTainted)
354
+ return;
355
+ const targetRoot = rootIdentifier(call.target);
356
+ const targetChecked = !!targetRoot && targetValidated.has(targetRoot);
357
+ const dataChecked = dataArgs.some(arg => {
358
+ const root = rootIdentifier(arg);
359
+ return !!root && selectorValidated.has(root);
360
+ });
361
+ if (targetChecked && dataChecked)
362
+ return;
363
+ found = node;
364
+ });
365
+ return found;
366
+ }
367
+ function lowLevelCall(expr) {
368
+ if (!isNode(expr, 'FunctionCall'))
369
+ return null;
370
+ const args = getArguments(expr);
371
+ let callee = expr.expression;
372
+ if (isNode(callee, 'NameValueExpression') || isNode(callee, 'FunctionCallOptions')) {
373
+ callee = callee.expression;
374
+ }
375
+ if (!isNode(callee, 'MemberAccess'))
376
+ return null;
377
+ const member = String(callee.memberName || '').toLowerCase();
378
+ if (member !== 'call' && member !== 'delegatecall' && member !== 'staticcall')
379
+ return null;
380
+ return { member, target: callee.expression, args };
381
+ }
382
+ function collectTargetBoundedIdentifiers(expr, tainted, zeroAddressNames) {
383
+ const out = new Set();
384
+ walk(expr, node => {
385
+ for (const name of allowlistMembershipTargetRoots(node, tainted))
386
+ out.add(name);
387
+ if (!isBinaryOpNode(node))
388
+ return;
389
+ const op = String(node.operator || '');
390
+ if (op !== '==' && op !== '===')
391
+ return;
392
+ collectTrustedBoundaryComparison(getBinaryLeft(node), getBinaryRight(node), tainted, zeroAddressNames, out);
393
+ collectTrustedBoundaryComparison(getBinaryRight(node), getBinaryLeft(node), tainted, zeroAddressNames, out);
394
+ });
395
+ return out;
396
+ }
397
+ function collectTrustedBoundaryComparison(candidate, boundary, tainted, zeroAddressNames, out) {
398
+ const root = rootIdentifier(candidate);
399
+ if (!root || !tainted.has(root))
400
+ return;
401
+ if (isTrustedTargetBoundary(boundary, tainted, zeroAddressNames))
402
+ out.add(root);
403
+ }
404
+ function isTrustedTargetBoundary(expr, tainted, zeroAddressNames) {
405
+ if (!expr || typeof expr !== 'object')
406
+ return false;
407
+ if (isZeroAddressExpression(expr))
408
+ return false;
409
+ const path = accessPath(expr);
410
+ if (path && zeroAddressNames.has(path.split('.')[0]))
411
+ return false;
412
+ if (referencesTainted(expr, tainted))
413
+ return false;
414
+ if (isNonzeroAddressLiteralExpression(expr))
415
+ return true;
416
+ if (path && !isMsgSender(expr))
417
+ return true;
418
+ return false;
419
+ }
420
+ function allowlistMembershipTargetRoots(expr, tainted) {
421
+ const out = new Set();
422
+ const index = isNode(expr, 'IndexAccess') ? getIndexExpression(expr) : null;
423
+ const base = isNode(expr, 'IndexAccess') ? accessPath(expr.base || expr.baseExpression) : null;
424
+ if (index && base && nameLooksLikeAllowlistMapping(base)) {
425
+ const root = rootIdentifier(index);
426
+ if (root && tainted.has(root))
427
+ out.add(root);
428
+ }
429
+ return out;
430
+ }
431
+ // Tokens that, when they appear as a complete word inside the base
432
+ // identifier of an `IndexAccess`, count as "this looks like an
433
+ // allowlist mapping." Reviewed in the audit (review finding E2): the
434
+ // previous broad substring regex matched mid-word patterns like
435
+ // `routerInternal`, `targetingMode`, `destinationConfig`, which are
436
+ // not allowlists, suppressing legitimate findings on functions that
437
+ // happen to use those identifiers.
438
+ const ALLOWLIST_TOKENS = new Set([
439
+ 'allow', 'allowed', 'allows', 'allowlist', 'allowlisted',
440
+ 'approved', 'approvelist', 'approvelisted',
441
+ 'trusted', 'trustlist', 'trustlisted', 'whitelist', 'whitelisted',
442
+ 'permitted', 'permit',
443
+ 'authorized', 'authorised',
444
+ // Structural-name tokens: they're allowed as a word, but unlike the
445
+ // old substring regex they never match mid-identifier. So
446
+ // `targetAllowlist` matches via `targetallowlist` AND `target`, and
447
+ // `targetingMode` matches NEITHER (the token is `targeting`, not
448
+ // `target`). Without these tokens fixtures that name their
449
+ // allowlist mapping `targets` or `routes` would regress; see the
450
+ // regression fixture for both shapes.
451
+ 'target', 'targets', 'route', 'routes', 'router', 'routers',
452
+ 'destination', 'destinations',
453
+ ]);
454
+ function nameLooksLikeAllowlistMapping(name) {
455
+ // Split dotted access paths (e.g. `cfg.targets`) by segment, mirroring
456
+ // the authority-path handling in `isTrustedAuthorityExpression`. Without
457
+ // this, a member base like `cfg.targets[target]` arrives here as
458
+ // `cfg.targets`, which `tokenizeIdentifier` would emit as the single
459
+ // token `cfg.targets` — never matching the structural `targets` token.
460
+ for (const segment of name.split('.')) {
461
+ for (const token of tokenizeIdentifier(segment)) {
462
+ if (ALLOWLIST_TOKENS.has(token))
463
+ return true;
464
+ }
465
+ }
466
+ return false;
467
+ }
468
+ function collectSelectorCheckedData(expr) {
469
+ const out = new Set();
470
+ walk(expr, node => {
471
+ if (!isBinaryOpNode(node))
472
+ return;
473
+ const op = String(node.operator || '');
474
+ if (op !== '==' && op !== '!=' && op !== '===' && op !== '!==')
475
+ return;
476
+ for (const side of [getBinaryLeft(node), getBinaryRight(node)]) {
477
+ const checked = selectorDataRoot(side);
478
+ if (checked)
479
+ out.add(checked);
480
+ }
481
+ });
482
+ return out;
483
+ }
484
+ function selectorDataRoot(expr) {
485
+ if (!expr || typeof expr !== 'object')
486
+ return null;
487
+ if (isNode(expr, 'FunctionCall') && getCalleeName(expr) === 'bytes4') {
488
+ return rootIdentifier(getArguments(expr)[0]);
489
+ }
490
+ return null;
491
+ }
492
+ function collectZeroAddressConstants(contractNode) {
493
+ const out = new Set();
494
+ walk(contractNode, node => {
495
+ if (!isNode(node, 'VariableDeclaration') || !node.name)
496
+ return;
497
+ const initialValue = node.initialValue || node.value;
498
+ if (isZeroAddressExpression(initialValue))
499
+ out.add(String(node.name));
500
+ });
501
+ return out;
502
+ }
503
+ function isZeroAddressExpression(expr) {
504
+ if (!expr || typeof expr !== 'object')
505
+ return false;
506
+ if (isNode(expr, 'FunctionCall') && getCalleeName(expr).toLowerCase() === 'address') {
507
+ return getArguments(expr).some(isZeroLiteral);
508
+ }
509
+ return isZeroLiteral(expr);
510
+ }
511
+ function isNonzeroAddressLiteralExpression(expr) {
512
+ if (!expr || typeof expr !== 'object')
513
+ return false;
514
+ if (isNode(expr, 'FunctionCall') && getCalleeName(expr).toLowerCase() === 'address') {
515
+ return getArguments(expr).some(arg => isNumberishLiteral(arg) && !isZeroLiteral(arg));
516
+ }
517
+ return isNumberishLiteral(expr) && !isZeroLiteral(expr);
518
+ }
519
+ function isZeroLiteral(expr) {
520
+ if (!isNumberishLiteral(expr))
521
+ return false;
522
+ const value = literalValue(expr).toLowerCase();
523
+ return value === '0' || value === '0x0' || /^0x0+$/.test(value);
524
+ }
525
+ function isNumberishLiteral(expr) {
526
+ if (!expr || typeof expr !== 'object')
527
+ return false;
528
+ if (isNode(expr, 'NumberLiteral') || isNode(expr, 'HexNumber') || isNode(expr, 'HexLiteral'))
529
+ return true;
530
+ if (!isNode(expr, 'Literal'))
531
+ return false;
532
+ const value = literalValue(expr);
533
+ return /^0x[0-9a-f]+$/i.test(value) || /^[0-9]+$/.test(value);
534
+ }
535
+ function literalValue(expr) {
536
+ return String(expr?.number ?? expr?.hexValue ?? expr?.value ?? '');
537
+ }
538
+ function isRequireOrAssertStatement(stmt) {
539
+ if (!isNode(stmt, 'ExpressionStatement'))
540
+ return false;
541
+ const expr = stmt.expression;
542
+ if (!isNode(expr, 'FunctionCall'))
543
+ return false;
544
+ const callee = getCalleeName(expr);
545
+ return callee === 'require' || callee === 'assert';
546
+ }
547
+ function isAuthorityMsgSenderGuard(stmt, tainted) {
548
+ if (!isRequireOrAssertStatement(stmt))
549
+ return false;
550
+ const condition = getArguments(stmt.expression)[0];
551
+ return isMsgSenderAuthorityEquality(condition, tainted);
552
+ }
553
+ function isMsgSenderAuthorityEquality(expr, tainted) {
554
+ if (!expr || typeof expr !== 'object' || !isBinaryOpNode(expr))
555
+ return false;
556
+ const op = String(expr.operator || '');
557
+ if (op !== '==' && op !== '===')
558
+ return false;
559
+ const left = getBinaryLeft(expr);
560
+ const right = getBinaryRight(expr);
561
+ if (isMsgSender(left) && isTrustedAuthorityExpression(right, tainted))
562
+ return true;
563
+ if (isMsgSender(right) && isTrustedAuthorityExpression(left, tainted))
564
+ return true;
565
+ return false;
566
+ }
567
+ function isMsgSender(node) {
568
+ if (isNode(node, 'MemberAccess') &&
569
+ String(node.memberName || '') === 'sender' &&
570
+ isNode(node.expression, 'Identifier') &&
571
+ node.expression.name === 'msg')
572
+ return true;
573
+ if (isNode(node, 'FunctionCall')) {
574
+ const callee = node.expression;
575
+ return isNode(callee, 'Identifier') && callee.name === '_msgSender' && getArguments(node).length === 0;
576
+ }
577
+ return false;
578
+ }
579
+ // Authority-keyword tokens that, when matched as a complete word in an
580
+ // access path, count as a "trusted authority expression." Tokenised for
581
+ // the same reason as ALLOWLIST_TOKENS above (review finding E2): the
582
+ // previous substring regex `(owner|admin|authori|...)` matched
583
+ // `enrolled`, `unauthorized`, `roleplay`, etc. mid-identifier and over-
584
+ // suppressed the detector.
585
+ const AUTHORITY_TOKENS = new Set([
586
+ 'owner', 'owners',
587
+ 'admin', 'admins',
588
+ 'authority', 'authorised', 'authorized',
589
+ 'governance', 'governor', 'governors',
590
+ 'treasury',
591
+ 'multisig',
592
+ 'timelock',
593
+ 'accesscontrol',
594
+ 'custodian',
595
+ 'guardian', 'guardians',
596
+ 'council',
597
+ 'operator', 'operators',
598
+ 'trustee', 'trustees',
599
+ 'role', 'roles',
600
+ ]);
601
+ function segmentMatchesAuthorityKeyword(segment) {
602
+ const normalized = segment.replace(/^_+/, '').toLowerCase();
603
+ if (AUTHORITY_TOKENS.has(normalized))
604
+ return true;
605
+ const tokens = tokenizeIdentifier(segment);
606
+ for (const token of tokens) {
607
+ if (AUTHORITY_TOKENS.has(token))
608
+ return true;
609
+ }
610
+ const compoundAuthorityTokens = new Set(['multisig', 'timelock', 'accesscontrol']);
611
+ const suffixTokens = new Set(['wallet', 'controller', 'manager', 'admin', 'owner', 'guard', 'role']);
612
+ for (let i = 0; i < tokens.length; i++) {
613
+ const compound = tokens[i] + tokens[i + 1];
614
+ if (compoundAuthorityTokens.has(compound)) {
615
+ const next = tokens[i + 2];
616
+ if (!next || suffixTokens.has(next))
617
+ return true;
618
+ }
619
+ }
620
+ return false;
621
+ }
622
+ function isTrustedAuthorityExpression(expr, tainted) {
623
+ const path = accessPath(expr);
624
+ if (!path)
625
+ return false;
626
+ const root = path.split('.')[0];
627
+ if (tainted.has(root))
628
+ return false;
629
+ for (const segment of path.split('.')) {
630
+ if (segmentMatchesAuthorityKeyword(segment))
631
+ return true;
632
+ }
633
+ return false;
634
+ }
635
+ /**
636
+ * Split an identifier into lowercase tokens by camelCase / PascalCase
637
+ * boundaries and underscores, dropping any leading underscores
638
+ * (Solidity's idiomatic private-field marker).
639
+ *
640
+ * '_allowedTargets' → ['allowed', 'targets']
641
+ * 'router_internal' → ['router', 'internal']
642
+ * 'isAllowedRouter' → ['is', 'allowed', 'router']
643
+ * 'targetingMode' → ['targeting', 'mode'] (NOT 'target')
644
+ * 'unauthorizedAccess' → ['unauthorized', 'access']
645
+ *
646
+ * Used by both ALLOWLIST_TOKENS and AUTHORITY_TOKENS lookups so a
647
+ * substring like `auth` inside `unauthorizedAccess` doesn't masquerade
648
+ * as a trusted-authority match. Pure function — safe to memoise if
649
+ * profiling ever calls for it.
650
+ */
651
+ function tokenizeIdentifier(name) {
652
+ const stripped = name.replace(/^_+/, '');
653
+ const tokens = [];
654
+ for (const part of stripped.split(/_+/)) {
655
+ if (!part)
656
+ continue;
657
+ for (const camel of part.split(/(?=[A-Z])/)) {
658
+ if (camel)
659
+ tokens.push(camel.toLowerCase());
660
+ }
661
+ }
662
+ return tokens;
663
+ }
664
+ function hasRecognizedGuardModifier(fn) {
665
+ for (const modifier of fn.modifiers || []) {
666
+ const name = getModifierName(modifier).toLowerCase();
667
+ if (name === 'onlyowner' || name === 'onlyrole' || name === 'onlyadmin' ||
668
+ name === 'authorized' || name === 'onlyauthorized' || name.startsWith('only'))
669
+ return true;
670
+ }
671
+ return false;
672
+ }
673
+ function getModifierName(modifier) {
674
+ if (!modifier)
675
+ return '';
676
+ if (typeof modifier === 'string')
677
+ return modifier;
678
+ if (modifier.modifierName) {
679
+ const inner = modifier.modifierName;
680
+ if (typeof inner === 'string')
681
+ return inner;
682
+ if (inner.name)
683
+ return String(inner.name);
684
+ }
685
+ if (modifier.name) {
686
+ if (typeof modifier.name === 'string')
687
+ return modifier.name;
688
+ if (modifier.name.name)
689
+ return String(modifier.name.name);
690
+ if (modifier.name.namePath)
691
+ return String(modifier.name.namePath);
692
+ }
693
+ return '';
694
+ }
695
+ function getContractFunctions(contractNode) {
696
+ return childrenOf(contractNode).filter(child => isNode(child, 'FunctionDefinition'));
697
+ }
698
+ function getParameters(fn) {
699
+ if (Array.isArray(fn?.parameters))
700
+ return fn.parameters;
701
+ if (Array.isArray(fn?.parameters?.parameters))
702
+ return fn.parameters.parameters;
703
+ return [];
704
+ }
705
+ function getFunctionBody(node) {
706
+ return node?.body || null;
707
+ }
708
+ function getBlockStatements(body) {
709
+ if (!body || typeof body !== 'object')
710
+ return [];
711
+ return Array.isArray(body.statements) ? body.statements : [];
712
+ }
713
+ function isExternallyCallable(node) {
714
+ const kind = String(node.kind || node.functionKind || '').toLowerCase();
715
+ if (kind === 'constructor' || node.isConstructor)
716
+ return false;
717
+ const visibility = String(node.visibility || '').toLowerCase();
718
+ return visibility === 'public' || visibility === 'external' || kind === 'fallback' || kind === 'receive';
719
+ }
720
+ function referencesTainted(node, tainted) {
721
+ return walkAny(node, n => isNode(n, 'Identifier') && tainted.has(String(n.name || '')));
722
+ }
723
+ function collectAssignTargets(node) {
724
+ if (!node || typeof node !== 'object')
725
+ return [];
726
+ if (isNode(node, 'Identifier'))
727
+ return node.name ? [String(node.name)] : [];
728
+ if (isNode(node, 'TupleExpression')) {
729
+ return getArguments(node).flatMap((component) => collectAssignTargets(component));
730
+ }
731
+ return [];
732
+ }
733
+ function getVariableDeclarations(node) {
734
+ if (Array.isArray(node?.variables))
735
+ return node.variables;
736
+ if (Array.isArray(node?.declarations))
737
+ return node.declarations;
738
+ return [];
739
+ }
740
+ function isAssignmentNode(node) {
741
+ if (!node || typeof node !== 'object')
742
+ return false;
743
+ if (isNode(node, 'Assignment'))
744
+ return true;
745
+ if (!isNode(node, 'BinaryOperation'))
746
+ return false;
747
+ return String(node.operator || '').endsWith('=');
748
+ }
749
+ function isBinaryOpNode(node) {
750
+ return isNode(node, 'BinaryOperation') || isNode(node, 'Assignment');
751
+ }
752
+ function getBinaryLeft(node) {
753
+ return node?.left ?? node?.leftExpression ?? node?.leftHandSide;
754
+ }
755
+ function getBinaryRight(node) {
756
+ return node?.right ?? node?.rightExpression ?? node?.rightHandSide;
757
+ }
758
+ function getCalleeName(call) {
759
+ const expr = call?.expression;
760
+ if (!expr)
761
+ return '';
762
+ if (isNode(expr, 'Identifier'))
763
+ return expr.name || '';
764
+ if (isNode(expr, 'MemberAccess')) {
765
+ const prefix = expressionName(expr.expression);
766
+ return prefix ? `${prefix}.${expr.memberName || ''}` : expr.memberName || '';
767
+ }
768
+ if (isNode(expr, 'ElementaryTypeName'))
769
+ return expr.name || '';
770
+ if (isNode(expr, 'ElementaryTypeNameExpression'))
771
+ return expr.typeName?.name || '';
772
+ return '';
773
+ }
774
+ function expressionName(expr) {
775
+ if (!expr || typeof expr !== 'object')
776
+ return '';
777
+ if (isNode(expr, 'Identifier'))
778
+ return expr.name || '';
779
+ if (isNode(expr, 'MemberAccess')) {
780
+ const prefix = expressionName(expr.expression);
781
+ return prefix ? `${prefix}.${expr.memberName || ''}` : expr.memberName || '';
782
+ }
783
+ return '';
784
+ }
785
+ function rootIdentifier(expr) {
786
+ if (!expr || typeof expr !== 'object')
787
+ return null;
788
+ if (isNode(expr, 'Identifier'))
789
+ return expr.name || null;
790
+ if (isNode(expr, 'MemberAccess'))
791
+ return rootIdentifier(expr.expression);
792
+ if (isNode(expr, 'IndexAccess') || isNode(expr, 'IndexRangeAccess')) {
793
+ return rootIdentifier(expr.base || expr.baseExpression);
794
+ }
795
+ if (isNode(expr, 'FunctionCall'))
796
+ return rootIdentifier(getArguments(expr)[0]);
797
+ return null;
798
+ }
799
+ function getIndexExpression(expr) {
800
+ return expr?.index ?? expr?.indexExpression;
801
+ }
802
+ function accessPath(expr) {
803
+ if (!expr || typeof expr !== 'object')
804
+ return null;
805
+ if (isNode(expr, 'Identifier'))
806
+ return expr.name ? String(expr.name) : null;
807
+ if (isNode(expr, 'MemberAccess')) {
808
+ const base = accessPath(expr.expression);
809
+ return base && expr.memberName ? `${base}.${expr.memberName}` : null;
810
+ }
811
+ return null;
812
+ }
813
+ function isLiteral(expr) {
814
+ return isNode(expr, 'NumberLiteral') || isNode(expr, 'StringLiteral') ||
815
+ isNode(expr, 'BooleanLiteral') || isNode(expr, 'HexLiteral') ||
816
+ isNode(expr, 'Literal');
817
+ }
818
+ function isEmptyCallData(expr) {
819
+ return !expr ||
820
+ (isNode(expr, 'StringLiteral') && String(expr.value || '') === '') ||
821
+ (isNode(expr, 'HexLiteral') && String(expr.value || '') === '') ||
822
+ (isNode(expr, 'Literal') && String(expr.value || '') === '' &&
823
+ /string|hexstring/i.test(String(expr.kind || expr.typeDescriptions?.typeString || '')));
824
+ }
825
+ function getArguments(node) {
826
+ if (Array.isArray(node?.arguments))
827
+ return node.arguments;
828
+ if (Array.isArray(node?.arguments?.arguments))
829
+ return node.arguments.arguments;
830
+ if (Array.isArray(node?.components))
831
+ return node.components;
832
+ return [];
833
+ }
834
+ function getName(node) {
835
+ return node?.name || '';
836
+ }
837
+ function isNode(node, kind) {
838
+ return node?.type === kind || node?.nodeType === kind;
839
+ }
840
+ function walkContracts(node, visit) {
841
+ if (!node || typeof node !== 'object')
842
+ return;
843
+ if (isNode(node, 'ContractDefinition'))
844
+ visit(node);
845
+ for (const child of childrenOf(node))
846
+ walkContracts(child, visit);
847
+ }
848
+ function walk(node, visit) {
849
+ if (!node || typeof node !== 'object')
850
+ return;
851
+ visit(node);
852
+ for (const child of childrenOf(node))
853
+ walk(child, visit);
854
+ }
855
+ function walkAny(node, predicate) {
856
+ if (!node || typeof node !== 'object')
857
+ return false;
858
+ if (predicate(node))
859
+ return true;
860
+ for (const child of childrenOf(node)) {
861
+ if (walkAny(child, predicate))
862
+ return true;
863
+ }
864
+ return false;
865
+ }
866
+ function childrenOf(node) {
867
+ if (!node || typeof node !== 'object')
868
+ return [];
869
+ const children = [];
870
+ for (const [key, value] of Object.entries(node)) {
871
+ if (key === 'loc' || key === 'src' || key === 'range' || key === 'typeDescriptions' || key === 'id')
872
+ continue;
873
+ if (Array.isArray(value)) {
874
+ for (const item of value) {
875
+ if (item && typeof item === 'object')
876
+ children.push(item);
877
+ }
878
+ }
879
+ else if (value && typeof value === 'object') {
880
+ children.push(value);
881
+ }
882
+ }
883
+ return children;
884
+ }
885
+ function buildLineOffsets(sourceText) {
886
+ if (sourceText === undefined)
887
+ return undefined;
888
+ const lineOffsets = [0];
889
+ let byteOffset = 0;
890
+ for (const char of sourceText) {
891
+ byteOffset += Buffer.byteLength(char, 'utf8');
892
+ if (char === '\n')
893
+ lineOffsets.push(byteOffset);
894
+ }
895
+ return lineOffsets;
896
+ }
897
+ function getLoc(node, lineOffsets) {
898
+ if (node?.loc?.start)
899
+ return node.loc.start;
900
+ if (!node?.src || !lineOffsets)
901
+ return undefined;
902
+ const offset = Number(String(node.src).split(':')[0]);
903
+ if (!Number.isFinite(offset) || offset < 0)
904
+ return undefined;
905
+ let lineIndex = 0;
906
+ for (let i = 0; i < lineOffsets.length; i++) {
907
+ if (lineOffsets[i] <= offset)
908
+ lineIndex = i;
909
+ else
910
+ break;
911
+ }
912
+ return { line: lineIndex + 1, column: offset - lineOffsets[lineIndex] };
913
+ }
914
+ //# sourceMappingURL=lack-of-calldata-validation.js.map