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