@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,983 @@
1
+ "use strict";
2
+ /**
3
+ * Access-control detector (rule id `access-control`). Extracted from
4
+ * `src/index.ts` per roadmap item 1.1 slice 5/N. Public API surface
5
+ * is unchanged — `src/index.ts` re-exports `AccessControlDetector`
6
+ * so `createDefaultDetectorRegistry` and downstream consumers
7
+ * continue to see it at the same path.
8
+ *
9
+ * The detector flags externally callable privileged operations that
10
+ * lack a recognised access-control guard (modifier, msg.sender owner
11
+ * check, role-based check, etc.). See
12
+ * `docs/detectors/access-control.md` for the user-facing contract.
13
+ *
14
+ * Privileged-name recognition currently uses an inline regex
15
+ * (`/owner|admin|role|.../i`) — roadmap item 1.2 will centralise this
16
+ * predicate in `_common/access-control.ts:isPrivilegedIdentifier`.
17
+ * That refactor is intentionally a separate slice; this slice is
18
+ * mechanical extraction only.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.AccessControlDetector = void 0;
22
+ const access_control_1 = require("./_common/access-control");
23
+ const ast_1 = require("./_common/ast");
24
+ class AccessControlDetector {
25
+ id = 'access-control';
26
+ patternKey = 'access-control';
27
+ supportedAstKinds = ['parser', 'solc'];
28
+ findings = [];
29
+ currentFile = '';
30
+ currentContract = '';
31
+ currentContractNode = null;
32
+ currentFunction = '';
33
+ currentFunctionNode = null;
34
+ currentFunctionExternal = false;
35
+ currentFunctionGuarded = false;
36
+ guardSeenBeforeFirstPrivilegedOp = false;
37
+ guardSeenBeforeFirstPrivilegedOpStack = [];
38
+ currentPrivilegedOperation = null;
39
+ currentPrivilegedOperationHadPriorInlineGuard = false;
40
+ stateVariablesByContract = new Map();
41
+ functionNodesByContract = new Map();
42
+ privilegedFunctionSummaryCache = new Map();
43
+ activePrivilegedFunctionSummaries = new Set();
44
+ localVariables = new Set();
45
+ semantic = undefined;
46
+ setFile(file) {
47
+ this.currentFile = file;
48
+ this.findings = [];
49
+ this.currentContract = '';
50
+ this.currentContractNode = null;
51
+ this.resetFunctionState();
52
+ this.stateVariablesByContract.clear();
53
+ this.functionNodesByContract.clear();
54
+ this.privilegedFunctionSummaryCache.clear();
55
+ this.activePrivilegedFunctionSummaries.clear();
56
+ }
57
+ setSemanticModel(model) {
58
+ // SemanticModel adoption (roadmap 3.3 / H.3 — Slice 2b). The model
59
+ // lets this detector see inherited privileged surfaces across files.
60
+ // When undefined (single-file callers without semantic context), the
61
+ // detector behaves exactly as before: the inherited-walk in
62
+ // ContractDefinition_post is skipped.
63
+ this.semantic = model;
64
+ }
65
+ getFindings() {
66
+ return this.findings;
67
+ }
68
+ ContractDefinition(node) {
69
+ this.currentContract = node.name || '<anonymous>';
70
+ this.currentContractNode = node;
71
+ if (!this.stateVariablesByContract.has(this.currentContract)) {
72
+ this.stateVariablesByContract.set(this.currentContract, new Set());
73
+ }
74
+ this.registerContractFunctions(node);
75
+ this.mergeInheritedStateVariables(node);
76
+ }
77
+ ContractDefinition_post(node) {
78
+ // After visiting every locally-declared FunctionDefinition, also
79
+ // scan the contract's MRO for inherited externally-callable
80
+ // functions that the visitor walk doesn't reach (their AST lives in
81
+ // a base contract, possibly in another file). Findings emitted here
82
+ // anchor at the CURRENT contract's definition line so the operator
83
+ // can locate the vulnerable surface in the file under scan.
84
+ this.walkInheritedFunctions(node);
85
+ this.currentContract = '';
86
+ this.currentContractNode = null;
87
+ }
88
+ StateVariableDeclaration(node) {
89
+ const stateVariables = this.getCurrentStateVariables();
90
+ for (const variable of node.variables || []) {
91
+ if (variable?.name) {
92
+ stateVariables.add(variable.name);
93
+ }
94
+ }
95
+ }
96
+ FunctionDefinition(node) {
97
+ this.resetFunctionState();
98
+ this.currentFunctionNode = node;
99
+ this.currentFunction = node.name || this.getFunctionKind(node) || '<anonymous>';
100
+ this.currentFunctionExternal = this.isExternallyCallable(node);
101
+ this.currentFunctionGuarded = this.hasRecognizedGuardModifier(node);
102
+ for (const parameter of node.parameters || []) {
103
+ if (parameter?.name)
104
+ this.localVariables.add(parameter.name);
105
+ }
106
+ for (const parameter of node.returnParameters || []) {
107
+ if (parameter?.name)
108
+ this.localVariables.add(parameter.name);
109
+ }
110
+ if (node.body?.statements) {
111
+ this.analyzeParserNode(node.body);
112
+ this.emitCurrentFinding();
113
+ this.resetFunctionState();
114
+ }
115
+ }
116
+ FunctionDefinition_post(_node) {
117
+ this.emitCurrentFinding();
118
+ this.resetFunctionState();
119
+ }
120
+ walkInheritedFunctions(contractNode) {
121
+ // === SemanticModel adoption (roadmap 3.3 / H.3 — Slice 2b) ===
122
+ //
123
+ // Mirror of the Slice-2a logic from `missing-access-control.ts`,
124
+ // adapted to this detector's visitor-style + per-statement privileged-
125
+ // operation tracking. For each inherited externally-callable function
126
+ // not overridden locally, run the SAME privileged-op + guard analysis
127
+ // against the inherited body, then emit a finding anchored at the
128
+ // current (Derived) contract's definition line — that's the surface
129
+ // an external caller can reach.
130
+ if (!this.semantic)
131
+ return;
132
+ if (!contractNode)
133
+ return;
134
+ const myId = `${this.currentFile}::${this.currentContract}`;
135
+ const myInfo = this.semantic.contracts.get(myId);
136
+ if (!myInfo || myInfo.bases.length === 0)
137
+ return;
138
+ // Functions declared locally on this contract are already handled by
139
+ // the regular visitor walk; skip them to avoid double-emit when
140
+ // Derived overrides a Base critical function.
141
+ const localFnNames = new Set();
142
+ const members = Array.isArray(contractNode?.subNodes) ? contractNode.subNodes
143
+ : Array.isArray(contractNode?.nodes) ? contractNode.nodes
144
+ : [];
145
+ for (const m of members) {
146
+ if (m?.type === 'FunctionDefinition' && typeof m?.name === 'string') {
147
+ localFnNames.add(m.name);
148
+ }
149
+ }
150
+ for (const inheritedFn of this.semantic.inheritedFunctions(myId)) {
151
+ if (inheritedFn.contractId === myId)
152
+ continue;
153
+ if (!inheritedFn.name)
154
+ continue;
155
+ if (localFnNames.has(inheritedFn.name))
156
+ continue;
157
+ const fnNode = inheritedFn.node;
158
+ if (!fnNode)
159
+ continue;
160
+ if (!this.isExternallyCallable(fnNode))
161
+ continue;
162
+ const body = fnNode.body;
163
+ if (!body || !Array.isArray(body.statements))
164
+ continue;
165
+ const declarer = this.semantic.contracts.get(inheritedFn.contractId);
166
+ const declarerName = declarer?.name || '<unknown>';
167
+ this.resetFunctionState();
168
+ this.currentFunctionNode = fnNode;
169
+ this.currentFunction = inheritedFn.name;
170
+ this.currentFunctionExternal = true;
171
+ this.currentFunctionGuarded = this.hasRecognizedGuardModifier(fnNode);
172
+ for (const parameter of fnNode.parameters || []) {
173
+ if (parameter?.name)
174
+ this.localVariables.add(parameter.name);
175
+ }
176
+ for (const parameter of fnNode.returnParameters || []) {
177
+ if (parameter?.name)
178
+ this.localVariables.add(parameter.name);
179
+ }
180
+ this.analyzeParserNode(body);
181
+ this.emitInheritedFinding(declarerName, contractNode);
182
+ this.resetFunctionState();
183
+ }
184
+ }
185
+ emitInheritedFinding(declarerName, anchorContractNode) {
186
+ if (!(this.currentFunctionExternal &&
187
+ this.currentPrivilegedOperation &&
188
+ !this.currentFunctionGuarded &&
189
+ !this.currentPrivilegedOperationHadPriorInlineGuard))
190
+ return;
191
+ // Anchor at the current (Derived) contract's definition line so the
192
+ // finding points at a surface in the file under scan, not at Base.sol
193
+ // (which fires separately via its own local walk when both files are
194
+ // in the scan). Falls back to line 1 column 0 defensively — line 0
195
+ // is banned per `docs/findings-taxonomy.md` and a planned test gate.
196
+ const anchorLoc = anchorContractNode?.loc?.start;
197
+ const line = anchorLoc?.line || 1;
198
+ const column = anchorLoc?.column || 0;
199
+ const operation = this.currentPrivilegedOperation;
200
+ const { rationale, suggestedFix } = this.describePrivilegedOperation(operation);
201
+ const fnName = this.currentFunction;
202
+ this.findings.push({
203
+ file: this.currentFile,
204
+ contract: this.currentContract,
205
+ 'function': fnName,
206
+ line,
207
+ endLine: line,
208
+ column,
209
+ pattern: 'access-control',
210
+ confidence: 'high',
211
+ ruleId: 'access-control',
212
+ severity: 'high',
213
+ message: `Externally callable privileged operation in '${fnName}' inherited from ${declarerName} ` +
214
+ `has no recognized access-control guard; override the inherited function in ${this.currentContract} ` +
215
+ `with onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an explicit msg.sender owner guard, ` +
216
+ `or restrict access in ${declarerName}.`,
217
+ rationale,
218
+ suggestedFix,
219
+ contractName: this.currentContract,
220
+ functionName: fnName,
221
+ sourceLocation: { line, column },
222
+ stateMutationNode: operation.expression || operation,
223
+ // Discriminator for computeFindingId: all inherited findings on a
224
+ // single derived contract share (file, line, ruleId) because
225
+ // they're anchored at the contract definition line. Without this,
226
+ // a derived contract inheriting two unguarded critical functions
227
+ // would emit two findings with identical findingId and the
228
+ // downstream dedup engine would silently drop one. Pattern matches
229
+ // missing-access-control.ts's Slice-2a discriminator.
230
+ instance_key: `${this.currentContract}::${fnName}`,
231
+ findingId: '',
232
+ contractHash: ''
233
+ });
234
+ }
235
+ emitCurrentFinding() {
236
+ if (this.currentFunctionExternal &&
237
+ this.currentPrivilegedOperation &&
238
+ !this.currentFunctionGuarded &&
239
+ !this.currentPrivilegedOperationHadPriorInlineGuard) {
240
+ const operation = this.currentPrivilegedOperation;
241
+ // tryLoc-with-floor + two-arg fallback: operation as primary,
242
+ // enclosing function as fallback (covers solc-walker loc=0 cases
243
+ // and synthesised operation nodes).
244
+ const loc = (0, ast_1.tryLoc)(operation, this.currentFunctionNode) ?? { line: 0, endLine: 0, column: 0 };
245
+ const { line, endLine, column } = loc;
246
+ const { rationale, suggestedFix } = this.describePrivilegedOperation(operation);
247
+ this.findings.push({
248
+ file: this.currentFile,
249
+ contract: this.currentContract,
250
+ 'function': this.currentFunction,
251
+ line,
252
+ endLine,
253
+ column,
254
+ pattern: 'access-control',
255
+ confidence: 'high',
256
+ ruleId: 'access-control',
257
+ severity: 'high',
258
+ message: `Externally callable privileged operation in '${this.currentFunction}' has no recognized access-control guard; add onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an explicit msg.sender owner guard.`,
259
+ rationale,
260
+ suggestedFix,
261
+ contractName: this.currentContract,
262
+ functionName: this.currentFunction,
263
+ sourceLocation: { line, column },
264
+ stateMutationNode: operation.expression || operation,
265
+ findingId: '',
266
+ contractHash: ''
267
+ });
268
+ }
269
+ }
270
+ VariableDeclarationStatement(node) {
271
+ for (const variable of node.variables || []) {
272
+ if (variable?.name)
273
+ this.localVariables.add(variable.name);
274
+ }
275
+ if (!this.currentFunctionExternal)
276
+ return;
277
+ this.recordPrivilegedOperation(node.initialValue, node);
278
+ if (!this.currentPrivilegedOperation && this.containsRecognizedInlineGuard(node.initialValue)) {
279
+ this.guardSeenBeforeFirstPrivilegedOp = true;
280
+ }
281
+ }
282
+ ExpressionStatement(node) {
283
+ if (!this.currentFunctionExternal)
284
+ return;
285
+ this.recordPrivilegedOperation(node.expression, node);
286
+ if (!this.currentPrivilegedOperation && this.containsRecognizedInlineGuard(node.expression)) {
287
+ this.guardSeenBeforeFirstPrivilegedOp = true;
288
+ }
289
+ }
290
+ resetFunctionState() {
291
+ this.currentFunction = '';
292
+ this.currentFunctionNode = null;
293
+ this.currentFunctionExternal = false;
294
+ this.currentFunctionGuarded = false;
295
+ this.guardSeenBeforeFirstPrivilegedOp = false;
296
+ this.guardSeenBeforeFirstPrivilegedOpStack = [];
297
+ this.currentPrivilegedOperation = null;
298
+ this.currentPrivilegedOperationHadPriorInlineGuard = false;
299
+ this.localVariables.clear();
300
+ }
301
+ enterNestedStatementBody() {
302
+ this.guardSeenBeforeFirstPrivilegedOpStack.push(this.guardSeenBeforeFirstPrivilegedOp);
303
+ }
304
+ exitNestedStatementBody() {
305
+ const previous = this.guardSeenBeforeFirstPrivilegedOpStack.pop();
306
+ if (previous !== undefined) {
307
+ this.guardSeenBeforeFirstPrivilegedOp = previous;
308
+ }
309
+ }
310
+ analyzeNestedParserNode(node) {
311
+ this.enterNestedStatementBody();
312
+ try {
313
+ this.analyzeParserNode(node);
314
+ }
315
+ finally {
316
+ this.exitNestedStatementBody();
317
+ }
318
+ }
319
+ analyzeParserNode(node) {
320
+ if (!node || typeof node !== 'object')
321
+ return;
322
+ if (node.type === 'VariableDeclarationStatement') {
323
+ this.VariableDeclarationStatement(node);
324
+ return;
325
+ }
326
+ if (node.type === 'ExpressionStatement') {
327
+ this.ExpressionStatement(node);
328
+ return;
329
+ }
330
+ if (node.type === 'IfStatement') {
331
+ this.analyzeParserNode(node.condition);
332
+ this.analyzeNestedParserNode(node.trueBody);
333
+ this.analyzeNestedParserNode(node.falseBody);
334
+ return;
335
+ }
336
+ if (node.type === 'ForStatement') {
337
+ this.analyzeParserNode(node.initializationExpression || node.initExpression);
338
+ this.analyzeParserNode(node.condition || node.conditionExpression);
339
+ this.analyzeParserNode(node.loopExpression);
340
+ this.analyzeNestedParserNode(node.body);
341
+ return;
342
+ }
343
+ if (node.type === 'WhileStatement' || node.type === 'DoWhileStatement') {
344
+ this.analyzeParserNode(node.condition);
345
+ this.analyzeNestedParserNode(node.body);
346
+ return;
347
+ }
348
+ if (node.type === 'UncheckedStatement') {
349
+ this.analyzeNestedParserNode(node.body || node.block);
350
+ return;
351
+ }
352
+ for (const key of [
353
+ 'statements',
354
+ 'body',
355
+ 'trueBody',
356
+ 'falseBody',
357
+ 'expression',
358
+ 'left',
359
+ 'right',
360
+ 'subExpression',
361
+ 'initialValue',
362
+ 'condition',
363
+ 'conditionExpression',
364
+ 'initializationExpression',
365
+ 'initExpression',
366
+ 'loopExpression',
367
+ 'block'
368
+ ]) {
369
+ const value = node[key];
370
+ if (Array.isArray(value)) {
371
+ for (const item of value)
372
+ this.analyzeParserNode(item);
373
+ }
374
+ else if ((key === 'body' && node.type !== 'Block') || key === 'block') {
375
+ this.analyzeNestedParserNode(value);
376
+ }
377
+ else {
378
+ this.analyzeParserNode(value);
379
+ }
380
+ }
381
+ }
382
+ getCurrentStateVariables() {
383
+ if (!this.stateVariablesByContract.has(this.currentContract)) {
384
+ this.stateVariablesByContract.set(this.currentContract, new Set());
385
+ }
386
+ return this.stateVariablesByContract.get(this.currentContract);
387
+ }
388
+ registerContractFunctions(node) {
389
+ const functions = new Map();
390
+ for (const member of this.getContractMembers(node)) {
391
+ if (member?.type === 'FunctionDefinition' && member.name) {
392
+ functions.set(member.name, member);
393
+ }
394
+ }
395
+ this.functionNodesByContract.set(this.currentContract, functions);
396
+ }
397
+ getContractMembers(node) {
398
+ if (Array.isArray(node?.subNodes))
399
+ return node.subNodes;
400
+ if (Array.isArray(node?.nodes))
401
+ return node.nodes;
402
+ return [];
403
+ }
404
+ mergeInheritedStateVariables(node) {
405
+ const stateVariables = this.getCurrentStateVariables();
406
+ for (const baseName of this.getBaseContractNames(node)) {
407
+ const baseStateVariables = this.stateVariablesByContract.get(baseName);
408
+ if (!baseStateVariables)
409
+ continue;
410
+ for (const variableName of baseStateVariables) {
411
+ stateVariables.add(variableName);
412
+ }
413
+ }
414
+ }
415
+ getBaseContractNames(node) {
416
+ const names = [];
417
+ for (const base of node.baseContracts || []) {
418
+ const name = this.getNodeName(base.baseName || base);
419
+ if (name)
420
+ names.push(name);
421
+ }
422
+ return names;
423
+ }
424
+ isExternallyCallable(node) {
425
+ const kind = this.getFunctionKind(node).toLowerCase();
426
+ if (kind === 'constructor')
427
+ return false;
428
+ const visibility = String(node.visibility || '').toLowerCase();
429
+ if (visibility === 'public' || visibility === 'external' || kind === 'fallback' || kind === 'receive') {
430
+ return true;
431
+ }
432
+ if ((!visibility || visibility === 'default') && !!node.body) {
433
+ // A no-visibility function whose name matches the enclosing contract is
434
+ // an old-style (pre-0.5) constructor — it runs once at deployment and is
435
+ // not externally callable post-deploy. Treat it as the constructor, not
436
+ // an entry point, so seeding owner state in it is not a false finding.
437
+ const name = String(node.name || '');
438
+ if (name && name === this.currentContract)
439
+ return false;
440
+ // Default-visibility functions only occur in pre-0.5 source. The
441
+ // detector recognises only onlyOwner/onlyRole guard modifiers by
442
+ // name, so a default-visibility function carrying any other custom
443
+ // guard modifier would otherwise read as unguarded and produce a
444
+ // false positive. The genuine Parity-shape unguarded surface has no
445
+ // modifier at all — restrict the default-visibility entry surface to
446
+ // modifier-free functions. Explicit public/external functions are
447
+ // unaffected by this carve-out.
448
+ if (Array.isArray(node.modifiers) && node.modifiers.length > 0)
449
+ return false;
450
+ return true;
451
+ }
452
+ return false;
453
+ }
454
+ getFunctionKind(node) {
455
+ if (node.isConstructor)
456
+ return 'constructor';
457
+ return node.kind || node.functionKind || '';
458
+ }
459
+ hasRecognizedGuardModifier(node) {
460
+ for (const modifier of node.modifiers || []) {
461
+ const name = this.getNodeName(modifier);
462
+ if (this.isRecognizedGuardName(name))
463
+ return true;
464
+ }
465
+ return false;
466
+ }
467
+ isRecognizedGuardName(name) {
468
+ const normalized = name.toLowerCase();
469
+ return normalized === 'onlyowner' ||
470
+ normalized === 'onlyrole';
471
+ }
472
+ containsRecognizedInlineGuard(expr) {
473
+ if (!expr || typeof expr !== 'object')
474
+ return false;
475
+ if (this.isRecognizedInlineGuard(expr))
476
+ return true;
477
+ for (const child of this.childNodes(expr)) {
478
+ if (this.containsRecognizedInlineGuard(child))
479
+ return true;
480
+ }
481
+ return false;
482
+ }
483
+ isRecognizedInlineGuard(expr) {
484
+ if (!expr || expr.type !== 'FunctionCall')
485
+ return false;
486
+ const callee = this.getCallName(expr.expression).toLowerCase();
487
+ const args = expr.arguments || [];
488
+ if (callee === 'require' || callee === 'assert') {
489
+ return args.some((arg) => this.isAuthPredicate(arg));
490
+ }
491
+ return callee === '_checkrole' || callee === 'checkrole' || callee.endsWith('._checkrole');
492
+ }
493
+ isAuthPredicate(expr) {
494
+ if (!expr)
495
+ return false;
496
+ if (expr.type === 'BinaryOperation') {
497
+ const left = expr.left || expr.leftExpression;
498
+ const right = expr.right || expr.rightExpression;
499
+ if (expr.operator === '&&') {
500
+ return this.isAuthPredicate(left) || this.isAuthPredicate(right);
501
+ }
502
+ if (expr.operator === '||') {
503
+ return this.isAuthPredicate(left) && this.isAuthPredicate(right);
504
+ }
505
+ }
506
+ return this.isMsgSenderEqualityLeaf(expr) ||
507
+ this.isHasRoleCallLeaf(expr) ||
508
+ this.isRenounceRoleSelfCheckLeaf(expr);
509
+ }
510
+ isMsgSenderEqualityLeaf(expr) {
511
+ if (!expr || expr.type !== 'BinaryOperation')
512
+ return false;
513
+ if (expr.operator !== '==' && expr.operator !== '===')
514
+ return false;
515
+ if (this.isMsgSender(expr.left) && !this.isMsgSender(expr.right)) {
516
+ return this.isAuthorizationTarget(expr.right);
517
+ }
518
+ if (this.isMsgSender(expr.right) && !this.isMsgSender(expr.left)) {
519
+ return this.isAuthorizationTarget(expr.left);
520
+ }
521
+ return false;
522
+ }
523
+ isAuthorizationTarget(expr) {
524
+ if (!expr)
525
+ return false;
526
+ if (this.isPrivilegedStateReference(expr))
527
+ return true;
528
+ if (expr.type === 'FunctionCall' &&
529
+ (expr.arguments || []).length === 0 &&
530
+ expr.expression?.type === 'Identifier') {
531
+ const callee = expr.expression.name || '';
532
+ if (callee && !this.localVariables.has(callee) && this.isPrivilegedName(callee)) {
533
+ return true;
534
+ }
535
+ }
536
+ return false;
537
+ }
538
+ isHasRoleCallLeaf(expr) {
539
+ if (!expr || expr.type !== 'FunctionCall')
540
+ return false;
541
+ const callee = this.getCallName(expr.expression).toLowerCase();
542
+ if (callee !== 'hasrole' && !callee.endsWith('.hasrole'))
543
+ return false;
544
+ return (expr.arguments || []).some((arg) => this.isMsgSender(arg));
545
+ }
546
+ isRenounceRoleSelfCheckLeaf(expr) {
547
+ if (this.currentFunction.toLowerCase() !== 'renouncerole')
548
+ return false;
549
+ if (!expr || expr.type !== 'BinaryOperation')
550
+ return false;
551
+ if (expr.operator !== '==' && expr.operator !== '===')
552
+ return false;
553
+ const left = expr.left || expr.leftExpression;
554
+ const right = expr.right || expr.rightExpression;
555
+ return (this.isMsgSender(left) && this.isAccountReference(right)) ||
556
+ (this.isMsgSender(right) && this.isAccountReference(left));
557
+ }
558
+ isAccountReference(expr) {
559
+ return expr?.type === 'Identifier' && String(expr.name || '').toLowerCase() === 'account';
560
+ }
561
+ isMsgSender(expr) {
562
+ return (0, access_control_1.isCallerIdentityExpression)(expr);
563
+ }
564
+ recordPrivilegedOperation(expr, statementNode) {
565
+ if (this.currentPrivilegedOperation || !expr)
566
+ return;
567
+ if (this.containsPrivilegedOperation(expr)) {
568
+ this.currentPrivilegedOperation = statementNode || expr;
569
+ this.currentPrivilegedOperationHadPriorInlineGuard = this.guardSeenBeforeFirstPrivilegedOp;
570
+ }
571
+ }
572
+ describePrivilegedOperation(operation) {
573
+ const expr = operation?.expression || operation;
574
+ const privilegedCall = this.findPrivilegedCall(expr);
575
+ if (privilegedCall) {
576
+ const callee = this.getCallName(privilegedCall.expression).toLowerCase();
577
+ if (callee === 'grantrole' || callee.endsWith('.grantrole')) {
578
+ return {
579
+ rationale: 'Unguarded role grant: an externally callable function can grant role authority without a recognized owner or role-admin guard.',
580
+ suggestedFix: 'Add onlyRole(DEFAULT_ADMIN_ROLE) or an equivalent role-admin check before granting roles.'
581
+ };
582
+ }
583
+ if (callee === 'renounceownership' || callee.endsWith('.renounceownership')) {
584
+ return {
585
+ rationale: 'Unguarded ownership removal: an externally callable function can clear ownership without recognized owner or admin authorization.',
586
+ suggestedFix: 'Restrict ownership removal to the current owner or admin with onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an equivalent msg.sender owner guard.'
587
+ };
588
+ }
589
+ if (callee === 'transferownership' || callee.endsWith('.transferownership')) {
590
+ return {
591
+ rationale: 'Unguarded ownership handoff: an externally callable function can transfer ownership without recognized current-owner or admin authorization.',
592
+ suggestedFix: 'Require current owner or admin authorization before transferring ownership.'
593
+ };
594
+ }
595
+ }
596
+ const assignedRoot = this.findPrivilegedAssignmentRoot(expr);
597
+ const functionName = this.currentFunction.toLowerCase();
598
+ if (functionName === 'grantrole') {
599
+ return {
600
+ rationale: 'Unguarded role grant: an externally callable role-grant API mutates role authority state without a recognized role-admin guard.',
601
+ suggestedFix: 'Add onlyRole(DEFAULT_ADMIN_ROLE) or an equivalent role-admin check before granting roles.'
602
+ };
603
+ }
604
+ if (functionName === 'renounceownership') {
605
+ return {
606
+ rationale: 'Unguarded ownership removal: an externally callable ownership API clears ownership without recognized owner or admin authorization.',
607
+ suggestedFix: 'Restrict ownership removal to the current owner or admin with onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an equivalent msg.sender owner guard.'
608
+ };
609
+ }
610
+ if (functionName === 'transferownership') {
611
+ return {
612
+ rationale: 'Unguarded ownership handoff: an externally callable ownership-transfer API updates owner authority without recognized current-owner or admin authorization.',
613
+ suggestedFix: 'Require current owner or admin authorization before transferring ownership.'
614
+ };
615
+ }
616
+ if (/role/i.test(assignedRoot)) {
617
+ return {
618
+ rationale: 'Unguarded role grant: an externally callable function mutates role authority state without a recognized owner or role-admin guard.',
619
+ suggestedFix: 'Add onlyRole(DEFAULT_ADMIN_ROLE) or an equivalent role-admin check before mutating role state.'
620
+ };
621
+ }
622
+ if (/owner/i.test(assignedRoot) || functionName.includes('ownership')) {
623
+ return {
624
+ rationale: 'Unguarded owner/authority state mutation: an externally callable function updates ownership state without a recognized owner or role guard.',
625
+ suggestedFix: 'Add onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an equivalent msg.sender owner guard before the authority mutation.'
626
+ };
627
+ }
628
+ if (/fee|treasury|admin|guardian|operator|paused|pause|timelock|governor/i.test(assignedRoot)) {
629
+ return {
630
+ rationale: 'Unguarded privileged configuration mutation: an externally callable function updates privileged configuration without recognized owner or admin authorization.',
631
+ suggestedFix: 'Add owner or admin authorization, such as onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an equivalent msg.sender owner guard.'
632
+ };
633
+ }
634
+ return {
635
+ rationale: 'Unguarded privileged operation: an externally callable function performs an authority-sensitive action without a recognized access-control guard.',
636
+ suggestedFix: 'Add onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an equivalent msg.sender owner guard before the privileged operation.'
637
+ };
638
+ }
639
+ findPrivilegedCall(expr) {
640
+ if (!expr || typeof expr !== 'object')
641
+ return null;
642
+ if (expr.type === 'FunctionCall') {
643
+ const callee = this.getCallName(expr.expression).toLowerCase();
644
+ if (callee === 'transferownership' ||
645
+ callee.endsWith('.transferownership') ||
646
+ callee === 'grantrole' ||
647
+ callee.endsWith('.grantrole') ||
648
+ callee === 'renounceownership' ||
649
+ callee.endsWith('.renounceownership')) {
650
+ return expr;
651
+ }
652
+ }
653
+ for (const child of this.childNodes(expr)) {
654
+ const found = this.findPrivilegedCall(child);
655
+ if (found)
656
+ return found;
657
+ }
658
+ return null;
659
+ }
660
+ findPrivilegedAssignmentRoot(expr) {
661
+ if (!expr || typeof expr !== 'object')
662
+ return '';
663
+ if (expr.type === 'BinaryOperation' && this.isAssignmentOperator(expr.operator)) {
664
+ const root = this.getReferenceRoot(expr.left);
665
+ if (root && this.isPrivilegedName(root) && !this.localVariables.has(root))
666
+ return root;
667
+ }
668
+ if (expr.type === 'UnaryOperation' && (expr.operator === '++' || expr.operator === '--')) {
669
+ const root = this.getReferenceRoot(expr.subExpression);
670
+ if (root && this.isPrivilegedName(root) && !this.localVariables.has(root))
671
+ return root;
672
+ }
673
+ for (const child of this.childNodes(expr)) {
674
+ const root = this.findPrivilegedAssignmentRoot(child);
675
+ if (root)
676
+ return root;
677
+ }
678
+ return '';
679
+ }
680
+ containsPrivilegedOperation(expr) {
681
+ if (!expr || typeof expr !== 'object')
682
+ return false;
683
+ if (this.isPrivilegedOperation(expr))
684
+ return true;
685
+ for (const child of this.childNodes(expr)) {
686
+ if (this.containsPrivilegedOperation(child))
687
+ return true;
688
+ }
689
+ return false;
690
+ }
691
+ isPrivilegedOperation(expr) {
692
+ if (expr.type === 'BinaryOperation' && this.isAssignmentOperator(expr.operator)) {
693
+ return this.isPrivilegedStateReference(expr.left);
694
+ }
695
+ if (expr.type === 'UnaryOperation' && (expr.operator === '++' || expr.operator === '--')) {
696
+ return this.isPrivilegedStateReference(expr.subExpression);
697
+ }
698
+ if (expr.type === 'FunctionCall') {
699
+ if (this.isSameContractPrivilegedHelperCall(expr))
700
+ return true;
701
+ if (this.isValueTransfer(expr))
702
+ return this.isPrivilegedFundTransferFunction();
703
+ const callee = this.getCallName(expr.expression).toLowerCase();
704
+ return callee === 'selfdestruct' ||
705
+ callee === 'suicide' ||
706
+ callee.endsWith('.transferownership') ||
707
+ callee === 'transferownership' ||
708
+ callee.endsWith('.grantrole') ||
709
+ callee === 'grantrole' ||
710
+ callee === '_grantrole' ||
711
+ callee.endsWith('.revokerole') ||
712
+ callee === 'revokerole' ||
713
+ callee === '_revokerole' ||
714
+ callee.endsWith('.renounceownership') ||
715
+ callee === 'renounceownership' ||
716
+ callee === '_setroleadmin';
717
+ }
718
+ return false;
719
+ }
720
+ isSameContractPrivilegedHelperCall(expr) {
721
+ const callee = this.getCallName(expr.expression);
722
+ if (!callee || callee.includes('.'))
723
+ return false;
724
+ if (callee === this.currentFunction)
725
+ return false;
726
+ if (!this.isAuthorityHelperPropagationCandidate(this.currentFunction, callee))
727
+ return false;
728
+ const functions = this.functionNodesByContract.get(this.currentContract);
729
+ const target = functions?.get(callee);
730
+ if (!target?.body)
731
+ return false;
732
+ // A helper carrying any modifier is very likely guarded by it — the
733
+ // Parity propagation shape (initWallet -> initMultiowned) flows
734
+ // through modifier-free helpers. Propagating an unguarded-operation
735
+ // verdict through a modifier-guarded helper produces a false
736
+ // positive: the helper's own modifier already restricts the caller.
737
+ if (Array.isArray(target.modifiers) && target.modifiers.length > 0)
738
+ return false;
739
+ return this.functionMutatesPrivilegedState(callee, target);
740
+ }
741
+ isAuthorityHelperPropagationCandidate(entryName, helperName) {
742
+ return this.isAuthoritySetupOrManagementName(entryName) &&
743
+ this.isAuthoritySetupOrManagementName(helperName);
744
+ }
745
+ isAuthoritySetupOrManagementName(name) {
746
+ // Intentionally narrow: an authority-management name must mention an
747
+ // ownership / role concept. A bare `init*` prefix is NOT sufficient —
748
+ // most `init*` functions seed unrelated configuration, and treating
749
+ // every one as an authority entry point inflates the access-control
750
+ // false-positive rate (the Parity propagation path only needs the
751
+ // ownership-named init helpers: `initWallet`, `initMultiowned`, ...).
752
+ const normalized = String(name || '').toLowerCase();
753
+ return /(?:owner|admin|role|multiowned|authority|permission|wallet)/.test(normalized);
754
+ }
755
+ functionMutatesPrivilegedState(name, node) {
756
+ const cacheKey = `${this.currentContract}::${name}`;
757
+ const cached = this.privilegedFunctionSummaryCache.get(cacheKey);
758
+ if (cached !== undefined)
759
+ return cached;
760
+ if (this.activePrivilegedFunctionSummaries.has(cacheKey))
761
+ return false;
762
+ this.activePrivilegedFunctionSummaries.add(cacheKey);
763
+ const savedLocalVariables = this.localVariables;
764
+ this.localVariables = this.collectFunctionLocalVariables(node);
765
+ try {
766
+ const result = this.containsPrivilegedOperationInSubtree(node.body);
767
+ this.privilegedFunctionSummaryCache.set(cacheKey, result);
768
+ return result;
769
+ }
770
+ finally {
771
+ this.localVariables = savedLocalVariables;
772
+ this.activePrivilegedFunctionSummaries.delete(cacheKey);
773
+ }
774
+ }
775
+ containsPrivilegedOperationInSubtree(node) {
776
+ if (!node || typeof node !== 'object')
777
+ return false;
778
+ if (this.isPrivilegedOperation(node))
779
+ return true;
780
+ for (const key of [
781
+ 'statements',
782
+ 'body',
783
+ 'trueBody',
784
+ 'falseBody',
785
+ 'expression',
786
+ 'left',
787
+ 'right',
788
+ 'subExpression',
789
+ 'base',
790
+ 'index',
791
+ 'initialValue',
792
+ 'condition',
793
+ 'conditionExpression',
794
+ 'initializationExpression',
795
+ 'initExpression',
796
+ 'loopExpression',
797
+ 'block',
798
+ 'arguments',
799
+ 'components'
800
+ ]) {
801
+ const value = node[key];
802
+ if (Array.isArray(value)) {
803
+ for (const item of value) {
804
+ if (this.containsPrivilegedOperationInSubtree(item))
805
+ return true;
806
+ }
807
+ }
808
+ else if (this.containsPrivilegedOperationInSubtree(value)) {
809
+ return true;
810
+ }
811
+ }
812
+ return false;
813
+ }
814
+ collectFunctionLocalVariables(node) {
815
+ const locals = new Set();
816
+ for (const parameter of node.parameters || []) {
817
+ if (parameter?.name)
818
+ locals.add(parameter.name);
819
+ }
820
+ for (const parameter of node.returnParameters || []) {
821
+ if (parameter?.name)
822
+ locals.add(parameter.name);
823
+ }
824
+ this.collectLocalVariableDeclarations(node.body, locals);
825
+ return locals;
826
+ }
827
+ collectLocalVariableDeclarations(node, locals) {
828
+ if (!node || typeof node !== 'object')
829
+ return;
830
+ if (node.type === 'VariableDeclarationStatement') {
831
+ for (const variable of node.variables || []) {
832
+ if (variable?.name)
833
+ locals.add(variable.name);
834
+ }
835
+ }
836
+ for (const key of [
837
+ 'statements',
838
+ 'body',
839
+ 'trueBody',
840
+ 'falseBody',
841
+ 'expression',
842
+ 'left',
843
+ 'right',
844
+ 'subExpression',
845
+ 'initialValue',
846
+ 'condition',
847
+ 'conditionExpression',
848
+ 'initializationExpression',
849
+ 'initExpression',
850
+ 'loopExpression',
851
+ 'block'
852
+ ]) {
853
+ const value = node[key];
854
+ if (Array.isArray(value)) {
855
+ for (const item of value)
856
+ this.collectLocalVariableDeclarations(item, locals);
857
+ }
858
+ else {
859
+ this.collectLocalVariableDeclarations(value, locals);
860
+ }
861
+ }
862
+ }
863
+ isAssignmentOperator(operator) {
864
+ return ['=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=', '>>=', '>>>='].includes(operator);
865
+ }
866
+ isPrivilegedStateReference(expr) {
867
+ const root = this.getReferenceRoot(expr);
868
+ if (!root || this.localVariables.has(root))
869
+ return false;
870
+ return this.isPrivilegedName(root);
871
+ }
872
+ getReferenceRoot(expr) {
873
+ if (!expr)
874
+ return '';
875
+ if (expr.type === 'Identifier')
876
+ return expr.name || '';
877
+ if (expr.type === 'IndexAccess')
878
+ return this.getReferenceRoot(expr.base);
879
+ if (expr.type === 'MemberAccess')
880
+ return this.getReferenceRoot(expr.expression);
881
+ return '';
882
+ }
883
+ isPrivilegedName(name) {
884
+ // Delegates to the canonical helper in _common/access-control
885
+ // (roadmap 1.2). The default keyword set there mirrors this
886
+ // detector's legacy regex exactly, so behaviour is preserved.
887
+ return (0, access_control_1.isPrivilegedIdentifier)(name);
888
+ }
889
+ isPrivilegedFundTransferFunction() {
890
+ const normalized = this.currentFunction.toLowerCase();
891
+ return /sweep|drain|rescue|recover|skim|withdrawfee|withdrawfund|transferfund|treasury|emergency/.test(normalized);
892
+ }
893
+ isValueTransfer(expr) {
894
+ let current = expr.expression;
895
+ if (current?.type === 'NameValueExpression') {
896
+ return this.nameValueExpressionHasValue(current) && this.memberName(current.expression) === 'call';
897
+ }
898
+ const member = this.memberName(current);
899
+ return member === 'send' || member === 'transfer';
900
+ }
901
+ nameValueExpressionHasValue(expr) {
902
+ if (!expr)
903
+ return false;
904
+ const argumentNames = Array.isArray(expr.arguments)
905
+ ? expr.arguments.map((arg) => arg?.name).filter(Boolean)
906
+ : (expr.arguments?.names || []);
907
+ const names = expr.names || argumentNames || [];
908
+ if (Array.isArray(names) && names.some((name) => String(name).toLowerCase() === 'value')) {
909
+ return true;
910
+ }
911
+ return Array.isArray(expr.arguments) && expr.arguments.length > 0;
912
+ }
913
+ memberName(expr) {
914
+ return expr?.type === 'MemberAccess' ? String(expr.memberName || '').toLowerCase() : '';
915
+ }
916
+ getCallName(expr) {
917
+ if (!expr)
918
+ return '';
919
+ if (expr.type === 'Identifier')
920
+ return expr.name || '';
921
+ if (expr.type === 'MemberAccess') {
922
+ const prefix = this.getCallName(expr.expression);
923
+ return prefix ? `${prefix}.${expr.memberName || ''}` : (expr.memberName || '');
924
+ }
925
+ if (expr.type === 'NameValueExpression')
926
+ return this.getCallName(expr.expression);
927
+ return this.getNodeName(expr);
928
+ }
929
+ getNodeName(node) {
930
+ if (!node)
931
+ return '';
932
+ if (typeof node === 'string')
933
+ return node;
934
+ if (node.name)
935
+ return this.getNodeName(node.name);
936
+ if (node.namePath)
937
+ return String(node.namePath);
938
+ if (node.type === 'Identifier')
939
+ return node.name || '';
940
+ if (node.type === 'ModifierInvocation')
941
+ return this.getNodeName(node.name);
942
+ if (node.type === 'MemberAccess')
943
+ return node.memberName || '';
944
+ return '';
945
+ }
946
+ childNodes(node) {
947
+ const children = [];
948
+ for (const key of [
949
+ 'expression',
950
+ 'left',
951
+ 'right',
952
+ 'subExpression',
953
+ 'base',
954
+ 'index',
955
+ 'initialValue',
956
+ 'arguments',
957
+ 'components'
958
+ ]) {
959
+ const value = node[key];
960
+ if (Array.isArray(value)) {
961
+ for (const item of value) {
962
+ if (item && typeof item === 'object')
963
+ children.push(item);
964
+ }
965
+ }
966
+ else if (value && typeof value === 'object') {
967
+ children.push(value);
968
+ }
969
+ }
970
+ return children;
971
+ }
972
+ }
973
+ exports.AccessControlDetector = AccessControlDetector;
974
+ // Alias `_post` handlers to `:exit` so that `parser.visit` (which fires
975
+ // `<Type>:exit`) and the solc-walker (which fires `<Type>_post`) both
976
+ // reach the same handler. The pre-Slice-2b `ContractDefinition_post`
977
+ // existed for the solc path but did nothing observable; the inherited-
978
+ // function walk added in Slice 2b (roadmap 3.3) needs the parser-AST
979
+ // alias for combined-source and two-file scans to fire. Pattern matches
980
+ // classic-reentrancy.ts / fallback-delegatecall-reentrancy.ts.
981
+ const _accProto = AccessControlDetector.prototype;
982
+ _accProto['ContractDefinition:exit'] = _accProto.ContractDefinition_post;
983
+ //# sourceMappingURL=access-control.js.map