@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,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Source-text helpers for detectors that need to look at raw Solidity text.
|
|
4
|
+
*
|
|
5
|
+
* Several detectors fall back to source-text inspection when the AST shape
|
|
6
|
+
* varies between parsers or when a structural predicate would be too
|
|
7
|
+
* expensive. The risk of source-text matching is well-known: regexes that
|
|
8
|
+
* see commented-out code or string literals will match content that would
|
|
9
|
+
* never execute. `stripCommentsAndStrings` neutralizes both. New detectors
|
|
10
|
+
* should prefer AST predicates; this helper exists for the legacy paths.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.stripCommentsAndStrings = stripCommentsAndStrings;
|
|
14
|
+
// Replace line comments, block comments, and string literals (both
|
|
15
|
+
// double- and single-quoted) with whitespace-equivalent placeholders.
|
|
16
|
+
// Newlines and overall length are preserved so byte offsets and line
|
|
17
|
+
// numbers stay aligned with the original source.
|
|
18
|
+
//
|
|
19
|
+
// Implementation note: the regex variants used by detectors before this
|
|
20
|
+
// helper existed sometimes stripped comments only, leaving string
|
|
21
|
+
// literals (`"transferFrom("`, `"msg.sender"`) free to fool the
|
|
22
|
+
// matcher. This version scans linearly, tracking comment/string state,
|
|
23
|
+
// so quote-escapes and embedded slashes inside strings are handled.
|
|
24
|
+
function stripCommentsAndStrings(input) {
|
|
25
|
+
if (!input)
|
|
26
|
+
return input;
|
|
27
|
+
const out = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
const n = input.length;
|
|
30
|
+
while (i < n) {
|
|
31
|
+
const ch = input[i];
|
|
32
|
+
const next = i + 1 < n ? input[i + 1] : '';
|
|
33
|
+
if (ch === '/' && next === '/') {
|
|
34
|
+
// Line comment — replace until newline (preserve the newline so
|
|
35
|
+
// line numbers in downstream byte-offset math stay correct).
|
|
36
|
+
while (i < n && input[i] !== '\n') {
|
|
37
|
+
out.push(input[i] === '\n' ? '\n' : ' ');
|
|
38
|
+
i++;
|
|
39
|
+
}
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (ch === '/' && next === '*') {
|
|
43
|
+
out.push(' ');
|
|
44
|
+
i += 2;
|
|
45
|
+
while (i < n) {
|
|
46
|
+
if (input[i] === '*' && i + 1 < n && input[i + 1] === '/') {
|
|
47
|
+
out.push(' ');
|
|
48
|
+
i += 2;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
out.push(input[i] === '\n' ? '\n' : ' ');
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (ch === '"' || ch === "'") {
|
|
57
|
+
const quote = ch;
|
|
58
|
+
out.push(quote);
|
|
59
|
+
i++;
|
|
60
|
+
while (i < n && input[i] !== quote) {
|
|
61
|
+
if (input[i] === '\\' && i + 1 < n) {
|
|
62
|
+
out.push(input[i] === '\n' ? '\n' : ' ');
|
|
63
|
+
i++;
|
|
64
|
+
out.push(input[i] === '\n' ? '\n' : ' ');
|
|
65
|
+
i++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
out.push(input[i] === '\n' ? '\n' : ' ');
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
if (i < n) {
|
|
72
|
+
out.push(quote);
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
out.push(ch);
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
return out.join('');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=source-text.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type WeightedPoolInvariantDialect = 'balancer-v1' | 'balancer-v2' | 'beethoven-x' | 'raw-weighted-arithmetic';
|
|
2
|
+
export type WeightedPoolInvariantSignal = {
|
|
3
|
+
dialect: WeightedPoolInvariantDialect;
|
|
4
|
+
operation: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Recognize Balancer-style weighted-pool invariant math call vocabulary across
|
|
8
|
+
* the common V1 BNum, V2 FixedPoint, and Beethoven X LogExpMath dialects.
|
|
9
|
+
* This helper intentionally identifies math shape only; callers must still
|
|
10
|
+
* require their own exploit context such as a same-function flash loan and
|
|
11
|
+
* pool operation before emitting a finding.
|
|
12
|
+
*/
|
|
13
|
+
export declare function weightedPoolInvariantSignalFromCall(node: any): WeightedPoolInvariantSignal | null;
|
|
14
|
+
export declare function hasWeightedPoolInvariantShape(signals: Iterable<WeightedPoolInvariantSignal>): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Best-effort raw weighted arithmetic recognizer for `balance * weight / 1e18`
|
|
17
|
+
* style code. It is only meant to be consulted when the compiler profile says
|
|
18
|
+
* arithmetic can wrap (pre-0.8 or an `unchecked` block), preventing ordinary
|
|
19
|
+
* checked 0.8 math from becoming a stronger signal by itself.
|
|
20
|
+
*/
|
|
21
|
+
export declare function rawWeightedArithmeticSignal(node: any): WeightedPoolInvariantSignal | null;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.weightedPoolInvariantSignalFromCall = weightedPoolInvariantSignalFromCall;
|
|
4
|
+
exports.hasWeightedPoolInvariantShape = hasWeightedPoolInvariantShape;
|
|
5
|
+
exports.rawWeightedArithmeticSignal = rawWeightedArithmeticSignal;
|
|
6
|
+
const ast_1 = require("./ast");
|
|
7
|
+
const BALANCER_V1_METHODS = new Set(['bmul', 'bdiv', 'bpow']);
|
|
8
|
+
const BALANCER_V2_METHODS = new Set(['muldown', 'divdown', 'powdown']);
|
|
9
|
+
/**
|
|
10
|
+
* Recognize Balancer-style weighted-pool invariant math call vocabulary across
|
|
11
|
+
* the common V1 BNum, V2 FixedPoint, and Beethoven X LogExpMath dialects.
|
|
12
|
+
* This helper intentionally identifies math shape only; callers must still
|
|
13
|
+
* require their own exploit context such as a same-function flash loan and
|
|
14
|
+
* pool operation before emitting a finding.
|
|
15
|
+
*/
|
|
16
|
+
function weightedPoolInvariantSignalFromCall(node) {
|
|
17
|
+
if (!(0, ast_1.isNode)(node, 'FunctionCall'))
|
|
18
|
+
return null;
|
|
19
|
+
const callee = unwrapCallOptions(node.expression);
|
|
20
|
+
if (!(0, ast_1.isNode)(callee, 'MemberAccess'))
|
|
21
|
+
return null;
|
|
22
|
+
const memberName = String(callee.memberName || '').toLowerCase();
|
|
23
|
+
if (BALANCER_V1_METHODS.has(memberName)) {
|
|
24
|
+
return { dialect: 'balancer-v1', operation: memberName };
|
|
25
|
+
}
|
|
26
|
+
if (BALANCER_V2_METHODS.has(memberName)) {
|
|
27
|
+
return { dialect: 'balancer-v2', operation: memberName };
|
|
28
|
+
}
|
|
29
|
+
if (memberName === 'pow' && baseExpressionName(callee).toLowerCase() === 'logexpmath') {
|
|
30
|
+
return { dialect: 'beethoven-x', operation: 'logexpmath.pow' };
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function hasWeightedPoolInvariantShape(signals) {
|
|
35
|
+
const operations = new Set();
|
|
36
|
+
const dialects = new Set();
|
|
37
|
+
for (const signal of signals) {
|
|
38
|
+
operations.add(signal.operation);
|
|
39
|
+
dialects.add(signal.dialect);
|
|
40
|
+
}
|
|
41
|
+
if (operations.has('bpow') || operations.has('bdiv'))
|
|
42
|
+
return true;
|
|
43
|
+
if (operations.has('powdown'))
|
|
44
|
+
return true;
|
|
45
|
+
if (operations.has('logexpmath.pow') && (operations.has('muldown') || operations.has('bmul')))
|
|
46
|
+
return true;
|
|
47
|
+
if (dialects.has('raw-weighted-arithmetic'))
|
|
48
|
+
return true;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Best-effort raw weighted arithmetic recognizer for `balance * weight / 1e18`
|
|
53
|
+
* style code. It is only meant to be consulted when the compiler profile says
|
|
54
|
+
* arithmetic can wrap (pre-0.8 or an `unchecked` block), preventing ordinary
|
|
55
|
+
* checked 0.8 math from becoming a stronger signal by itself.
|
|
56
|
+
*/
|
|
57
|
+
function rawWeightedArithmeticSignal(node) {
|
|
58
|
+
if (!(0, ast_1.isNode)(node, 'BinaryOperation'))
|
|
59
|
+
return null;
|
|
60
|
+
const op = String(node.operator || '');
|
|
61
|
+
if (op !== '*' && op !== '/')
|
|
62
|
+
return null;
|
|
63
|
+
const text = expressionText(node).toLowerCase();
|
|
64
|
+
if (!/\b(b\d*|balances?|balance|amount|reserve|token)\b/.test(text))
|
|
65
|
+
return null;
|
|
66
|
+
if (!/\b(w\d*|weights?|weight)\b/.test(text))
|
|
67
|
+
return null;
|
|
68
|
+
return { dialect: 'raw-weighted-arithmetic', operation: op };
|
|
69
|
+
}
|
|
70
|
+
function unwrapCallOptions(expr) {
|
|
71
|
+
if (!expr)
|
|
72
|
+
return expr;
|
|
73
|
+
if ((0, ast_1.isNode)(expr, 'FunctionCallOptions') || (0, ast_1.isNode)(expr, 'NameValueExpression')) {
|
|
74
|
+
return unwrapCallOptions(expr.expression ?? expr);
|
|
75
|
+
}
|
|
76
|
+
return expr;
|
|
77
|
+
}
|
|
78
|
+
function baseExpressionName(memberAccess) {
|
|
79
|
+
const expr = memberAccess?.expression;
|
|
80
|
+
if (!expr)
|
|
81
|
+
return '';
|
|
82
|
+
if (typeof expr.name === 'string')
|
|
83
|
+
return expr.name;
|
|
84
|
+
if ((0, ast_1.isNode)(expr, 'Identifier') && typeof expr.name === 'string')
|
|
85
|
+
return expr.name;
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
function expressionText(node) {
|
|
89
|
+
if (!node || typeof node !== 'object')
|
|
90
|
+
return '';
|
|
91
|
+
if (typeof node.name === 'string')
|
|
92
|
+
return node.name;
|
|
93
|
+
if (typeof node.memberName === 'string')
|
|
94
|
+
return `${expressionText(node.expression)}.${node.memberName}`;
|
|
95
|
+
if (typeof node.number === 'string')
|
|
96
|
+
return node.number;
|
|
97
|
+
if ((0, ast_1.isNode)(node, 'IndexAccess'))
|
|
98
|
+
return `${expressionText(node.base)}[${expressionText(node.index)}]`;
|
|
99
|
+
if ((0, ast_1.isNode)(node, 'BinaryOperation'))
|
|
100
|
+
return `${expressionText(node.left)} ${node.operator || ''} ${expressionText(node.right)}`;
|
|
101
|
+
if ((0, ast_1.isNode)(node, 'TupleExpression'))
|
|
102
|
+
return (node.components || []).map(expressionText).join(',');
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=weighted-pool-invariant.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
export declare class AaveV2ReentrancyDetector {
|
|
3
|
+
readonly id = "aave-v2-reentrancy";
|
|
4
|
+
readonly patternKey = "aave-v2-reentrancy";
|
|
5
|
+
readonly supportedAstKinds: "parser"[];
|
|
6
|
+
scanAst(ast: any, file: string): ScanResult[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AaveV2ReentrancyDetector = void 0;
|
|
4
|
+
const ast_1 = require("./_common/ast");
|
|
5
|
+
const RULE_ID = 'aave-v2-reentrancy';
|
|
6
|
+
const PATTERN = `${RULE_ID}/missing-reentrancy-guard`;
|
|
7
|
+
const FLASHLOAN_ENTRYPOINTS = new Set(['flashloan', 'flashloansimple']);
|
|
8
|
+
const FLASHLOAN_CALLBACKS = new Set(['executeoperation']);
|
|
9
|
+
const FLASHLOAN_BASES = new Set(['iflashloanreceiver', 'flashloanreceiverbase']);
|
|
10
|
+
const GUARD_MODIFIERS = new Set(['nonreentrant', 'noreentrancy', 'lock']);
|
|
11
|
+
const ASSIGN_OPS = new Set([
|
|
12
|
+
'=', '+=', '-=', '*=', '/=', '%=',
|
|
13
|
+
'&=', '|=', '^=', '<<=', '>>=', '>>>=',
|
|
14
|
+
]);
|
|
15
|
+
const UNARY_MUTATORS = new Set(['++', '--', 'delete']);
|
|
16
|
+
function isNode(node, type) {
|
|
17
|
+
return node?.type === type;
|
|
18
|
+
}
|
|
19
|
+
function collectContracts(ast) {
|
|
20
|
+
const contracts = [];
|
|
21
|
+
for (const child of ast?.children || []) {
|
|
22
|
+
if (isNode(child, 'ContractDefinition'))
|
|
23
|
+
contracts.push(child);
|
|
24
|
+
}
|
|
25
|
+
return contracts;
|
|
26
|
+
}
|
|
27
|
+
function contractMembers(contract) {
|
|
28
|
+
return Array.isArray(contract?.subNodes) ? contract.subNodes : [];
|
|
29
|
+
}
|
|
30
|
+
function contractFunctions(contract) {
|
|
31
|
+
return contractMembers(contract).filter(node => isNode(node, 'FunctionDefinition'));
|
|
32
|
+
}
|
|
33
|
+
function isInterfaceLike(contract) {
|
|
34
|
+
const kind = String(contract?.kind || '').toLowerCase();
|
|
35
|
+
return kind === 'interface' || kind === 'library';
|
|
36
|
+
}
|
|
37
|
+
function functionName(fn) {
|
|
38
|
+
return String(fn?.name || '');
|
|
39
|
+
}
|
|
40
|
+
function lowerFunctionName(fn) {
|
|
41
|
+
return functionName(fn).toLowerCase();
|
|
42
|
+
}
|
|
43
|
+
function isExternallyCallable(fn) {
|
|
44
|
+
const visibility = String(fn?.visibility || '').toLowerCase();
|
|
45
|
+
return visibility === 'external' || visibility === 'public';
|
|
46
|
+
}
|
|
47
|
+
function isSkippedFunction(fn) {
|
|
48
|
+
if (!fn || !fn.body)
|
|
49
|
+
return true;
|
|
50
|
+
if (fn.isConstructor === true || fn.kind === 'constructor')
|
|
51
|
+
return true;
|
|
52
|
+
const mutability = String(fn.stateMutability || '').toLowerCase();
|
|
53
|
+
return mutability === 'view' || mutability === 'pure';
|
|
54
|
+
}
|
|
55
|
+
function modifierName(modifier) {
|
|
56
|
+
if (!modifier)
|
|
57
|
+
return '';
|
|
58
|
+
if (typeof modifier === 'string')
|
|
59
|
+
return modifier;
|
|
60
|
+
if (typeof modifier.name === 'string')
|
|
61
|
+
return modifier.name;
|
|
62
|
+
if (typeof modifier.modifierName?.name === 'string')
|
|
63
|
+
return modifier.modifierName.name;
|
|
64
|
+
if (typeof modifier.modifierName?.namePath === 'string')
|
|
65
|
+
return modifier.modifierName.namePath.split('.').pop() || '';
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
function hasReentrancyGuard(fn) {
|
|
69
|
+
for (const modifier of fn?.modifiers || []) {
|
|
70
|
+
const name = modifierName(modifier).toLowerCase();
|
|
71
|
+
if (GUARD_MODIFIERS.has(name))
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
function baseContractName(base) {
|
|
77
|
+
const raw = String(base?.baseName?.namePath || base?.baseName?.name || '');
|
|
78
|
+
return raw.split('.').pop() || '';
|
|
79
|
+
}
|
|
80
|
+
function inheritsFlashloanBase(contract) {
|
|
81
|
+
for (const base of contract?.baseContracts || []) {
|
|
82
|
+
if (FLASHLOAN_BASES.has(baseContractName(base).toLowerCase()))
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function hasFlashloanSurface(contract) {
|
|
88
|
+
if (inheritsFlashloanBase(contract))
|
|
89
|
+
return true;
|
|
90
|
+
for (const fn of contractFunctions(contract)) {
|
|
91
|
+
const name = lowerFunctionName(fn);
|
|
92
|
+
if (FLASHLOAN_ENTRYPOINTS.has(name) || FLASHLOAN_CALLBACKS.has(name))
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
function collectStateVariables(contract) {
|
|
98
|
+
const stateVars = new Set();
|
|
99
|
+
for (const member of contractMembers(contract)) {
|
|
100
|
+
if (!isNode(member, 'StateVariableDeclaration'))
|
|
101
|
+
continue;
|
|
102
|
+
for (const variable of member.variables || []) {
|
|
103
|
+
if (variable?.name)
|
|
104
|
+
stateVars.add(String(variable.name));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return stateVars;
|
|
108
|
+
}
|
|
109
|
+
function collectLocals(fn) {
|
|
110
|
+
const locals = new Set();
|
|
111
|
+
for (const param of fn?.parameters || []) {
|
|
112
|
+
if (param?.name)
|
|
113
|
+
locals.add(String(param.name));
|
|
114
|
+
}
|
|
115
|
+
for (const param of fn?.returnParameters || []) {
|
|
116
|
+
if (param?.name)
|
|
117
|
+
locals.add(String(param.name));
|
|
118
|
+
}
|
|
119
|
+
harvestLocalDeclarations(fn?.body, locals);
|
|
120
|
+
return locals;
|
|
121
|
+
}
|
|
122
|
+
function harvestLocalDeclarations(node, locals) {
|
|
123
|
+
if (!node || typeof node !== 'object')
|
|
124
|
+
return;
|
|
125
|
+
if (isNode(node, 'VariableDeclarationStatement')) {
|
|
126
|
+
for (const variable of node.variables || []) {
|
|
127
|
+
if (variable?.name)
|
|
128
|
+
locals.add(String(variable.name));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
for (const child of childNodes(node))
|
|
132
|
+
harvestLocalDeclarations(child, locals);
|
|
133
|
+
}
|
|
134
|
+
function refersToState(expr, stateVars, locals, aliases) {
|
|
135
|
+
if (!expr || typeof expr !== 'object')
|
|
136
|
+
return false;
|
|
137
|
+
if (isNode(expr, 'Identifier')) {
|
|
138
|
+
const name = String(expr.name || '');
|
|
139
|
+
if (aliases.has(name))
|
|
140
|
+
return true;
|
|
141
|
+
return stateVars.has(name) && !locals.has(name);
|
|
142
|
+
}
|
|
143
|
+
if (isNode(expr, 'IndexAccess'))
|
|
144
|
+
return refersToState(expr.base, stateVars, locals, aliases);
|
|
145
|
+
if (isNode(expr, 'MemberAccess'))
|
|
146
|
+
return refersToState(expr.expression, stateVars, locals, aliases);
|
|
147
|
+
if (isNode(expr, 'TupleExpression')) {
|
|
148
|
+
return (expr.components || []).some((component) => refersToState(component, stateVars, locals, aliases));
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
function harvestStorageAliasCandidates(node, candidates) {
|
|
153
|
+
if (!node || typeof node !== 'object')
|
|
154
|
+
return;
|
|
155
|
+
if (isNode(node, 'VariableDeclarationStatement')) {
|
|
156
|
+
for (const variable of node.variables || []) {
|
|
157
|
+
if (!variable?.name)
|
|
158
|
+
continue;
|
|
159
|
+
const location = String(variable.storageLocation || '').toLowerCase();
|
|
160
|
+
if (location !== 'storage')
|
|
161
|
+
continue;
|
|
162
|
+
candidates.push({ name: String(variable.name), init: node.initialValue });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const child of childNodes(node))
|
|
166
|
+
harvestStorageAliasCandidates(child, candidates);
|
|
167
|
+
}
|
|
168
|
+
function collectStorageAliases(fn, stateVars, locals) {
|
|
169
|
+
const aliases = new Set();
|
|
170
|
+
const candidates = [];
|
|
171
|
+
harvestStorageAliasCandidates(fn?.body, candidates);
|
|
172
|
+
if (candidates.length === 0)
|
|
173
|
+
return aliases;
|
|
174
|
+
let changed = true;
|
|
175
|
+
while (changed) {
|
|
176
|
+
changed = false;
|
|
177
|
+
for (const candidate of candidates) {
|
|
178
|
+
if (aliases.has(candidate.name))
|
|
179
|
+
continue;
|
|
180
|
+
if (!candidate.init)
|
|
181
|
+
continue;
|
|
182
|
+
if (refersToState(candidate.init, stateVars, locals, aliases)) {
|
|
183
|
+
aliases.add(candidate.name);
|
|
184
|
+
changed = true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return aliases;
|
|
189
|
+
}
|
|
190
|
+
function findStateMutation(node, stateVars, locals, aliases) {
|
|
191
|
+
if (!node || typeof node !== 'object')
|
|
192
|
+
return null;
|
|
193
|
+
if (isNode(node, 'BinaryOperation') && ASSIGN_OPS.has(String(node.operator))) {
|
|
194
|
+
if (refersToState(node.left, stateVars, locals, aliases))
|
|
195
|
+
return node;
|
|
196
|
+
}
|
|
197
|
+
if (isNode(node, 'UnaryOperation') && UNARY_MUTATORS.has(String(node.operator))) {
|
|
198
|
+
if (refersToState(node.subExpression, stateVars, locals, aliases))
|
|
199
|
+
return node;
|
|
200
|
+
}
|
|
201
|
+
for (const child of childNodes(node)) {
|
|
202
|
+
const mutation = findStateMutation(child, stateVars, locals, aliases);
|
|
203
|
+
if (mutation)
|
|
204
|
+
return mutation;
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
function childNodes(node) {
|
|
209
|
+
const out = [];
|
|
210
|
+
for (const [key, value] of Object.entries(node || {})) {
|
|
211
|
+
if (key === 'loc' || key === 'range' || key === 'typeName')
|
|
212
|
+
continue;
|
|
213
|
+
if (Array.isArray(value)) {
|
|
214
|
+
for (const item of value) {
|
|
215
|
+
if (item && typeof item === 'object')
|
|
216
|
+
out.push(item);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (value && typeof value === 'object') {
|
|
220
|
+
out.push(value);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
function locOf(node) {
|
|
226
|
+
const { line, column } = (0, ast_1.assertLoc)(node);
|
|
227
|
+
return { line, column };
|
|
228
|
+
}
|
|
229
|
+
class AaveV2ReentrancyDetector {
|
|
230
|
+
id = RULE_ID;
|
|
231
|
+
patternKey = RULE_ID;
|
|
232
|
+
supportedAstKinds = ['parser'];
|
|
233
|
+
scanAst(ast, file) {
|
|
234
|
+
if (!ast || typeof ast !== 'object')
|
|
235
|
+
return [];
|
|
236
|
+
const findings = [];
|
|
237
|
+
for (const contract of collectContracts(ast)) {
|
|
238
|
+
if (isInterfaceLike(contract))
|
|
239
|
+
continue;
|
|
240
|
+
if (!hasFlashloanSurface(contract))
|
|
241
|
+
continue;
|
|
242
|
+
const stateVars = collectStateVariables(contract);
|
|
243
|
+
if (stateVars.size === 0)
|
|
244
|
+
continue;
|
|
245
|
+
const contractName = String(contract.name || '');
|
|
246
|
+
for (const fn of contractFunctions(contract)) {
|
|
247
|
+
if (!isExternallyCallable(fn))
|
|
248
|
+
continue;
|
|
249
|
+
if (isSkippedFunction(fn))
|
|
250
|
+
continue;
|
|
251
|
+
if (hasReentrancyGuard(fn))
|
|
252
|
+
continue;
|
|
253
|
+
const locals = collectLocals(fn);
|
|
254
|
+
const aliases = collectStorageAliases(fn, stateVars, locals);
|
|
255
|
+
const mutation = findStateMutation(fn.body, stateVars, locals, aliases);
|
|
256
|
+
if (!mutation)
|
|
257
|
+
continue;
|
|
258
|
+
const name = functionName(fn);
|
|
259
|
+
const loc = locOf(fn);
|
|
260
|
+
findings.push({
|
|
261
|
+
file,
|
|
262
|
+
contract: contractName,
|
|
263
|
+
'function': name,
|
|
264
|
+
line: loc.line,
|
|
265
|
+
column: loc.column,
|
|
266
|
+
pattern: PATTERN,
|
|
267
|
+
confidence: 'high',
|
|
268
|
+
category: 'vulnerability',
|
|
269
|
+
ruleId: RULE_ID,
|
|
270
|
+
severity: 'high',
|
|
271
|
+
message: `Aave V2-style reentrancy exposure in '${contractName}.${name}': externally callable state mutation on a flash-loan-shaped contract lacks a recognized reentrancy guard.`,
|
|
272
|
+
rationale: 'The contract exposes a flashLoan/flashLoanSimple entrypoint, an executeOperation callback, or a recognized flashloan receiver base, and this public/external function mutates protocol or accounting state without nonReentrant, noReentrancy, or lock.',
|
|
273
|
+
suggestedFix: 'Wrap the externally callable mutator or callback with a recognized reentrancy guard and keep accounting updates ordered before callback-driven external interactions where possible.',
|
|
274
|
+
contractName,
|
|
275
|
+
functionName: name,
|
|
276
|
+
sourceLocation: { line: loc.line, column: loc.column },
|
|
277
|
+
findingId: '',
|
|
278
|
+
contractHash: '',
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return findings;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.AaveV2ReentrancyDetector = AaveV2ReentrancyDetector;
|
|
286
|
+
//# sourceMappingURL=aave-v2-reentrancy.js.map
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access-control detector (rule id `access-control`). Extracted from
|
|
3
|
+
* `src/index.ts` per roadmap item 1.1 slice 5/N. Public API surface
|
|
4
|
+
* is unchanged — `src/index.ts` re-exports `AccessControlDetector`
|
|
5
|
+
* so `createDefaultDetectorRegistry` and downstream consumers
|
|
6
|
+
* continue to see it at the same path.
|
|
7
|
+
*
|
|
8
|
+
* The detector flags externally callable privileged operations that
|
|
9
|
+
* lack a recognised access-control guard (modifier, msg.sender owner
|
|
10
|
+
* check, role-based check, etc.). See
|
|
11
|
+
* `docs/detectors/access-control.md` for the user-facing contract.
|
|
12
|
+
*
|
|
13
|
+
* Privileged-name recognition currently uses an inline regex
|
|
14
|
+
* (`/owner|admin|role|.../i`) — roadmap item 1.2 will centralise this
|
|
15
|
+
* predicate in `_common/access-control.ts:isPrivilegedIdentifier`.
|
|
16
|
+
* That refactor is intentionally a separate slice; this slice is
|
|
17
|
+
* mechanical extraction only.
|
|
18
|
+
*/
|
|
19
|
+
import type { ScanResult } from '../index';
|
|
20
|
+
import type { SemanticModel } from '../semantic/model';
|
|
21
|
+
export declare class AccessControlDetector {
|
|
22
|
+
readonly id = "access-control";
|
|
23
|
+
readonly patternKey = "access-control";
|
|
24
|
+
readonly supportedAstKinds: ("parser" | "solc")[];
|
|
25
|
+
findings: ScanResult[];
|
|
26
|
+
currentFile: string;
|
|
27
|
+
private currentContract;
|
|
28
|
+
private currentContractNode;
|
|
29
|
+
private currentFunction;
|
|
30
|
+
private currentFunctionNode;
|
|
31
|
+
private currentFunctionExternal;
|
|
32
|
+
private currentFunctionGuarded;
|
|
33
|
+
private guardSeenBeforeFirstPrivilegedOp;
|
|
34
|
+
private guardSeenBeforeFirstPrivilegedOpStack;
|
|
35
|
+
private currentPrivilegedOperation;
|
|
36
|
+
private currentPrivilegedOperationHadPriorInlineGuard;
|
|
37
|
+
private stateVariablesByContract;
|
|
38
|
+
private functionNodesByContract;
|
|
39
|
+
private privilegedFunctionSummaryCache;
|
|
40
|
+
private activePrivilegedFunctionSummaries;
|
|
41
|
+
private localVariables;
|
|
42
|
+
private semantic;
|
|
43
|
+
setFile(file: string): void;
|
|
44
|
+
setSemanticModel(model: SemanticModel | undefined): void;
|
|
45
|
+
getFindings(): ScanResult[];
|
|
46
|
+
ContractDefinition(node: any): void;
|
|
47
|
+
ContractDefinition_post(node: any): void;
|
|
48
|
+
StateVariableDeclaration(node: any): void;
|
|
49
|
+
FunctionDefinition(node: any): void;
|
|
50
|
+
FunctionDefinition_post(_node: any): void;
|
|
51
|
+
private walkInheritedFunctions;
|
|
52
|
+
private emitInheritedFinding;
|
|
53
|
+
private emitCurrentFinding;
|
|
54
|
+
VariableDeclarationStatement(node: any): void;
|
|
55
|
+
ExpressionStatement(node: any): void;
|
|
56
|
+
private resetFunctionState;
|
|
57
|
+
enterNestedStatementBody(): void;
|
|
58
|
+
exitNestedStatementBody(): void;
|
|
59
|
+
private analyzeNestedParserNode;
|
|
60
|
+
private analyzeParserNode;
|
|
61
|
+
private getCurrentStateVariables;
|
|
62
|
+
private registerContractFunctions;
|
|
63
|
+
private getContractMembers;
|
|
64
|
+
private mergeInheritedStateVariables;
|
|
65
|
+
private getBaseContractNames;
|
|
66
|
+
private isExternallyCallable;
|
|
67
|
+
private getFunctionKind;
|
|
68
|
+
private hasRecognizedGuardModifier;
|
|
69
|
+
private isRecognizedGuardName;
|
|
70
|
+
private containsRecognizedInlineGuard;
|
|
71
|
+
private isRecognizedInlineGuard;
|
|
72
|
+
private isAuthPredicate;
|
|
73
|
+
private isMsgSenderEqualityLeaf;
|
|
74
|
+
private isAuthorizationTarget;
|
|
75
|
+
private isHasRoleCallLeaf;
|
|
76
|
+
private isRenounceRoleSelfCheckLeaf;
|
|
77
|
+
private isAccountReference;
|
|
78
|
+
private isMsgSender;
|
|
79
|
+
private recordPrivilegedOperation;
|
|
80
|
+
private describePrivilegedOperation;
|
|
81
|
+
private findPrivilegedCall;
|
|
82
|
+
private findPrivilegedAssignmentRoot;
|
|
83
|
+
private containsPrivilegedOperation;
|
|
84
|
+
private isPrivilegedOperation;
|
|
85
|
+
private isSameContractPrivilegedHelperCall;
|
|
86
|
+
private isAuthorityHelperPropagationCandidate;
|
|
87
|
+
private isAuthoritySetupOrManagementName;
|
|
88
|
+
private functionMutatesPrivilegedState;
|
|
89
|
+
private containsPrivilegedOperationInSubtree;
|
|
90
|
+
private collectFunctionLocalVariables;
|
|
91
|
+
private collectLocalVariableDeclarations;
|
|
92
|
+
private isAssignmentOperator;
|
|
93
|
+
private isPrivilegedStateReference;
|
|
94
|
+
private getReferenceRoot;
|
|
95
|
+
private isPrivilegedName;
|
|
96
|
+
private isPrivilegedFundTransferFunction;
|
|
97
|
+
private isValueTransfer;
|
|
98
|
+
private nameValueExpressionHasValue;
|
|
99
|
+
private memberName;
|
|
100
|
+
private getCallName;
|
|
101
|
+
private getNodeName;
|
|
102
|
+
private childNodes;
|
|
103
|
+
}
|