@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,788 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkimTokenBalanceDetector = void 0;
4
+ const access_control_1 = require("./_common/access-control");
5
+ const RULE_ID = 'skim-token-balance';
6
+ const PAT_USE_SITE = `${RULE_ID}/use-site`;
7
+ const PAT_PAIR_SIDE = `${RULE_ID}/pair-side`;
8
+ const PAT_UNRECONCILED_SELF_BALANCE = `${RULE_ID}/unreconciled-self-balance-payout`;
9
+ const SOURCE = 'x-2023-08-24-gss-skim-token-balance';
10
+ const ACCESS_CONTROL_MODIFIERS = new Set([
11
+ 'onlyowner', 'onlyowners', 'onlyrole', 'onlyadmin', 'onlyauthorized',
12
+ 'authorized', 'auth', 'onlyoperator', 'onlyoperators', 'onlygovernance',
13
+ 'onlygovernor', 'onlyguardian', 'onlymanager', 'onlytrusted',
14
+ 'onlytimelock', 'onlydeployer', 'onlykeeper',
15
+ ]);
16
+ const REENTRANCY_GUARD_MODIFIERS = new Set([
17
+ 'nonreentrant', 'noreentrant', 'noreentry', 'reentrancyguard',
18
+ 'lock', 'locked', 'mutex',
19
+ ]);
20
+ class SkimTokenBalanceDetector {
21
+ id = RULE_ID;
22
+ patternKey = RULE_ID;
23
+ supportedAstKinds = ['parser', 'solc'];
24
+ scanAst(ast, file, sourceText) {
25
+ if (!ast || typeof ast !== 'object')
26
+ return [];
27
+ if (Object.keys(ast).length === 0)
28
+ return [];
29
+ const findings = [];
30
+ const lineOffsets = buildLineOffsets(sourceText);
31
+ const contracts = collectContracts(ast);
32
+ const hasInSourceDeflationaryToken = contracts.some(contract => !isInterfaceLike(contract) && contractHasPairConditionalTransfer(contract));
33
+ for (const contract of contracts) {
34
+ if (isInterfaceLike(contract))
35
+ continue;
36
+ const contractName = getName(contract) || '<anonymous>';
37
+ for (const fn of getContractFunctions(contract)) {
38
+ if (!isExternallyReachable(fn))
39
+ continue;
40
+ const body = getFunctionBody(fn);
41
+ if (!body)
42
+ continue;
43
+ const fnName = getName(fn) || '';
44
+ if (!fnName)
45
+ continue;
46
+ let hit = findUseSiteSkim(body);
47
+ if (!hit && !hasAccessControlGuard(fn, body) && !hasReentrancyGuard(fn)) {
48
+ hit = findUnreconciledSelfBalancePayout(body, contract);
49
+ }
50
+ if (!hit && hasInSourceDeflationaryToken) {
51
+ if (!hasAccessControlGuard(fn) && !hasReentrancyGuard(fn)) {
52
+ hit = findPairSideSkim(body, contract);
53
+ }
54
+ }
55
+ if (!hit)
56
+ continue;
57
+ const loc = getLoc(hit.node, lineOffsets) || getLoc(fn, lineOffsets) || { line: 0, column: 0 };
58
+ findings.push({
59
+ file,
60
+ contract: contractName,
61
+ 'function': fnName,
62
+ line: loc.line,
63
+ endLine: loc.line,
64
+ column: loc.column,
65
+ pattern: hit.pattern,
66
+ confidence: 'high',
67
+ ruleId: RULE_ID,
68
+ severity: hit.pattern === PAT_UNRECONCILED_SELF_BALANCE ? 'high' : 'error',
69
+ message: messageFor(hit.pattern, contractName, fnName),
70
+ rationale: rationaleFor(hit.pattern),
71
+ suggestedFix: remediationFor(hit.pattern),
72
+ contractName,
73
+ functionName: fnName,
74
+ sourceLocation: { line: loc.line, column: loc.column },
75
+ findingId: '',
76
+ contractHash: '',
77
+ source: SOURCE,
78
+ provenance: SOURCE,
79
+ });
80
+ }
81
+ }
82
+ return findings;
83
+ }
84
+ }
85
+ exports.SkimTokenBalanceDetector = SkimTokenBalanceDetector;
86
+ function messageFor(pattern, contractName, fnName) {
87
+ if (pattern === PAT_UNRECONCILED_SELF_BALANCE) {
88
+ return `Function '${contractName}.${fnName}' pays a caller-benefiting sink from the contract's full live self-balance without reserve reconciliation or a guard.`;
89
+ }
90
+ if (pattern === PAT_USE_SITE) {
91
+ return `Function '${contractName}.${fnName}' transfers tokens to a pair and then calls 'skim' on that same pair, matching the gss balance-excess extraction shape.`;
92
+ }
93
+ return `Function '${contractName}.${fnName}' computes a skimmable amount from a pair's token balance and transfers it out, while a co-located token contract drifts the pair's balance on transfers — the gss skim-token-balance vulnerability shape.`;
94
+ }
95
+ function rationaleFor(pattern) {
96
+ if (pattern === PAT_UNRECONCILED_SELF_BALANCE) {
97
+ return 'The function reads `balanceOf(address(this))` or `address(this).balance` and uses the unreconciled whole balance as the amount for a payout or mint to the caller. Attackers can inflate live balance with donations or flash-loan top-ups and skim value that is not backed by tracked reserves.';
98
+ }
99
+ if (pattern === PAT_USE_SITE) {
100
+ return 'Reproduces the gss attack use-site: the contract pushes tokens into a pair to inflate the pair-held balance above the recorded reserve, then calls `skim` to harvest the excess to an attacker-controlled recipient.';
101
+ }
102
+ return 'Pair-side `skim` releases `balanceOf(pair) - reserve` without re-syncing the reserve before the transfer. When the paired token applies a tax or burn on transfers to the pair (deflationary on-pair-transfer), the pair accumulates a recoverable excess that any caller can drain with `skim` and a follow-up `sync`.';
103
+ }
104
+ function remediationFor(pattern) {
105
+ if (pattern === PAT_UNRECONCILED_SELF_BALANCE) {
106
+ return 'Pay only a reconciled reserve delta such as `balanceOf(address(this)) - reserve`, update accounting before value leaves, or restrict emergency skim paths with access control and reentrancy protection.';
107
+ }
108
+ if (pattern === PAT_USE_SITE) {
109
+ return 'Treat any flow that pushes tokens into a pair and then calls `skim`/`sync` on that pair as an attack signature; do not exposed it from a permissionless entry point.';
110
+ }
111
+ return 'Update the reserve to match the post-transfer balance before performing the token transfer (CEI), and gate `skim` behind an access-controlled rescue or a reentrancy-guarded sync, so a deflationary token cannot be drained by a permissionless skim.';
112
+ }
113
+ function findUseSiteSkim(body) {
114
+ const transferTargets = new Set();
115
+ let foundNode = null;
116
+ function visit(node) {
117
+ if (foundNode)
118
+ return;
119
+ if (!node || typeof node !== 'object')
120
+ return;
121
+ if (isFunctionCall(node)) {
122
+ const callee = unwrapCallOptions(getCallee(node));
123
+ if (isMemberAccess(callee)) {
124
+ const memberName = String(callee.memberName || '');
125
+ const args = getCallArguments(node);
126
+ if (memberName === 'transfer' && args.length >= 2) {
127
+ const destName = identifierName(unwrapAddressCast(args[0]));
128
+ if (destName)
129
+ transferTargets.add(destName);
130
+ }
131
+ else if (memberName === 'skim' && args.length >= 1) {
132
+ const baseExpr = getMemberAccessBase(callee);
133
+ const recvName = identifierName(baseExpr) || identifierName(unwrapInterfaceCast(baseExpr));
134
+ if (recvName && transferTargets.has(recvName)) {
135
+ foundNode = node;
136
+ return;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ for (const child of childrenOf(node))
142
+ visit(child);
143
+ }
144
+ visit(body);
145
+ return foundNode ? { node: foundNode, pattern: PAT_USE_SITE } : null;
146
+ }
147
+ function findUnreconciledSelfBalancePayout(body, contract) {
148
+ const stateVars = collectStateVariableNames(contract);
149
+ const selfAliases = new Set();
150
+ const balanceVars = new Set();
151
+ const safeDeltaVars = new Set();
152
+ let foundNode = null;
153
+ function visit(node) {
154
+ if (foundNode)
155
+ return;
156
+ if (!node || typeof node !== 'object')
157
+ return;
158
+ if (isNode(node, 'VariableDeclarationStatement')) {
159
+ const varNames = getVariableDeclarationNames(node);
160
+ const initialValue = node.initialValue ?? node.expression ?? null;
161
+ if (initialValue && varNames.length > 0) {
162
+ if (isSelfAddressExpression(initialValue, selfAliases)) {
163
+ for (const name of varNames)
164
+ selfAliases.add(name);
165
+ }
166
+ else if (isUnreconciledSelfBalanceAmount(initialValue, balanceVars, selfAliases)) {
167
+ for (const name of varNames)
168
+ balanceVars.add(name);
169
+ }
170
+ else if (isReserveReconciledAmount(initialValue, balanceVars, selfAliases, stateVars)) {
171
+ for (const name of varNames)
172
+ safeDeltaVars.add(name);
173
+ }
174
+ }
175
+ }
176
+ else if (isNode(node, 'Assignment')) {
177
+ const left = node.leftHandSide ?? node.left;
178
+ const right = node.rightHandSide ?? node.right;
179
+ const name = identifierName(left);
180
+ if (name && right) {
181
+ if (isSelfAddressExpression(right, selfAliases)) {
182
+ selfAliases.add(name);
183
+ }
184
+ else if (isUnreconciledSelfBalanceAmount(right, balanceVars, selfAliases)) {
185
+ balanceVars.add(name);
186
+ safeDeltaVars.delete(name);
187
+ }
188
+ else if (isReserveReconciledAmount(right, balanceVars, selfAliases, stateVars)) {
189
+ safeDeltaVars.add(name);
190
+ balanceVars.delete(name);
191
+ }
192
+ }
193
+ }
194
+ if (isUserBenefitingPayoutCall(node, balanceVars, safeDeltaVars, selfAliases, stateVars)) {
195
+ foundNode = node;
196
+ return;
197
+ }
198
+ for (const child of childrenOf(node))
199
+ visit(child);
200
+ }
201
+ visit(body);
202
+ return foundNode ? { node: foundNode, pattern: PAT_UNRECONCILED_SELF_BALANCE } : null;
203
+ }
204
+ function getVariableDeclarationNames(node) {
205
+ const out = [];
206
+ for (const variable of node?.variables || []) {
207
+ const name = String(variable?.name || variable?.identifier?.name || '');
208
+ if (name)
209
+ out.push(name);
210
+ }
211
+ if (node?.declarations) {
212
+ for (const variable of node.declarations) {
213
+ const name = String(variable?.name || variable?.identifier?.name || '');
214
+ if (name)
215
+ out.push(name);
216
+ }
217
+ }
218
+ return out;
219
+ }
220
+ function isUserBenefitingPayoutCall(node, balanceVars, safeDeltaVars, selfAliases, stateVars) {
221
+ if (!isFunctionCall(node))
222
+ return false;
223
+ const callee = unwrapCallOptions(getCallee(node));
224
+ const args = getCallArguments(node);
225
+ if (isMemberAccess(callee)) {
226
+ const member = String(callee.memberName || '');
227
+ if ((member === 'transfer' || member === 'safeTransfer') && args.length >= 2) {
228
+ return isCallerBeneficiary(args[0]) &&
229
+ isDangerousPayoutAmount(args[1], balanceVars, safeDeltaVars, selfAliases, stateVars);
230
+ }
231
+ if ((member === 'transfer' || member === 'send') && args.length >= 1) {
232
+ return isCallerBeneficiary(getMemberAccessBase(callee)) &&
233
+ isDangerousPayoutAmount(args[0], balanceVars, safeDeltaVars, selfAliases, stateVars);
234
+ }
235
+ }
236
+ const name = getCallName(callee).toLowerCase();
237
+ if ((name === '_mint' || name === 'mint') && args.length >= 2) {
238
+ return isCallerBeneficiary(args[0]) &&
239
+ isDangerousPayoutAmount(args[1], balanceVars, safeDeltaVars, selfAliases, stateVars);
240
+ }
241
+ return false;
242
+ }
243
+ function isDangerousPayoutAmount(expr, balanceVars, safeDeltaVars, selfAliases, stateVars) {
244
+ if (!expr)
245
+ return false;
246
+ const name = identifierName(expr);
247
+ if (name && safeDeltaVars.has(name))
248
+ return false;
249
+ if (isReserveReconciledAmount(expr, balanceVars, selfAliases, stateVars))
250
+ return false;
251
+ return isUnreconciledSelfBalanceAmount(expr, balanceVars, selfAliases);
252
+ }
253
+ function isUnreconciledSelfBalanceAmount(expr, balanceVars, selfAliases) {
254
+ if (!expr || typeof expr !== 'object')
255
+ return false;
256
+ const name = identifierName(expr);
257
+ if (name && balanceVars.has(name))
258
+ return true;
259
+ if (isSelfBalanceExpression(expr, selfAliases))
260
+ return true;
261
+ return false;
262
+ }
263
+ function isReserveReconciledAmount(expr, balanceVars, selfAliases, stateVars) {
264
+ if (!isNode(expr, 'BinaryOperation') || String(expr.operator || '') !== '-')
265
+ return false;
266
+ const left = getBinLeft(expr);
267
+ const right = getBinRight(expr);
268
+ if (!isUnreconciledSelfBalanceAmount(left, balanceVars, selfAliases))
269
+ return false;
270
+ return expressionReferencesStateVariable(right, stateVars);
271
+ }
272
+ function expressionReferencesStateVariable(expr, stateVars) {
273
+ if (!expr || typeof expr !== 'object')
274
+ return false;
275
+ const name = identifierName(expr) || rootIdentifierName(expr);
276
+ if (name && stateVars.has(name))
277
+ return true;
278
+ return walkAny(expr, node => {
279
+ const innerName = identifierName(node) || rootIdentifierName(node);
280
+ return !!innerName && stateVars.has(innerName);
281
+ });
282
+ }
283
+ function isSelfBalanceExpression(expr, selfAliases) {
284
+ if (isBalanceOfSelfCall(expr, selfAliases))
285
+ return true;
286
+ if (!isMemberAccess(expr))
287
+ return false;
288
+ if (String(expr.memberName || '') !== 'balance')
289
+ return false;
290
+ return isSelfAddressExpression(getMemberAccessBase(expr), selfAliases);
291
+ }
292
+ function isBalanceOfSelfCall(node, selfAliases) {
293
+ if (!isBalanceOfCall(node))
294
+ return false;
295
+ const args = getCallArguments(node);
296
+ if (args.length < 1)
297
+ return false;
298
+ return isSelfAddressExpression(args[0], selfAliases);
299
+ }
300
+ function isSelfAddressExpression(expr, selfAliases) {
301
+ if (!expr)
302
+ return false;
303
+ if (isNode(expr, 'Identifier')) {
304
+ const name = String(expr.name || '');
305
+ return name === 'this' || selfAliases.has(name);
306
+ }
307
+ if (!isFunctionCall(expr))
308
+ return false;
309
+ const callee = getCallee(expr);
310
+ const args = getCallArguments(expr);
311
+ if (args.length !== 1)
312
+ return false;
313
+ return getCallName(callee).toLowerCase() === 'address' && isSelfAddressExpression(args[0], selfAliases);
314
+ }
315
+ function isCallerBeneficiary(expr) {
316
+ if (!expr)
317
+ return false;
318
+ if (isMsgSenderExpression(expr))
319
+ return true;
320
+ if (!isFunctionCall(expr))
321
+ return false;
322
+ const args = getCallArguments(expr);
323
+ if (args.length !== 1)
324
+ return false;
325
+ const calleeName = getCallName(getCallee(expr)).toLowerCase();
326
+ return (calleeName === 'payable' || calleeName === 'address') && isMsgSenderExpression(args[0]);
327
+ }
328
+ function isMsgSenderExpression(expr) {
329
+ if (!isMemberAccess(expr))
330
+ return false;
331
+ if (String(expr.memberName || '') !== 'sender')
332
+ return false;
333
+ const base = getMemberAccessBase(expr);
334
+ return isNode(base, 'Identifier') && String(base.name || '') === 'msg';
335
+ }
336
+ function getCallName(callee) {
337
+ if (!callee)
338
+ return '';
339
+ if (isNode(callee, 'Identifier'))
340
+ return String(callee.name || '');
341
+ if (isNode(callee, 'ElementaryTypeNameExpression')) {
342
+ const tn = callee.typeName;
343
+ if (typeof tn === 'string')
344
+ return tn;
345
+ return String(tn?.name || tn?.typeDescriptions?.typeString || '');
346
+ }
347
+ if (isNode(callee, 'UserDefinedTypeName'))
348
+ return String(callee.namePath || callee.name || '');
349
+ if (isMemberAccess(callee))
350
+ return String(callee.memberName || '');
351
+ return '';
352
+ }
353
+ function findPairSideSkim(body, contract) {
354
+ const stateVars = collectStateVariableNames(contract);
355
+ let sawBalanceOf = false;
356
+ let sawStateAssignmentBeforeTransfer = false;
357
+ let transferCallNode = null;
358
+ function visit(node) {
359
+ if (transferCallNode)
360
+ return;
361
+ if (!node || typeof node !== 'object')
362
+ return;
363
+ if (isBalanceOfCall(node)) {
364
+ sawBalanceOf = true;
365
+ }
366
+ if (isAssignmentToStateVariable(node, stateVars)) {
367
+ sawStateAssignmentBeforeTransfer = true;
368
+ }
369
+ if (isExternalTransferCall(node)) {
370
+ transferCallNode = node;
371
+ return;
372
+ }
373
+ for (const child of childrenOf(node))
374
+ visit(child);
375
+ }
376
+ visit(body);
377
+ if (!transferCallNode)
378
+ return null;
379
+ if (!sawBalanceOf)
380
+ return null;
381
+ if (sawStateAssignmentBeforeTransfer)
382
+ return null;
383
+ return { node: transferCallNode, pattern: PAT_PAIR_SIDE };
384
+ }
385
+ function contractHasPairConditionalTransfer(contract) {
386
+ const stateVarNames = collectStateVariableNames(contract);
387
+ if (stateVarNames.size === 0)
388
+ return false;
389
+ for (const fn of getContractFunctions(contract)) {
390
+ if (!isExternallyReachable(fn))
391
+ continue;
392
+ if (getName(fn) !== 'transfer')
393
+ continue;
394
+ const params = getParameters(fn);
395
+ const addressParamNames = new Set(params.filter(isAddressParameter).map(p => String(p.name || '')).filter(Boolean));
396
+ if (addressParamNames.size === 0)
397
+ continue;
398
+ const body = getFunctionBody(fn);
399
+ if (!body)
400
+ continue;
401
+ if (bodyHasPairEqualityCheck(body, addressParamNames, stateVarNames))
402
+ return true;
403
+ }
404
+ return false;
405
+ }
406
+ function bodyHasPairEqualityCheck(body, addressParams, stateVars) {
407
+ return walkAny(body, node => {
408
+ if (!isNode(node, 'BinaryOperation'))
409
+ return false;
410
+ const op = String(node.operator || '');
411
+ if (op !== '==' && op !== '!=')
412
+ return false;
413
+ const left = getBinLeft(node);
414
+ const right = getBinRight(node);
415
+ return paramVsState(left, right, addressParams, stateVars) ||
416
+ paramVsState(right, left, addressParams, stateVars);
417
+ });
418
+ }
419
+ function paramVsState(maybeParam, maybeState, addressParams, stateVars) {
420
+ if (!isNode(maybeParam, 'Identifier'))
421
+ return false;
422
+ if (!addressParams.has(String(maybeParam.name || '')))
423
+ return false;
424
+ if (!isNode(maybeState, 'Identifier'))
425
+ return false;
426
+ return stateVars.has(String(maybeState.name || ''));
427
+ }
428
+ function isAssignmentToStateVariable(node, stateVars) {
429
+ if (!node || typeof node !== 'object')
430
+ return false;
431
+ let left;
432
+ if (isNode(node, 'Assignment')) {
433
+ left = node.leftHandSide ?? node.left;
434
+ }
435
+ else if (isNode(node, 'BinaryOperation')) {
436
+ const op = String(node.operator || '');
437
+ if (!isAssignmentOperator(op))
438
+ return false;
439
+ left = node.left;
440
+ }
441
+ else {
442
+ return false;
443
+ }
444
+ if (!left)
445
+ return false;
446
+ if (isNode(left, 'Identifier'))
447
+ return stateVars.has(String(left.name || ''));
448
+ const root = rootIdentifierName(left);
449
+ return root ? stateVars.has(root) : false;
450
+ }
451
+ function isAssignmentOperator(op) {
452
+ return op === '=' || op === '+=' || op === '-=' || op === '*=' || op === '/=' ||
453
+ op === '%=' || op === '|=' || op === '&=' || op === '^=' || op === '<<=' || op === '>>=';
454
+ }
455
+ function rootIdentifierName(node) {
456
+ let cur = node;
457
+ while (cur && typeof cur === 'object') {
458
+ if (isNode(cur, 'Identifier'))
459
+ return String(cur.name || '');
460
+ if (isNode(cur, 'IndexAccess')) {
461
+ cur = cur.base ?? cur.baseExpression;
462
+ continue;
463
+ }
464
+ if (isNode(cur, 'MemberAccess')) {
465
+ cur = cur.expression;
466
+ continue;
467
+ }
468
+ return '';
469
+ }
470
+ return '';
471
+ }
472
+ function isBalanceOfCall(node) {
473
+ if (!isFunctionCall(node))
474
+ return false;
475
+ const callee = unwrapCallOptions(getCallee(node));
476
+ if (!isMemberAccess(callee))
477
+ return false;
478
+ return String(callee.memberName || '') === 'balanceOf';
479
+ }
480
+ function isExternalTransferCall(node) {
481
+ if (!isFunctionCall(node))
482
+ return false;
483
+ const callee = unwrapCallOptions(getCallee(node));
484
+ if (!isMemberAccess(callee))
485
+ return false;
486
+ const member = String(callee.memberName || '');
487
+ if (member !== 'transfer' && member !== 'transferFrom' && member !== 'safeTransfer')
488
+ return false;
489
+ const args = getCallArguments(node);
490
+ return args.length >= 2;
491
+ }
492
+ function unwrapAddressCast(expr) {
493
+ if (!isFunctionCall(expr))
494
+ return expr;
495
+ const callee = getCallee(expr);
496
+ const args = getCallArguments(expr);
497
+ if (args.length !== 1)
498
+ return expr;
499
+ if (isNode(callee, 'ElementaryTypeNameExpression')) {
500
+ const tn = callee.typeName;
501
+ const isAddress = (tn?.name === 'address') ||
502
+ (tn?.typeDescriptions?.typeString === 'address') ||
503
+ (typeof tn === 'string' && tn === 'address');
504
+ if (isAddress)
505
+ return args[0];
506
+ }
507
+ if (isNode(callee, 'Identifier') && String(callee.name || '') === 'address') {
508
+ return args[0];
509
+ }
510
+ return expr;
511
+ }
512
+ function unwrapInterfaceCast(expr) {
513
+ if (!isFunctionCall(expr))
514
+ return expr;
515
+ const callee = getCallee(expr);
516
+ const args = getCallArguments(expr);
517
+ if (args.length !== 1)
518
+ return expr;
519
+ if (!isNode(args[0], 'Identifier'))
520
+ return expr;
521
+ if (isNode(callee, 'Identifier') || isNode(callee, 'UserDefinedTypeName')) {
522
+ return args[0];
523
+ }
524
+ return expr;
525
+ }
526
+ function identifierName(node) {
527
+ if (!node)
528
+ return '';
529
+ if (isNode(node, 'Identifier'))
530
+ return String(node.name || '');
531
+ return '';
532
+ }
533
+ function isFunctionCall(node) {
534
+ return isNode(node, 'FunctionCall');
535
+ }
536
+ function isMemberAccess(node) {
537
+ return isNode(node, 'MemberAccess');
538
+ }
539
+ function getCallee(node) {
540
+ return node?.expression ?? null;
541
+ }
542
+ function getMemberAccessBase(node) {
543
+ if (!isMemberAccess(node))
544
+ return null;
545
+ return node.expression ?? null;
546
+ }
547
+ function getCallArguments(call) {
548
+ if (Array.isArray(call?.arguments))
549
+ return call.arguments;
550
+ if (Array.isArray(call?.args))
551
+ return call.args;
552
+ return [];
553
+ }
554
+ function unwrapCallOptions(expr) {
555
+ let cur = expr;
556
+ while (cur && (isNode(cur, 'NameValueExpression') || isNode(cur, 'FunctionCallOptions'))) {
557
+ cur = cur.expression;
558
+ }
559
+ return cur;
560
+ }
561
+ function getBinLeft(node) {
562
+ return node.left ?? node.leftExpression ?? node.leftHandSide ?? null;
563
+ }
564
+ function getBinRight(node) {
565
+ return node.right ?? node.rightExpression ?? node.rightHandSide ?? null;
566
+ }
567
+ function hasAccessControlGuard(fn, body) {
568
+ if ((0, access_control_1.hasRecognisedAccessControlModifier)(fn))
569
+ return true;
570
+ for (const m of fn?.modifiers || []) {
571
+ const name = getModifierName(m).toLowerCase();
572
+ if (name && ACCESS_CONTROL_MODIFIERS.has(name))
573
+ return true;
574
+ }
575
+ if (body && bodyHasAccessControlRequire(body))
576
+ return true;
577
+ return false;
578
+ }
579
+ function bodyHasAccessControlRequire(body) {
580
+ return walkAny(body, node => {
581
+ if (!isFunctionCall(node))
582
+ return false;
583
+ const calleeName = getCallName(getCallee(node)).toLowerCase();
584
+ if (calleeName !== 'require' && calleeName !== 'assert')
585
+ return false;
586
+ const args = getCallArguments(node);
587
+ if (args.length === 0)
588
+ return false;
589
+ return (0, access_control_1.requireExpressesAccessControl)(args[0], name => (0, access_control_1.isPrivilegedIdentifier)(name));
590
+ });
591
+ }
592
+ function hasReentrancyGuard(fn) {
593
+ for (const m of fn?.modifiers || []) {
594
+ const name = getModifierName(m).toLowerCase();
595
+ if (!name)
596
+ continue;
597
+ if (REENTRANCY_GUARD_MODIFIERS.has(name))
598
+ return true;
599
+ }
600
+ return false;
601
+ }
602
+ function getModifierName(modifier) {
603
+ if (!modifier)
604
+ return '';
605
+ if (typeof modifier === 'string')
606
+ return modifier;
607
+ if (typeof modifier.name === 'string')
608
+ return modifier.name;
609
+ if (modifier.name && typeof modifier.name === 'object') {
610
+ if (typeof modifier.name.name === 'string')
611
+ return modifier.name.name;
612
+ if (typeof modifier.name.namePath === 'string')
613
+ return modifier.name.namePath;
614
+ }
615
+ if (modifier.modifierName) {
616
+ const inner = modifier.modifierName;
617
+ if (typeof inner === 'string')
618
+ return inner;
619
+ if (inner && typeof inner.name === 'string')
620
+ return inner.name;
621
+ }
622
+ return '';
623
+ }
624
+ function collectStateVariableNames(contract) {
625
+ const out = new Set();
626
+ for (const member of getContractMembers(contract)) {
627
+ if (isNode(member, 'StateVariableDeclaration')) {
628
+ for (const variable of member.variables || []) {
629
+ if (variable?.name)
630
+ out.add(String(variable.name));
631
+ }
632
+ }
633
+ else if (isNode(member, 'VariableDeclaration') && member.stateVariable === true) {
634
+ if (member.name)
635
+ out.add(String(member.name));
636
+ }
637
+ }
638
+ return out;
639
+ }
640
+ function isAddressParameter(param) {
641
+ const typeName = param?.typeName;
642
+ if (!typeName) {
643
+ const typeString = String(param?.typeDescriptions?.typeString || '');
644
+ return /^address\b/.test(typeString);
645
+ }
646
+ if (typeof typeName === 'string')
647
+ return typeName === 'address';
648
+ if (typeName.type === 'ElementaryTypeName' && typeName.name === 'address')
649
+ return true;
650
+ if (typeName.nodeType === 'ElementaryTypeName' && typeName.name === 'address')
651
+ return true;
652
+ if (typeName.typeDescriptions?.typeString === 'address')
653
+ return true;
654
+ return false;
655
+ }
656
+ function isExternallyReachable(fn) {
657
+ if (!fn)
658
+ return false;
659
+ if (fn.isConstructor === true)
660
+ return false;
661
+ const kind = String(fn.kind || '').toLowerCase();
662
+ if (kind === 'constructor')
663
+ return false;
664
+ const visibility = String(fn.visibility || '').toLowerCase();
665
+ if (visibility === 'public' || visibility === 'external')
666
+ return true;
667
+ if (kind === 'fallback' || kind === 'receive')
668
+ return true;
669
+ return false;
670
+ }
671
+ function isInterfaceLike(contract) {
672
+ const kind = String(contract?.kind || contract?.contractKind || '').toLowerCase();
673
+ return kind === 'interface' || kind === 'library';
674
+ }
675
+ function getFunctionBody(fn) {
676
+ return fn?.body || null;
677
+ }
678
+ function getName(node) {
679
+ return typeof node?.name === 'string' ? node.name : '';
680
+ }
681
+ function getParameters(fn) {
682
+ if (Array.isArray(fn?.parameters))
683
+ return fn.parameters;
684
+ if (Array.isArray(fn?.parameters?.parameters))
685
+ return fn.parameters.parameters;
686
+ return [];
687
+ }
688
+ function getContractFunctions(contract) {
689
+ return getContractMembers(contract).filter(node => isNode(node, 'FunctionDefinition'));
690
+ }
691
+ function getContractMembers(contract) {
692
+ if (!contract || typeof contract !== 'object')
693
+ return [];
694
+ if (Array.isArray(contract.subNodes))
695
+ return contract.subNodes;
696
+ if (Array.isArray(contract.nodes))
697
+ return contract.nodes;
698
+ return [];
699
+ }
700
+ function collectContracts(ast) {
701
+ const out = [];
702
+ walkContracts(ast, out);
703
+ return out;
704
+ }
705
+ function walkContracts(node, out) {
706
+ if (!node || typeof node !== 'object')
707
+ return;
708
+ if (isNode(node, 'ContractDefinition')) {
709
+ out.push(node);
710
+ return;
711
+ }
712
+ for (const child of childrenOf(node))
713
+ walkContracts(child, out);
714
+ }
715
+ function walkAny(node, predicate) {
716
+ if (!node || typeof node !== 'object')
717
+ return false;
718
+ if (predicate(node))
719
+ return true;
720
+ for (const child of childrenOf(node)) {
721
+ if (walkAny(child, predicate))
722
+ return true;
723
+ }
724
+ return false;
725
+ }
726
+ function childrenOf(node) {
727
+ if (!node || typeof node !== 'object')
728
+ return [];
729
+ const out = [];
730
+ for (const [key, value] of Object.entries(node)) {
731
+ if (key === 'loc' || key === 'src' || key === 'range' || key === 'typeDescriptions' ||
732
+ key === 'id' || key === 'scope')
733
+ continue;
734
+ if (Array.isArray(value)) {
735
+ for (const item of value)
736
+ if (item && typeof item === 'object')
737
+ out.push(item);
738
+ }
739
+ else if (value && typeof value === 'object') {
740
+ out.push(value);
741
+ }
742
+ }
743
+ return out;
744
+ }
745
+ function isNode(node, kind) {
746
+ return node?.type === kind || node?.nodeType === kind;
747
+ }
748
+ function buildLineOffsets(sourceText) {
749
+ if (sourceText === undefined)
750
+ return undefined;
751
+ const offsets = [0];
752
+ let byteOffset = 0;
753
+ for (const ch of sourceText) {
754
+ byteOffset += Buffer.byteLength(ch, 'utf8');
755
+ if (ch === '\n')
756
+ offsets.push(byteOffset);
757
+ }
758
+ return offsets;
759
+ }
760
+ function getLoc(node, lineOffsets) {
761
+ if (node?.loc?.start) {
762
+ return { line: node.loc.start.line || 0, column: node.loc.start.column || 0 };
763
+ }
764
+ if (!node?.src || !lineOffsets)
765
+ return undefined;
766
+ const [offsetRaw] = String(node.src).split(':');
767
+ const offset = Number(offsetRaw);
768
+ if (!Number.isFinite(offset) || offset < 0)
769
+ return undefined;
770
+ return byteOffsetToLineColumn(offset, lineOffsets);
771
+ }
772
+ function byteOffsetToLineColumn(byteOffset, lineOffsets) {
773
+ let low = 0;
774
+ let high = lineOffsets.length - 1;
775
+ let lineIdx = 0;
776
+ while (low <= high) {
777
+ const mid = Math.floor((low + high) / 2);
778
+ if (lineOffsets[mid] <= byteOffset) {
779
+ lineIdx = mid;
780
+ low = mid + 1;
781
+ }
782
+ else {
783
+ high = mid - 1;
784
+ }
785
+ }
786
+ return { line: lineIdx + 1, column: byteOffset - lineOffsets[lineIdx] };
787
+ }
788
+ //# sourceMappingURL=skim-token-balance.js.map