@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,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReflectionTokenBalanceDesyncDetector = void 0;
|
|
4
|
+
const ast_1 = require("./_common/ast");
|
|
5
|
+
const access_control_1 = require("./_common/access-control");
|
|
6
|
+
const RULE_ID = 'reflection-token-balance-desync';
|
|
7
|
+
const REFLECTION_SIGNAL = /reflect|deliver|rtotal|ttotal|rowned|towned|ramount|tamount|reflected|token/i;
|
|
8
|
+
const ASSIGNMENT_OPERATORS = new Set(['=', '-=', '+=', '*=', '/=']);
|
|
9
|
+
// SafeMath helpers (`add`/`sub`/`mul`/`div`) are pure arithmetic — they return a
|
|
10
|
+
// new value and do not mutate the receiver. Mutation is tracked via assignment
|
|
11
|
+
// operators in BinaryOperation; only semantically mutating container methods
|
|
12
|
+
// belong here.
|
|
13
|
+
const MUTATING_MEMBERS = new Set(['push', 'pop']);
|
|
14
|
+
function getDirectCallName(expr) {
|
|
15
|
+
if (!expr)
|
|
16
|
+
return '';
|
|
17
|
+
if (expr.type === 'Identifier')
|
|
18
|
+
return expr.name || '';
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
function getMemberName(expr) {
|
|
22
|
+
if (!expr)
|
|
23
|
+
return '';
|
|
24
|
+
if (expr.type === 'MemberAccess')
|
|
25
|
+
return expr.memberName || '';
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
function getBaseName(node) {
|
|
29
|
+
if (!node || typeof node !== 'object')
|
|
30
|
+
return null;
|
|
31
|
+
if (node.type === 'Identifier')
|
|
32
|
+
return node.name;
|
|
33
|
+
if (node.type === 'MemberAccess') {
|
|
34
|
+
return node.memberName;
|
|
35
|
+
}
|
|
36
|
+
if (node.type === 'IndexAccess') {
|
|
37
|
+
return getBaseName(node.base || node.baseExpression);
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function isPublicOrExternal(node) {
|
|
42
|
+
if (node.visibility === 'public' || node.visibility === 'external')
|
|
43
|
+
return true;
|
|
44
|
+
if (node.visibility === 'default')
|
|
45
|
+
return true; // Solidity default is public
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
class ReflectionTokenBalanceDesyncDetector {
|
|
49
|
+
id = RULE_ID;
|
|
50
|
+
patternKey = RULE_ID;
|
|
51
|
+
supportedAstKinds = ['parser'];
|
|
52
|
+
currentFile = '';
|
|
53
|
+
currentContract = '';
|
|
54
|
+
findings = [];
|
|
55
|
+
stateVariables = new Set();
|
|
56
|
+
mappings = new Set();
|
|
57
|
+
rateVariables = new Set();
|
|
58
|
+
divisions = new Map();
|
|
59
|
+
currentFunction = null;
|
|
60
|
+
setFile(file) {
|
|
61
|
+
this.currentFile = file;
|
|
62
|
+
this.currentContract = '';
|
|
63
|
+
this.findings = [];
|
|
64
|
+
this.currentFunction = null;
|
|
65
|
+
}
|
|
66
|
+
getFindings() {
|
|
67
|
+
return this.findings;
|
|
68
|
+
}
|
|
69
|
+
ContractDefinition(node) {
|
|
70
|
+
this.currentContract = node.name || '';
|
|
71
|
+
this.stateVariables.clear();
|
|
72
|
+
this.mappings.clear();
|
|
73
|
+
this.rateVariables.clear();
|
|
74
|
+
this.divisions.clear();
|
|
75
|
+
this.currentFunction = null;
|
|
76
|
+
}
|
|
77
|
+
ContractDefinition_post() {
|
|
78
|
+
this.currentContract = '';
|
|
79
|
+
this.stateVariables.clear();
|
|
80
|
+
this.mappings.clear();
|
|
81
|
+
this.rateVariables.clear();
|
|
82
|
+
this.divisions.clear();
|
|
83
|
+
this.currentFunction = null;
|
|
84
|
+
}
|
|
85
|
+
['ContractDefinition:exit']() {
|
|
86
|
+
this.ContractDefinition_post();
|
|
87
|
+
}
|
|
88
|
+
StateVariableDeclaration(node) {
|
|
89
|
+
for (const variable of node.variables || []) {
|
|
90
|
+
if (variable?.name) {
|
|
91
|
+
this.stateVariables.add(variable.name);
|
|
92
|
+
if (variable.typeName && (0, ast_1.isNode)(variable.typeName, 'Mapping')) {
|
|
93
|
+
this.mappings.add(variable.name);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.refreshRateVariables();
|
|
98
|
+
}
|
|
99
|
+
BinaryOperation(node) {
|
|
100
|
+
if (node.operator === '/') {
|
|
101
|
+
this.recordDivision(node.left || node.leftExpression, node.right || node.rightExpression);
|
|
102
|
+
}
|
|
103
|
+
if (!this.currentFunction || !ASSIGNMENT_OPERATORS.has(node.operator))
|
|
104
|
+
return;
|
|
105
|
+
const leftName = getBaseName(node.left || node.leftExpression);
|
|
106
|
+
this.recordFunctionMutation(leftName);
|
|
107
|
+
}
|
|
108
|
+
FunctionCall(node) {
|
|
109
|
+
const mname = getMemberName(node.expression);
|
|
110
|
+
if (mname === 'div' && (node.arguments || []).length === 1) {
|
|
111
|
+
this.recordDivision(node.expression.expression, (node.arguments || [])[0]);
|
|
112
|
+
}
|
|
113
|
+
if (!this.currentFunction)
|
|
114
|
+
return;
|
|
115
|
+
const cname = getDirectCallName(node.expression);
|
|
116
|
+
if (cname === 'require' || cname === 'assert') {
|
|
117
|
+
const arg = (node.arguments || [])[0];
|
|
118
|
+
if ((0, access_control_1.requireExpressesAccessControl)(arg, (name) => access_control_1.DEFAULT_PRIVILEGED_KEYWORDS.includes(name.toLowerCase()))) {
|
|
119
|
+
this.currentFunction.hasAccessControl = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (MUTATING_MEMBERS.has(mname)) {
|
|
123
|
+
const leftName = getBaseName(node.expression.expression);
|
|
124
|
+
this.recordFunctionMutation(leftName);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
FunctionDefinition(node) {
|
|
128
|
+
this.currentFunction = null;
|
|
129
|
+
if (!node.body)
|
|
130
|
+
return;
|
|
131
|
+
if (!isPublicOrExternal(node))
|
|
132
|
+
return;
|
|
133
|
+
this.currentFunction = {
|
|
134
|
+
node,
|
|
135
|
+
modifiedStateVars: new Set(),
|
|
136
|
+
modifiedMappings: new Set(),
|
|
137
|
+
hasAccessControl: (0, access_control_1.hasRecognisedAccessControlModifier)(node),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
FunctionDefinition_post(node) {
|
|
141
|
+
if (!this.currentFunction || this.currentFunction.node !== node)
|
|
142
|
+
return;
|
|
143
|
+
const fn = this.currentFunction;
|
|
144
|
+
this.currentFunction = null;
|
|
145
|
+
if (fn.hasAccessControl)
|
|
146
|
+
return;
|
|
147
|
+
if (fn.modifiedMappings.size === 0)
|
|
148
|
+
return;
|
|
149
|
+
// Check if it modifies exactly one side of a division pair
|
|
150
|
+
let isDesync = false;
|
|
151
|
+
for (const div of this.divisions.values()) {
|
|
152
|
+
if (!this.stateVariables.has(div.a) || !this.stateVariables.has(div.b))
|
|
153
|
+
continue;
|
|
154
|
+
const modifiesA = fn.modifiedStateVars.has(div.a);
|
|
155
|
+
const modifiesB = fn.modifiedStateVars.has(div.b);
|
|
156
|
+
if (modifiesA && !modifiesB) {
|
|
157
|
+
isDesync = true;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
if (!modifiesA && modifiesB) {
|
|
161
|
+
isDesync = true;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!isDesync)
|
|
166
|
+
return;
|
|
167
|
+
// Surface signal check
|
|
168
|
+
const fnName = node.name || '';
|
|
169
|
+
let hasSignal = REFLECTION_SIGNAL.test(fnName);
|
|
170
|
+
if (!hasSignal) {
|
|
171
|
+
for (const mv of fn.modifiedStateVars) {
|
|
172
|
+
if (REFLECTION_SIGNAL.test(mv))
|
|
173
|
+
hasSignal = true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!hasSignal) {
|
|
177
|
+
for (const mm of fn.modifiedMappings) {
|
|
178
|
+
if (REFLECTION_SIGNAL.test(mm))
|
|
179
|
+
hasSignal = true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Also check rate variables
|
|
183
|
+
if (!hasSignal) {
|
|
184
|
+
for (const rv of this.rateVariables) {
|
|
185
|
+
if (REFLECTION_SIGNAL.test(rv))
|
|
186
|
+
hasSignal = true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (!hasSignal)
|
|
190
|
+
return;
|
|
191
|
+
const { line, column } = (0, ast_1.assertLoc)(node);
|
|
192
|
+
this.findings.push({
|
|
193
|
+
file: this.currentFile,
|
|
194
|
+
contract: this.currentContract,
|
|
195
|
+
function: node.name || '<anonymous>',
|
|
196
|
+
line,
|
|
197
|
+
column,
|
|
198
|
+
pattern: RULE_ID,
|
|
199
|
+
confidence: 'high',
|
|
200
|
+
ruleId: RULE_ID,
|
|
201
|
+
severity: 'high',
|
|
202
|
+
message: `Reflection token balance desync in '${node.name || '<anonymous>'}': function asymmetrically modifies the reflected ledger or rate without updating the other side proportionally, allowing repeated drains.`,
|
|
203
|
+
contractName: this.currentContract,
|
|
204
|
+
functionName: node.name || '<anonymous>',
|
|
205
|
+
findingId: '',
|
|
206
|
+
contractHash: ''
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
['FunctionDefinition:exit'](node) {
|
|
210
|
+
this.FunctionDefinition_post(node);
|
|
211
|
+
}
|
|
212
|
+
recordDivision(left, right) {
|
|
213
|
+
const leftName = getBaseName(left);
|
|
214
|
+
const rightName = getBaseName(right);
|
|
215
|
+
if (!leftName || !rightName)
|
|
216
|
+
return;
|
|
217
|
+
const key = `${leftName}/${rightName}`;
|
|
218
|
+
if (!this.divisions.has(key)) {
|
|
219
|
+
this.divisions.set(key, { a: leftName, b: rightName });
|
|
220
|
+
}
|
|
221
|
+
if (this.stateVariables.has(leftName) && this.stateVariables.has(rightName)) {
|
|
222
|
+
this.rateVariables.add(leftName);
|
|
223
|
+
this.rateVariables.add(rightName);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
refreshRateVariables() {
|
|
227
|
+
for (const div of this.divisions.values()) {
|
|
228
|
+
if (this.stateVariables.has(div.a) && this.stateVariables.has(div.b)) {
|
|
229
|
+
this.rateVariables.add(div.a);
|
|
230
|
+
this.rateVariables.add(div.b);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
recordFunctionMutation(name) {
|
|
235
|
+
if (!this.currentFunction || !name || !this.stateVariables.has(name))
|
|
236
|
+
return;
|
|
237
|
+
if (this.mappings.has(name)) {
|
|
238
|
+
this.currentFunction.modifiedMappings.add(name);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.currentFunction.modifiedStateVars.add(name);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.ReflectionTokenBalanceDesyncDetector = ReflectionTokenBalanceDesyncDetector;
|
|
246
|
+
//# sourceMappingURL=reflection-token-balance-desync.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
import type { SemanticModel } from '../semantic/model';
|
|
3
|
+
import type { TaintTracker } from '../semantic/taint-tracker';
|
|
4
|
+
import type { Detector, DetectorProfileEntry } from './types';
|
|
5
|
+
export declare class DetectorRegistry {
|
|
6
|
+
private readonly detectors;
|
|
7
|
+
private readonly fanoutCache;
|
|
8
|
+
private readonly profile;
|
|
9
|
+
private readonly profileStats;
|
|
10
|
+
constructor(options?: {
|
|
11
|
+
profile?: boolean;
|
|
12
|
+
});
|
|
13
|
+
register(detector: Detector): this;
|
|
14
|
+
ids(): string[];
|
|
15
|
+
detectorsForSarif(): Detector[];
|
|
16
|
+
runAll(ast: any, file: string, sourceText?: string, rules?: string[], enabledRules?: string[], ignorePatterns?: string[], semantic?: SemanticModel, taint?: TaintTracker, solcVersion?: string, ignoredDetectorIds?: string[], tier?: 'core' | 'extended' | 'all'): ScanResult[];
|
|
17
|
+
ignoredDetectorIds(rules?: string[], enabledRules?: string[], ignorePatterns?: string[]): string[];
|
|
18
|
+
private getOrBuildFanout;
|
|
19
|
+
/**
|
|
20
|
+
* Accumulate one detector visit into the profile stats. Cheap (Map
|
|
21
|
+
* lookup + bigint add); only called when `SOLAST_PROFILE=1`.
|
|
22
|
+
*/
|
|
23
|
+
private recordProfile;
|
|
24
|
+
/**
|
|
25
|
+
* Render the accumulated per-detector profile stats as a stable
|
|
26
|
+
* multi-line summary, sorted by total time descending. Returns the
|
|
27
|
+
* empty string when profiling was not enabled or no detector ran.
|
|
28
|
+
* The caller (typically the CLI, after scan completion) decides
|
|
29
|
+
* where to write the summary — stderr is the convention so the
|
|
30
|
+
* NDJSON / SARIF stdout pipeline stays clean.
|
|
31
|
+
*/
|
|
32
|
+
formatProfileSummary(): string;
|
|
33
|
+
getProfileStats(): DetectorProfileEntry[];
|
|
34
|
+
}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DetectorRegistry = void 0;
|
|
7
|
+
const parser_1 = __importDefault(require("@solidity-parser/parser"));
|
|
8
|
+
const solc_walker_1 = require("../ast/solc-walker");
|
|
9
|
+
const glob_1 = require("../rules/glob");
|
|
10
|
+
const tiers_1 = require("../rules/tiers");
|
|
11
|
+
const types_1 = require("./types");
|
|
12
|
+
class DetectorRegistry {
|
|
13
|
+
detectors = [];
|
|
14
|
+
// Memoized fan-out visitor objects, keyed by `astKind|rule-set|enabled-set`.
|
|
15
|
+
// Building the fan-out walks every detector's prototype chain and binds
|
|
16
|
+
// each visitor method, which is repeated work if a registry is reused
|
|
17
|
+
// across files. Cache entries are invalidated on register().
|
|
18
|
+
fanoutCache = new Map();
|
|
19
|
+
// P.2 telemetry: aggregate stats per detector id, accumulating across
|
|
20
|
+
// every `runAll` call on this registry. Empty / unused when
|
|
21
|
+
// `SOLAST_PROFILE` is not `'1'` at module load.
|
|
22
|
+
profile;
|
|
23
|
+
profileStats = new Map();
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
this.profile = options.profile ?? types_1.PROFILE_ENABLED;
|
|
26
|
+
}
|
|
27
|
+
register(detector) {
|
|
28
|
+
// supportedAstKinds is mandatory at registration time (roadmap 1.5,
|
|
29
|
+
// review G.6). The 0.2 conformance gate previously enforced this
|
|
30
|
+
// statically over the registry returned by
|
|
31
|
+
// `createDefaultDetectorRegistry`; the exemption-list scaffold has
|
|
32
|
+
// since been drained to zero so the runtime check below is now the
|
|
33
|
+
// authoritative source of truth. A missing or invalid field is a
|
|
34
|
+
// programming error in the detector class and must surface
|
|
35
|
+
// immediately — not silently produce a detector that gets dispatched
|
|
36
|
+
// for AST kinds it can't handle.
|
|
37
|
+
if (!Array.isArray(detector.supportedAstKinds) || detector.supportedAstKinds.length === 0) {
|
|
38
|
+
throw new Error(`Detector "${detector.id}" must declare supportedAstKinds: `
|
|
39
|
+
+ `add a readonly supportedAstKinds = ['parser' as const] (or ['solc' as const], or both) field on the class. `
|
|
40
|
+
+ `See CONTRIBUTING.md.`);
|
|
41
|
+
}
|
|
42
|
+
for (const kind of detector.supportedAstKinds) {
|
|
43
|
+
if (kind !== 'parser' && kind !== 'solc') {
|
|
44
|
+
throw new Error(`Detector "${detector.id}" has invalid supportedAstKinds entry ${JSON.stringify(kind)}: `
|
|
45
|
+
+ `expected "parser" or "solc".`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.detectors.push(detector);
|
|
49
|
+
if (this.fanoutCache.size > 0)
|
|
50
|
+
this.fanoutCache.clear();
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
ids() {
|
|
54
|
+
return this.detectors.map(detector => detector.id);
|
|
55
|
+
}
|
|
56
|
+
detectorsForSarif() {
|
|
57
|
+
return this.detectors.slice();
|
|
58
|
+
}
|
|
59
|
+
runAll(ast, file, sourceText, rules, enabledRules, ignorePatterns, semantic, taint, solcVersion, ignoredDetectorIds, tier) {
|
|
60
|
+
const astKind = getAstKind(ast);
|
|
61
|
+
if (!astKind)
|
|
62
|
+
return [];
|
|
63
|
+
const results = [];
|
|
64
|
+
const selectedRules = rules ? new Set(rules) : null;
|
|
65
|
+
const enabledRuleSet = enabledRules ? new Set(enabledRules) : null;
|
|
66
|
+
const ignoredRuleSet = ignoredDetectorIds ? new Set(ignoredDetectorIds) : null;
|
|
67
|
+
// Construct the DetectorContext once per runAll call; detectors that
|
|
68
|
+
// consume cross-file information receive the same instance (so they
|
|
69
|
+
// can cache lookups via reference equality if useful).
|
|
70
|
+
const ctx = { file, semantic, taint, solcVersion };
|
|
71
|
+
// Filter eligible detectors once. Sort the visitor-style ones into a
|
|
72
|
+
// dedicated bucket so we can fan one walk out to all of them; the
|
|
73
|
+
// scanAst-style ones drive their own traversal and run as before.
|
|
74
|
+
const visitorDetectors = [];
|
|
75
|
+
for (const detector of this.detectors) {
|
|
76
|
+
if (selectedRules && !selectedRules.has(detector.id))
|
|
77
|
+
continue;
|
|
78
|
+
if (!selectedRules && detector.enabledByDefault === false && !enabledRuleSet?.has(detector.id))
|
|
79
|
+
continue;
|
|
80
|
+
if (ignoredRuleSet?.has(detector.id))
|
|
81
|
+
continue;
|
|
82
|
+
if (matchesAnyRuleGlob(detector.id, ignorePatterns))
|
|
83
|
+
continue;
|
|
84
|
+
if (tier && tier !== 'all' && tiers_1.ruleTiers[detector.id] !== tier)
|
|
85
|
+
continue;
|
|
86
|
+
if (detector.supportedAstKinds && !detector.supportedAstKinds.includes(astKind))
|
|
87
|
+
continue;
|
|
88
|
+
if (hasVisitorMethods(detector)) {
|
|
89
|
+
visitorDetectors.push(detector);
|
|
90
|
+
}
|
|
91
|
+
else if (detector.scanAst) {
|
|
92
|
+
if (this.profile) {
|
|
93
|
+
const t0 = process.hrtime.bigint();
|
|
94
|
+
const r = detector.scanAst(ast, file, sourceText, ctx);
|
|
95
|
+
const t1 = process.hrtime.bigint();
|
|
96
|
+
this.recordProfile(detector.id, t1 - t0, 1);
|
|
97
|
+
results.push(...r);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
results.push(...detector.scanAst(ast, file, sourceText, ctx));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const assignTiers = (findings) => {
|
|
105
|
+
for (const res of findings) {
|
|
106
|
+
if (!res.tier) {
|
|
107
|
+
res.tier = tiers_1.ruleTiers[res.ruleId] || 'extended';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return findings;
|
|
111
|
+
};
|
|
112
|
+
if (visitorDetectors.length === 0)
|
|
113
|
+
return assignTiers(results);
|
|
114
|
+
// Single-pass shared visitor pump (review finding C1).
|
|
115
|
+
//
|
|
116
|
+
// Previously each detector got its own AST walk via parser.visit /
|
|
117
|
+
// walkSolcAst. With ~100+ detectors registered today that meant the
|
|
118
|
+
// same tree was traversed once per detector, multiplying the work
|
|
119
|
+
// by the registry size. The fan-out below builds one visitor object
|
|
120
|
+
// whose handler for each event fans out to every detector that
|
|
121
|
+
// subscribes to that event, walks the AST exactly once, then
|
|
122
|
+
// collects each detector's findings.
|
|
123
|
+
//
|
|
124
|
+
// Behavior preservation: from any single detector's perspective the
|
|
125
|
+
// sequence of node visits is identical (document order, both entry
|
|
126
|
+
// and post hooks). Detectors don't observe each other's state, and
|
|
127
|
+
// none of the current detectors use a visitor return value to
|
|
128
|
+
// short-circuit traversal, so the multi-subscriber dispatch matches
|
|
129
|
+
// the original per-detector walk in observable outcomes.
|
|
130
|
+
for (const detector of visitorDetectors) {
|
|
131
|
+
detector.setFile?.(file);
|
|
132
|
+
detector.setContext?.(ctx);
|
|
133
|
+
detector.setSourceText?.(sourceText);
|
|
134
|
+
detector.setSemanticModel?.(semantic);
|
|
135
|
+
}
|
|
136
|
+
const fanout = this.getOrBuildFanout(astKind, visitorDetectors, selectedRules, enabledRuleSet, this.profile);
|
|
137
|
+
if (astKind === 'parser') {
|
|
138
|
+
parser_1.default.visit(ast, fanout);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
(0, solc_walker_1.walkSolcAst)(ast, fanout, sourceText);
|
|
142
|
+
}
|
|
143
|
+
for (const detector of visitorDetectors) {
|
|
144
|
+
results.push(...(detector.getFindings?.() ?? []));
|
|
145
|
+
}
|
|
146
|
+
// 4. Return results with tier assigned.
|
|
147
|
+
for (const res of results) {
|
|
148
|
+
if (!res.tier) {
|
|
149
|
+
res.tier = tiers_1.ruleTiers[res.ruleId] || 'extended';
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
ignoredDetectorIds(rules, enabledRules, ignorePatterns) {
|
|
155
|
+
if (!ignorePatterns || ignorePatterns.length === 0)
|
|
156
|
+
return [];
|
|
157
|
+
const selectedRules = rules ? new Set(rules) : null;
|
|
158
|
+
const enabledRuleSet = enabledRules ? new Set(enabledRules) : null;
|
|
159
|
+
const ignored = [];
|
|
160
|
+
for (const detector of this.detectors) {
|
|
161
|
+
if (selectedRules && !selectedRules.has(detector.id))
|
|
162
|
+
continue;
|
|
163
|
+
if (!selectedRules && detector.enabledByDefault === false && !enabledRuleSet?.has(detector.id))
|
|
164
|
+
continue;
|
|
165
|
+
if (matchesAnyRuleGlob(detector.id, ignorePatterns))
|
|
166
|
+
ignored.push(detector.id);
|
|
167
|
+
}
|
|
168
|
+
return ignored.sort((a, b) => a.localeCompare(b));
|
|
169
|
+
}
|
|
170
|
+
getOrBuildFanout(astKind, visitorDetectors, selectedRules, enabledRuleSet, profile) {
|
|
171
|
+
const ruleKey = selectedRules ? [...selectedRules].sort().join(',') : '*';
|
|
172
|
+
const enabledKey = enabledRuleSet ? [...enabledRuleSet].sort().join(',') : '-';
|
|
173
|
+
// Cache key includes profile flag because the profiled fanout uses
|
|
174
|
+
// wrapper closures that record timing — a non-profiled run would
|
|
175
|
+
// otherwise reuse the slower wrappers.
|
|
176
|
+
const cacheKey = `${astKind}|${ruleKey}|${enabledKey}|p${profile ? '1' : '0'}`;
|
|
177
|
+
const cached = this.fanoutCache.get(cacheKey);
|
|
178
|
+
// Identity check on the visitor-detector list: a cached entry is
|
|
179
|
+
// only reusable when the eligible-detector array has the same
|
|
180
|
+
// shape — protects against subtle drift if the caller mutates
|
|
181
|
+
// detectors between calls.
|
|
182
|
+
if (cached && cached.visitorDetectors.length === visitorDetectors.length) {
|
|
183
|
+
let same = true;
|
|
184
|
+
for (let i = 0; i < visitorDetectors.length; i++) {
|
|
185
|
+
if (cached.visitorDetectors[i] !== visitorDetectors[i]) {
|
|
186
|
+
same = false;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (same)
|
|
191
|
+
return cached.fanout;
|
|
192
|
+
}
|
|
193
|
+
const fanout = buildFanoutVisitor(visitorDetectors, profile ? (detectorId, timeNs) => this.recordProfile(detectorId, timeNs, 1) : undefined);
|
|
194
|
+
this.fanoutCache.set(cacheKey, { visitorDetectors: visitorDetectors.slice(), fanout });
|
|
195
|
+
return fanout;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Accumulate one detector visit into the profile stats. Cheap (Map
|
|
199
|
+
* lookup + bigint add); only called when `SOLAST_PROFILE=1`.
|
|
200
|
+
*/
|
|
201
|
+
recordProfile(detectorId, timeNs, visits) {
|
|
202
|
+
const existing = this.profileStats.get(detectorId);
|
|
203
|
+
if (existing) {
|
|
204
|
+
existing.timeNs += timeNs;
|
|
205
|
+
existing.visits += visits;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.profileStats.set(detectorId, { timeNs, visits });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Render the accumulated per-detector profile stats as a stable
|
|
213
|
+
* multi-line summary, sorted by total time descending. Returns the
|
|
214
|
+
* empty string when profiling was not enabled or no detector ran.
|
|
215
|
+
* The caller (typically the CLI, after scan completion) decides
|
|
216
|
+
* where to write the summary — stderr is the convention so the
|
|
217
|
+
* NDJSON / SARIF stdout pipeline stays clean.
|
|
218
|
+
*/
|
|
219
|
+
formatProfileSummary() {
|
|
220
|
+
if (!this.profile || this.profileStats.size === 0)
|
|
221
|
+
return '';
|
|
222
|
+
const entries = Array.from(this.profileStats.entries())
|
|
223
|
+
.map(([id, s]) => ({ id, visits: s.visits, ms: Number(s.timeNs / 1000n) / 1000 }))
|
|
224
|
+
.sort((a, b) => b.ms - a.ms);
|
|
225
|
+
const totalMs = entries.reduce((sum, e) => sum + e.ms, 0);
|
|
226
|
+
const totalVisits = entries.reduce((sum, e) => sum + e.visits, 0);
|
|
227
|
+
const lines = [];
|
|
228
|
+
lines.push(`solast: per-detector profile (${entries.length} detectors, ${totalVisits} visits, ${totalMs.toFixed(2)}ms total)`);
|
|
229
|
+
lines.push(' time(ms) visits detector');
|
|
230
|
+
for (const e of entries) {
|
|
231
|
+
lines.push(` ${e.ms.toFixed(3).padStart(8)} ${String(e.visits).padStart(7)} ${e.id}`);
|
|
232
|
+
}
|
|
233
|
+
return lines.join('\n');
|
|
234
|
+
}
|
|
235
|
+
getProfileStats() {
|
|
236
|
+
if (!this.profile)
|
|
237
|
+
return [];
|
|
238
|
+
return Array.from(this.profileStats.entries())
|
|
239
|
+
.map(([id, s]) => ({ id, visits: s.visits, timeNs: s.timeNs }));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.DetectorRegistry = DetectorRegistry;
|
|
243
|
+
function matchesAnyRuleGlob(ruleId, patterns) {
|
|
244
|
+
return Boolean(patterns && patterns.some(pattern => (0, glob_1.matchesRuleGlob)(ruleId, pattern)));
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Build a single visitor object whose handlers dispatch to every
|
|
248
|
+
* detector that subscribed to that event. Visitor handler names follow
|
|
249
|
+
* the AST node-type convention (`ContractDefinition`,
|
|
250
|
+
* `FunctionDefinition`, ...). We additionally route `<Type>:exit`
|
|
251
|
+
* (parser-style post-hook), `<Type>_post` (solc-walker-style post-hook),
|
|
252
|
+
* and the two `enterNestedStatementBody` / `exitNestedStatementBody`
|
|
253
|
+
* hooks the solc walker fires.
|
|
254
|
+
*
|
|
255
|
+
* Anything else (lowercase private helpers, `id`, `findings` instance
|
|
256
|
+
* fields) is intentionally NOT exported into the fan-out — the walker
|
|
257
|
+
* never queries those names so it would be harmless either way, but
|
|
258
|
+
* the explicit allowlist keeps the behaviour easy to audit.
|
|
259
|
+
*
|
|
260
|
+
* Two performance shortcuts that matter on a hot loop with ~100+
|
|
261
|
+
* detectors:
|
|
262
|
+
* - Methods are pre-bound to their owning detector at construction
|
|
263
|
+
* time. The per-node dispatch path doesn't need `Function.call`
|
|
264
|
+
* and doesn't rebind `this` — the walker invokes `arr[i](node)`.
|
|
265
|
+
* - Events with a single subscriber bypass the iteration entirely;
|
|
266
|
+
* the fanout entry IS the bound method. Many of the ~100+
|
|
267
|
+
* detectors register one-of-a-kind hooks (e.g., a detector-
|
|
268
|
+
* specific `StateVariableDeclaration`), so the single-subscriber
|
|
269
|
+
* path is the common case.
|
|
270
|
+
*/
|
|
271
|
+
function buildFanoutVisitor(detectors, recordProfile) {
|
|
272
|
+
// Two parallel maps: `bound` stores raw bound handlers (for the
|
|
273
|
+
// non-profile path, which keeps the single-subscriber + tight-loop
|
|
274
|
+
// shortcuts). `boundWithId` adds the detector id alongside each
|
|
275
|
+
// handler so the profile-path wrapper can attribute time correctly.
|
|
276
|
+
const bound = new Map();
|
|
277
|
+
const boundWithId = new Map();
|
|
278
|
+
for (const detector of detectors) {
|
|
279
|
+
for (const name of collectVisitorMethodNames(detector)) {
|
|
280
|
+
const fn = detector[name];
|
|
281
|
+
if (typeof fn !== 'function')
|
|
282
|
+
continue;
|
|
283
|
+
const handler = fn.bind(detector);
|
|
284
|
+
const list = bound.get(name);
|
|
285
|
+
if (list)
|
|
286
|
+
list.push(handler);
|
|
287
|
+
else
|
|
288
|
+
bound.set(name, [handler]);
|
|
289
|
+
if (recordProfile) {
|
|
290
|
+
const listWithId = boundWithId.get(name);
|
|
291
|
+
const entry = { id: detector.id, fn: handler };
|
|
292
|
+
if (listWithId)
|
|
293
|
+
listWithId.push(entry);
|
|
294
|
+
else
|
|
295
|
+
boundWithId.set(name, [entry]);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const fanout = {};
|
|
300
|
+
for (const [name, handlers] of bound) {
|
|
301
|
+
if (recordProfile) {
|
|
302
|
+
// Profile path: every handler invocation is timed and attributed
|
|
303
|
+
// to its detector id. We skip the single-subscriber fast path
|
|
304
|
+
// because the wrapper must always record.
|
|
305
|
+
const arr = boundWithId.get(name);
|
|
306
|
+
const len = arr.length;
|
|
307
|
+
const rec = recordProfile;
|
|
308
|
+
fanout[name] = function (node) {
|
|
309
|
+
for (let i = 0; i < len; i++) {
|
|
310
|
+
const entry = arr[i];
|
|
311
|
+
const t0 = process.hrtime.bigint();
|
|
312
|
+
entry.fn(node);
|
|
313
|
+
const t1 = process.hrtime.bigint();
|
|
314
|
+
rec(entry.id, t1 - t0);
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (handlers.length === 1) {
|
|
320
|
+
// Single-subscriber fast path — the fanout entry is the bound
|
|
321
|
+
// method itself, eliminating per-visit closure overhead.
|
|
322
|
+
fanout[name] = handlers[0];
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const arr = handlers;
|
|
326
|
+
const len = arr.length;
|
|
327
|
+
fanout[name] = function (node) {
|
|
328
|
+
for (let i = 0; i < len; i++)
|
|
329
|
+
arr[i](node);
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return fanout;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Enumerate visitor method names declared on a detector instance. Walks
|
|
337
|
+
* the prototype chain (so visitor methods declared on the detector class
|
|
338
|
+
* are picked up) plus any instance-own properties (some detectors are
|
|
339
|
+
* built with `Object.assign(new D(), { ... })`). Lifecycle methods
|
|
340
|
+
* (`setFile`, `getFindings`, `scanAst`) are filtered out, and the
|
|
341
|
+
* remaining set is restricted to:
|
|
342
|
+
* - names beginning with an uppercase letter (AST node-type events,
|
|
343
|
+
* including the `:exit` and `_post` suffix forms), or
|
|
344
|
+
* - the two known special hook names the solc walker fires.
|
|
345
|
+
*/
|
|
346
|
+
function collectVisitorMethodNames(detector) {
|
|
347
|
+
const names = new Set();
|
|
348
|
+
let proto = Object.getPrototypeOf(detector);
|
|
349
|
+
while (proto && proto !== Object.prototype) {
|
|
350
|
+
for (const name of Object.getOwnPropertyNames(proto)) {
|
|
351
|
+
if (types_1.LIFECYCLE_METHOD_NAMES.has(name))
|
|
352
|
+
continue;
|
|
353
|
+
if (isVisitorEventName(name))
|
|
354
|
+
names.add(name);
|
|
355
|
+
}
|
|
356
|
+
proto = Object.getPrototypeOf(proto);
|
|
357
|
+
}
|
|
358
|
+
for (const name of Object.getOwnPropertyNames(detector)) {
|
|
359
|
+
if (types_1.LIFECYCLE_METHOD_NAMES.has(name))
|
|
360
|
+
continue;
|
|
361
|
+
if (isVisitorEventName(name))
|
|
362
|
+
names.add(name);
|
|
363
|
+
}
|
|
364
|
+
return [...names];
|
|
365
|
+
}
|
|
366
|
+
function hasVisitorMethods(detector) {
|
|
367
|
+
return collectVisitorMethodNames(detector).length > 0;
|
|
368
|
+
}
|
|
369
|
+
function isVisitorEventName(name) {
|
|
370
|
+
if (types_1.SPECIAL_HOOK_NAMES.has(name))
|
|
371
|
+
return true;
|
|
372
|
+
// AST node types start with an uppercase letter. The `:exit` and
|
|
373
|
+
// `_post` post-hook forms inherit that property.
|
|
374
|
+
const first = name.charCodeAt(0);
|
|
375
|
+
return first >= 0x41 && first <= 0x5a;
|
|
376
|
+
}
|
|
377
|
+
function getAstKind(ast) {
|
|
378
|
+
if (!ast)
|
|
379
|
+
return null;
|
|
380
|
+
if (typeof ast?.type === 'string')
|
|
381
|
+
return 'parser';
|
|
382
|
+
if (typeof ast?.nodeType === 'string')
|
|
383
|
+
return 'solc';
|
|
384
|
+
if (ast && typeof ast === 'object' && Object.keys(ast).length === 0)
|
|
385
|
+
return null;
|
|
386
|
+
throw new Error("scanAst: unrecognized AST shape (expected root with 'type' for @solidity-parser/parser or 'nodeType' for solc compact JSON)");
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=registry-engine.js.map
|