@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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.parseCiSeverityThreshold = parseCiSeverityThreshold;
|
|
38
|
+
exports.getExitCode = getExitCode;
|
|
39
|
+
exports.resolveScanFiles = resolveScanFiles;
|
|
40
|
+
exports.runScanCommand = runScanCommand;
|
|
41
|
+
exports.runScanCommandParallel = runScanCommandParallel;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
let fpRatesData = {};
|
|
46
|
+
try {
|
|
47
|
+
fpRatesData = require('./fp-rates.json');
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
// Missing FP-rate entry for a rule defaults to native severity without crash
|
|
51
|
+
}
|
|
52
|
+
// Single source of truth for the version: read it from package.json at runtime
|
|
53
|
+
// (dist/cli.js -> ../package.json) so `solast --version` can never drift from
|
|
54
|
+
// the published package. The literal is only a fallback if resolution fails.
|
|
55
|
+
let pkgVersion = '0.1.0';
|
|
56
|
+
try {
|
|
57
|
+
pkgVersion = require('../package.json').version || pkgVersion;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
// keep the fallback literal above
|
|
61
|
+
}
|
|
62
|
+
const index_1 = require("./index");
|
|
63
|
+
const parallel_scan_1 = require("./parallel-scan");
|
|
64
|
+
const files_1 = require("./dedup/files");
|
|
65
|
+
const registry_1 = require("./registry");
|
|
66
|
+
const sarif_1 = require("./formatters/sarif");
|
|
67
|
+
const text_1 = require("./formatters/text");
|
|
68
|
+
const github_actions_1 = require("./formatters/github-actions");
|
|
69
|
+
const config_1 = require("./config");
|
|
70
|
+
const exit_codes_1 = require("./exit-codes");
|
|
71
|
+
const glob_1 = require("./rules/glob");
|
|
72
|
+
const severity_1 = require("./severity");
|
|
73
|
+
const diff_baseline_1 = require("./identity/diff-baseline");
|
|
74
|
+
function buildScanOptions(options) {
|
|
75
|
+
const rules = [...(options.rule || [])];
|
|
76
|
+
const enabledRules = [...(options.enable || [])];
|
|
77
|
+
const ignorePatterns = [...(options.ignorePattern || [])];
|
|
78
|
+
const scanOptions = {};
|
|
79
|
+
if (rules.length > 0)
|
|
80
|
+
scanOptions.rules = rules;
|
|
81
|
+
if (enabledRules.length > 0)
|
|
82
|
+
scanOptions.enabledRules = enabledRules;
|
|
83
|
+
if (ignorePatterns.length > 0)
|
|
84
|
+
scanOptions.ignorePatterns = ignorePatterns;
|
|
85
|
+
if (options.dedup)
|
|
86
|
+
scanOptions.dedup = true;
|
|
87
|
+
if (options.tier && options.tier !== 'all')
|
|
88
|
+
scanOptions.tier = options.tier;
|
|
89
|
+
// Only forward detectorOptions when non-empty — loadProjectConfig
|
|
90
|
+
// always returns a `{}` for it, and an empty object would leak into
|
|
91
|
+
// ScanOptions equality checks (dedup-unit).
|
|
92
|
+
if (options.detectorOptions && Object.keys(options.detectorOptions).length > 0) {
|
|
93
|
+
scanOptions.detectorOptions = options.detectorOptions;
|
|
94
|
+
}
|
|
95
|
+
return scanOptions;
|
|
96
|
+
}
|
|
97
|
+
function parseSeverityThreshold(value) {
|
|
98
|
+
if (value === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
const normalized = value.trim().toLowerCase();
|
|
101
|
+
return severity_1.CANONICAL_SEVERITIES.includes(normalized)
|
|
102
|
+
? normalized
|
|
103
|
+
: undefined;
|
|
104
|
+
}
|
|
105
|
+
function parseCiSeverityThreshold(value) {
|
|
106
|
+
if (value === undefined)
|
|
107
|
+
return undefined;
|
|
108
|
+
const canonical = parseSeverityThreshold(value);
|
|
109
|
+
if (canonical)
|
|
110
|
+
return canonical;
|
|
111
|
+
const normalized = value.trim().toLowerCase();
|
|
112
|
+
const legacyAliases = {
|
|
113
|
+
error: 'high',
|
|
114
|
+
warning: 'medium',
|
|
115
|
+
note: 'informational',
|
|
116
|
+
none: 'none',
|
|
117
|
+
};
|
|
118
|
+
return legacyAliases[normalized];
|
|
119
|
+
}
|
|
120
|
+
function stripTomlQuotes(value) {
|
|
121
|
+
const trimmed = value.trim();
|
|
122
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
123
|
+
return trimmed.slice(1, -1);
|
|
124
|
+
}
|
|
125
|
+
return trimmed;
|
|
126
|
+
}
|
|
127
|
+
function readCiSeverityThresholdConfig(cwd) {
|
|
128
|
+
for (const fileName of ['solast.toml', '.solast.toml']) {
|
|
129
|
+
const file = path.join(cwd, fileName);
|
|
130
|
+
if (!fs.existsSync(file))
|
|
131
|
+
continue;
|
|
132
|
+
const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
|
|
133
|
+
let section = '';
|
|
134
|
+
for (const rawLine of lines) {
|
|
135
|
+
const line = rawLine.replace(/\s+#.*$/, '').trim();
|
|
136
|
+
if (!line)
|
|
137
|
+
continue;
|
|
138
|
+
const sectionMatch = line.match(/^\[([^\]]+)\]$/);
|
|
139
|
+
if (sectionMatch) {
|
|
140
|
+
section = sectionMatch[1].trim();
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (section !== 'ci')
|
|
144
|
+
continue;
|
|
145
|
+
const assignment = line.match(/^([A-Za-z0-9_-]+)\s*=\s*(.+)$/);
|
|
146
|
+
if (!assignment)
|
|
147
|
+
continue;
|
|
148
|
+
if (assignment[1] === 'severity_threshold') {
|
|
149
|
+
return stripTomlQuotes(assignment[2]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
function resolveSeverityThreshold(options, cwd, stderr) {
|
|
157
|
+
const cliThreshold = options.severityThreshold;
|
|
158
|
+
if (cliThreshold !== undefined) {
|
|
159
|
+
const parsed = parseSeverityThreshold(cliThreshold);
|
|
160
|
+
if (parsed)
|
|
161
|
+
return { threshold: parsed, filtersOutput: true };
|
|
162
|
+
stderr(`error: --severity-threshold must be one of: ${severity_1.CANONICAL_SEVERITIES.join(', ')}`);
|
|
163
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
164
|
+
}
|
|
165
|
+
if (!options.ci) {
|
|
166
|
+
return { threshold: undefined, filtersOutput: false };
|
|
167
|
+
}
|
|
168
|
+
const configuredThreshold = readCiSeverityThresholdConfig(cwd);
|
|
169
|
+
if (configuredThreshold !== undefined) {
|
|
170
|
+
const parsed = parseCiSeverityThreshold(configuredThreshold);
|
|
171
|
+
if (parsed === 'none')
|
|
172
|
+
return { threshold: undefined, filtersOutput: false, ciGateDisabled: true };
|
|
173
|
+
if (parsed)
|
|
174
|
+
return { threshold: parsed, filtersOutput: false };
|
|
175
|
+
stderr(`error: ci.severity_threshold must be one of: ${severity_1.CANONICAL_SEVERITIES.join(', ')}, error, warning, note, none`);
|
|
176
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
177
|
+
}
|
|
178
|
+
// If running in CI mode and no threshold is configured, default to 'high'
|
|
179
|
+
// (which corresponds to the old 'error' default).
|
|
180
|
+
if (options.ci) {
|
|
181
|
+
return { threshold: 'high', filtersOutput: false };
|
|
182
|
+
}
|
|
183
|
+
return { threshold: undefined, filtersOutput: false };
|
|
184
|
+
}
|
|
185
|
+
function isUserError(result) {
|
|
186
|
+
return result.ruleId === 'error' || result.ruleId === 'parse-error';
|
|
187
|
+
}
|
|
188
|
+
// 'scan-error' marks a detector crash (registry.runAll threw): an internal
|
|
189
|
+
// tool failure per the exit-code contract, not a security finding and not a
|
|
190
|
+
// user/input error.
|
|
191
|
+
function isInternalError(result) {
|
|
192
|
+
return result.ruleId === 'scan-error';
|
|
193
|
+
}
|
|
194
|
+
function isReportableVulnerability(result) {
|
|
195
|
+
return !isUserError(result) && !isInternalError(result);
|
|
196
|
+
}
|
|
197
|
+
function getExitCode(results) {
|
|
198
|
+
if (results.some(isInternalError)) {
|
|
199
|
+
return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
|
|
200
|
+
}
|
|
201
|
+
if (results.some(isUserError)) {
|
|
202
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
203
|
+
}
|
|
204
|
+
if (results.some(isReportableVulnerability)) {
|
|
205
|
+
return exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND;
|
|
206
|
+
}
|
|
207
|
+
return exit_codes_1.EXIT_CODES.OK;
|
|
208
|
+
}
|
|
209
|
+
function validateDiffBaselineOptions(options, stderr) {
|
|
210
|
+
if (options.diffBaseline && options.rule && options.rule.length > 0) {
|
|
211
|
+
stderr('error: --diff-baseline cannot be combined with --rule');
|
|
212
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
213
|
+
}
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
function validateIgnorePatternOptions(options, stderr) {
|
|
217
|
+
if (!options.ignorePattern || options.ignorePattern.length === 0)
|
|
218
|
+
return undefined;
|
|
219
|
+
const normalized = [];
|
|
220
|
+
try {
|
|
221
|
+
for (const pattern of options.ignorePattern) {
|
|
222
|
+
normalized.push((0, glob_1.validateGlobPattern)(pattern));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
if (e instanceof glob_1.GlobPatternError) {
|
|
227
|
+
stderr(`error: invalid --ignore-pattern: ${e.message}`);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
stderr(`error: invalid --ignore-pattern: ${e instanceof Error ? e.message : String(e)}`);
|
|
231
|
+
}
|
|
232
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
233
|
+
}
|
|
234
|
+
options.ignorePattern = normalized;
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
function loadScanConfig(cwd, targets, stderr) {
|
|
238
|
+
try {
|
|
239
|
+
return (0, config_1.loadProjectConfig)(cwd, targets);
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
if (e instanceof config_1.ConfigUserError) {
|
|
243
|
+
stderr(`error: ${e.message}`);
|
|
244
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
245
|
+
}
|
|
246
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
247
|
+
stderr(`error: could not read SolAST config: ${message}`);
|
|
248
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function formatNdjson(results, dedupMeta) {
|
|
252
|
+
const lines = results.map(result => JSON.stringify(scanResultToNdjsonObject(result)));
|
|
253
|
+
if (dedupMeta && dedupMeta.rawCount !== dedupMeta.uniqueCount) {
|
|
254
|
+
lines.push(JSON.stringify({ type: 'dedup_summary', dedup_summary: { raw_count: dedupMeta.rawCount, unique_count: dedupMeta.uniqueCount } }));
|
|
255
|
+
}
|
|
256
|
+
return lines.join('\n');
|
|
257
|
+
}
|
|
258
|
+
function getIgnoreSuppressionMetadata(results) {
|
|
259
|
+
return results._ignoreSuppression;
|
|
260
|
+
}
|
|
261
|
+
function applyIgnorePatternFilter(results, options) {
|
|
262
|
+
if (!options.ignorePattern || options.ignorePattern.length === 0)
|
|
263
|
+
return results;
|
|
264
|
+
const meta = getIgnoreSuppressionMetadata(results) || {
|
|
265
|
+
patterns: options.ignorePattern.slice(),
|
|
266
|
+
suppressedDetectorIds: inferSuppressedDetectorIds(options),
|
|
267
|
+
suppressedFindingCount: 0,
|
|
268
|
+
};
|
|
269
|
+
results._ignoreSuppression = {
|
|
270
|
+
patterns: meta.patterns.length > 0 ? meta.patterns : options.ignorePattern.slice(),
|
|
271
|
+
suppressedDetectorIds: meta.suppressedDetectorIds.slice().sort((a, b) => a.localeCompare(b)),
|
|
272
|
+
suppressedFindingCount: meta.suppressedFindingCount,
|
|
273
|
+
};
|
|
274
|
+
return results;
|
|
275
|
+
}
|
|
276
|
+
function inferSuppressedDetectorIds(options) {
|
|
277
|
+
if (!options.ignorePattern || options.ignorePattern.length === 0)
|
|
278
|
+
return [];
|
|
279
|
+
return (0, registry_1.createDefaultDetectorRegistry)()
|
|
280
|
+
.ignoredDetectorIds(options.rule, options.enable, options.ignorePattern);
|
|
281
|
+
}
|
|
282
|
+
function emitVerboseIgnoreSuppression(results, options, stderr) {
|
|
283
|
+
if (!options.verbose)
|
|
284
|
+
return;
|
|
285
|
+
const meta = getIgnoreSuppressionMetadata(results);
|
|
286
|
+
if (!meta || meta.patterns.length === 0)
|
|
287
|
+
return;
|
|
288
|
+
const ids = meta.suppressedDetectorIds;
|
|
289
|
+
stderr(`SolAST: ${ids.length} detector(s) ignored by --ignore-pattern${ids.length > 0 ? `: ${ids.join(', ')}` : ''}`);
|
|
290
|
+
}
|
|
291
|
+
function emitSourceSuppressionDiagnostics(results, stderr) {
|
|
292
|
+
const diagnostics = results._sourceSuppressionDiagnostics;
|
|
293
|
+
if (!Array.isArray(diagnostics))
|
|
294
|
+
return;
|
|
295
|
+
for (const diagnostic of diagnostics) {
|
|
296
|
+
if (diagnostic && typeof diagnostic.message === 'string') {
|
|
297
|
+
stderr(diagnostic.message);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Per-finding object shape used by formatNdjson for `--format json` NDJSON output.
|
|
302
|
+
function scanResultToNdjsonObject(result) {
|
|
303
|
+
return {
|
|
304
|
+
finding_id: result.findingId,
|
|
305
|
+
file_path: result.file,
|
|
306
|
+
finding_type: result.ruleId,
|
|
307
|
+
severity: result.severity,
|
|
308
|
+
contract_name: result.contractName,
|
|
309
|
+
function_name: result.functionName,
|
|
310
|
+
source_location: {
|
|
311
|
+
line: result.line,
|
|
312
|
+
column: result.column ?? 0
|
|
313
|
+
},
|
|
314
|
+
external_call_node: result.externalCallNode,
|
|
315
|
+
state_mutation_node: result.stateMutationNode,
|
|
316
|
+
caller: result.caller,
|
|
317
|
+
delegate_target: result.delegateTarget,
|
|
318
|
+
initializer_path: result.initializerPath,
|
|
319
|
+
message: result.message,
|
|
320
|
+
contract_hash: result.contractHash,
|
|
321
|
+
source: result.provenance,
|
|
322
|
+
tier: result.tier
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function applyDiffBaselineFilter(findings, options, cwdImpl, stderr) {
|
|
326
|
+
const cwd = cwdImpl();
|
|
327
|
+
try {
|
|
328
|
+
const baselineKeys = (0, diff_baseline_1.loadBaselineKeys)(options.diffBaseline, cwd);
|
|
329
|
+
return (0, diff_baseline_1.filterNewFindings)(findings, baselineKeys, cwd);
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
if (e instanceof diff_baseline_1.DiffBaselineUserError) {
|
|
333
|
+
stderr(`error: ${e.message}`);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
stderr(`error: could not load diff baseline: ${e instanceof Error ? e.message : String(e)}`);
|
|
337
|
+
}
|
|
338
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl) {
|
|
342
|
+
const formatImpl = deps.formatFindings || text_1.formatFindings;
|
|
343
|
+
results = applyIgnorePatternFilter(results, options);
|
|
344
|
+
emitVerboseIgnoreSuppression(results, options, stderr);
|
|
345
|
+
emitSourceSuppressionDiagnostics(results, stderr);
|
|
346
|
+
const jsonShorthand = options.json === true;
|
|
347
|
+
const format = jsonShorthand ? 'json' : (options.format || 'text');
|
|
348
|
+
const ci = options.ci === true;
|
|
349
|
+
const quiet = options.quiet === true;
|
|
350
|
+
for (const r of results) {
|
|
351
|
+
if (isUserError(r) || isInternalError(r)) {
|
|
352
|
+
stderr(`error: ${r.file}: ${r.message}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
const hasUserErrors = results.some(isUserError);
|
|
356
|
+
const hasInternalErrors = results.some(isInternalError);
|
|
357
|
+
if (hasInternalErrors && ci) {
|
|
358
|
+
return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
|
|
359
|
+
}
|
|
360
|
+
if (hasUserErrors && ci) {
|
|
361
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
362
|
+
}
|
|
363
|
+
let threshold;
|
|
364
|
+
const resolved = resolveSeverityThreshold(options, cwdImpl(), stderr);
|
|
365
|
+
if (typeof resolved === 'number')
|
|
366
|
+
return resolved;
|
|
367
|
+
threshold = resolved.threshold;
|
|
368
|
+
const thresholdFiltersOutput = resolved.filtersOutput;
|
|
369
|
+
let findings = results.filter(isReportableVulnerability);
|
|
370
|
+
if (thresholdFiltersOutput) {
|
|
371
|
+
findings = findings.filter(f => (0, severity_1.atOrAboveThreshold)((0, severity_1.normalizeSeverity)(f.severity), threshold));
|
|
372
|
+
}
|
|
373
|
+
const dedupMeta = results._dedup;
|
|
374
|
+
const ignoreMeta = getIgnoreSuppressionMetadata(results);
|
|
375
|
+
if (options.diffBaseline) {
|
|
376
|
+
if (hasUserErrors) {
|
|
377
|
+
// Don't run diff when the scan itself surfaced a user-level error —
|
|
378
|
+
// the per-file error messages were already emitted above; treat
|
|
379
|
+
// the run as a normal user-error exit.
|
|
380
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
381
|
+
}
|
|
382
|
+
const filtered = applyDiffBaselineFilter(findings, options, cwdImpl, stderr);
|
|
383
|
+
if (typeof filtered === 'number')
|
|
384
|
+
return filtered;
|
|
385
|
+
findings = filtered;
|
|
386
|
+
}
|
|
387
|
+
// Location-sort findings for deterministic output across all formats
|
|
388
|
+
// (SARIF also sorts internally); decouples output from registration order.
|
|
389
|
+
findings = findings.slice().sort((a, b) => a.file.localeCompare(b.file) || (a.line || 0) - (b.line || 0) || (a.column || 0) - (b.column || 0) || a.ruleId.localeCompare(b.ruleId));
|
|
390
|
+
// Note: per-file parse errors do NOT blank the report — findings from
|
|
391
|
+
// files that parsed are still emitted (the run still exits USER_ERROR).
|
|
392
|
+
// Suppressing the whole report because one vendored/exotic file failed
|
|
393
|
+
// to parse silently destroyed results for every other file.
|
|
394
|
+
const isCleanDiffBaseline = options.diffBaseline && findings.length === 0;
|
|
395
|
+
const output = isCleanDiffBaseline && format !== 'sarif'
|
|
396
|
+
? ''
|
|
397
|
+
: format === 'json'
|
|
398
|
+
? formatNdjson(findings, options.diffBaseline ? undefined : dedupMeta)
|
|
399
|
+
: format === 'sarif'
|
|
400
|
+
? (0, sarif_1.formatSarif)(findings, {
|
|
401
|
+
rootDir: cwdImpl(),
|
|
402
|
+
fpThresholdPct: options.fpThreshold,
|
|
403
|
+
fpRates: fpRatesData,
|
|
404
|
+
severityOverrides: options.severityOverrides,
|
|
405
|
+
sarifSeverityTuning: options.sarifSeverityTuning,
|
|
406
|
+
})
|
|
407
|
+
: formatImpl(findings, {
|
|
408
|
+
cwd: cwdImpl(),
|
|
409
|
+
color: options.color === false ? 'never' : 'auto',
|
|
410
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
411
|
+
env: process.env,
|
|
412
|
+
rawCount: dedupMeta?.rawCount,
|
|
413
|
+
uniqueCount: dedupMeta?.uniqueCount,
|
|
414
|
+
dedupActive: Boolean(dedupMeta),
|
|
415
|
+
suppressedDetectorCount: ignoreMeta?.suppressedDetectorIds.length,
|
|
416
|
+
});
|
|
417
|
+
const emittedOutput = ci && format === 'text' ? '' : output;
|
|
418
|
+
if (options.output) {
|
|
419
|
+
try {
|
|
420
|
+
// --output always receives the full formatted report; CI mode only
|
|
421
|
+
// suppresses the stdout copy (annotations still go to stdout below).
|
|
422
|
+
writeFileImpl(options.output, output ? `${output}\n` : '');
|
|
423
|
+
}
|
|
424
|
+
catch (e) {
|
|
425
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
426
|
+
stderr(`error: could not write output file '${options.output}': ${message}`);
|
|
427
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else if (quiet) {
|
|
431
|
+
// --quiet silences stdout for all formats (text/json/sarif).
|
|
432
|
+
// The exit code still gates the run; text mode keeps a one-line stderr
|
|
433
|
+
// breadcrumb so a non-CI caller knows why the run failed.
|
|
434
|
+
if (findings.length > 0 && format === 'text' && !ci) {
|
|
435
|
+
stderr(`SolAST: ${findings.length} finding(s) blocked the run — re-run without --quiet for details`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
if (emittedOutput) {
|
|
440
|
+
stdout(emittedOutput);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (ci && threshold) {
|
|
444
|
+
const shouldEmitGithubAnnotations = !quiet && format === 'text';
|
|
445
|
+
const gatedFindings = findings.filter(f => (0, severity_1.atOrAboveThreshold)((0, severity_1.normalizeSeverity)(f.severity), threshold));
|
|
446
|
+
for (const finding of gatedFindings) {
|
|
447
|
+
const level = (0, sarif_1.sarifLevelForFinding)(finding, {
|
|
448
|
+
fpThresholdPct: options.fpThreshold,
|
|
449
|
+
fpRates: fpRatesData,
|
|
450
|
+
severityOverrides: options.severityOverrides,
|
|
451
|
+
sarifSeverityTuning: options.sarifSeverityTuning,
|
|
452
|
+
});
|
|
453
|
+
if (shouldEmitGithubAnnotations && level === 'error') {
|
|
454
|
+
stdout((0, github_actions_1.formatGithubActionsAnnotation)(finding, level, cwdImpl()));
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// We only stderr if ciCount > 0 or if we want to keep the breadcrumb.
|
|
458
|
+
// Let's just output the breadcrumb like it used to.
|
|
459
|
+
const ciCount = gatedFindings.length;
|
|
460
|
+
stderr(`${ciCount} findings ≥ ${threshold}`);
|
|
461
|
+
return ciCount > 0 ? exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND : exit_codes_1.EXIT_CODES.OK;
|
|
462
|
+
}
|
|
463
|
+
if (ci && resolved.ciGateDisabled) {
|
|
464
|
+
stderr('0 findings ≥ none');
|
|
465
|
+
return exit_codes_1.EXIT_CODES.OK;
|
|
466
|
+
}
|
|
467
|
+
if (hasInternalErrors) {
|
|
468
|
+
return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
|
|
469
|
+
}
|
|
470
|
+
if (hasUserErrors) {
|
|
471
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
472
|
+
}
|
|
473
|
+
return findings.length > 0 ? exit_codes_1.EXIT_CODES.VULNERABILITIES_FOUND : exit_codes_1.EXIT_CODES.OK;
|
|
474
|
+
}
|
|
475
|
+
function collectSolidityFiles(dir) {
|
|
476
|
+
const files = [];
|
|
477
|
+
const entries = fs.readdirSync(dir).sort((a, b) => a.localeCompare(b));
|
|
478
|
+
for (const entry of entries) {
|
|
479
|
+
const fullPath = path.join(dir, entry);
|
|
480
|
+
let stat;
|
|
481
|
+
try {
|
|
482
|
+
stat = fs.statSync(fullPath);
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
// Broken symlink or unreadable entry (common under node_modules/.bin
|
|
486
|
+
// and pnpm layouts) — skip it instead of aborting the whole scan.
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
if (stat.isDirectory()) {
|
|
490
|
+
files.push(...collectSolidityFiles(fullPath));
|
|
491
|
+
}
|
|
492
|
+
else if (stat.isFile() && entry.endsWith('.sol')) {
|
|
493
|
+
files.push(fullPath);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return files;
|
|
497
|
+
}
|
|
498
|
+
function resolveScanFiles(inputPaths) {
|
|
499
|
+
const paths = Array.isArray(inputPaths) ? inputPaths : [inputPaths];
|
|
500
|
+
const discovered = new Map();
|
|
501
|
+
for (const inputPath of paths) {
|
|
502
|
+
let realPath;
|
|
503
|
+
let stat;
|
|
504
|
+
try {
|
|
505
|
+
realPath = fs.realpathSync(inputPath);
|
|
506
|
+
stat = fs.statSync(realPath);
|
|
507
|
+
}
|
|
508
|
+
catch (e) {
|
|
509
|
+
throw new Error(`Path not found: ${inputPath}`);
|
|
510
|
+
}
|
|
511
|
+
if (stat.isDirectory()) {
|
|
512
|
+
const files = collectSolidityFiles(realPath);
|
|
513
|
+
if (files.length === 0) {
|
|
514
|
+
throw new Error(`No Solidity files found in directory: ${inputPath}`);
|
|
515
|
+
}
|
|
516
|
+
for (const file of files) {
|
|
517
|
+
discovered.set(path.resolve(file), file);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else if (stat.isFile()) {
|
|
521
|
+
if (!realPath.endsWith('.sol')) {
|
|
522
|
+
throw new Error(`Not a Solidity file: ${inputPath}`);
|
|
523
|
+
}
|
|
524
|
+
discovered.set(path.resolve(realPath), realPath);
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
throw new Error(`Path is not a file or directory: ${inputPath}`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return [...discovered.values()].sort((a, b) => a.localeCompare(b));
|
|
531
|
+
}
|
|
532
|
+
function runScanCommand(targetPath, options = {}, deps = {}) {
|
|
533
|
+
const discoverImpl = deps.discoverFiles || index_1.discoverFiles;
|
|
534
|
+
const scanFilesImpl = deps.scanFiles || index_1.scanFiles;
|
|
535
|
+
const cwdImpl = deps.cwd || (() => process.cwd());
|
|
536
|
+
const stdout = deps.stdout || ((message) => process.stdout.write(`${message}\n`));
|
|
537
|
+
const stderr = deps.stderr || console.error;
|
|
538
|
+
const writeFileImpl = deps.writeFile || ((p, c) => fs.writeFileSync(p, c));
|
|
539
|
+
const paths = Array.isArray(targetPath) ? targetPath : [targetPath];
|
|
540
|
+
const jsonShorthand = options.json === true;
|
|
541
|
+
const format = jsonShorthand ? 'json' : (options.format || 'text');
|
|
542
|
+
const ci = options.ci === true;
|
|
543
|
+
const quiet = options.quiet === true;
|
|
544
|
+
// Machine-readable formats must not interleave human-friendly
|
|
545
|
+
// discovery messages on stderr: a non-empty stderr breaks shell
|
|
546
|
+
// scripts that assert empty error streams on a clean run.
|
|
547
|
+
const suppressDiscoveryMessage = ci || quiet || format === 'json' || format === 'sarif' || Boolean(options.diffBaseline);
|
|
548
|
+
if (paths.length === 0) {
|
|
549
|
+
stderr('error: missing required path argument');
|
|
550
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
551
|
+
}
|
|
552
|
+
const diffBaselineOptionError = validateDiffBaselineOptions(options, stderr);
|
|
553
|
+
if (diffBaselineOptionError !== undefined)
|
|
554
|
+
return diffBaselineOptionError;
|
|
555
|
+
const ignorePatternOptionError = validateIgnorePatternOptions(options, stderr);
|
|
556
|
+
if (ignorePatternOptionError !== undefined)
|
|
557
|
+
return ignorePatternOptionError;
|
|
558
|
+
const scanOptions = buildScanOptions(options);
|
|
559
|
+
const configResult = loadScanConfig(cwdImpl(), paths, stderr);
|
|
560
|
+
if (typeof configResult === 'number')
|
|
561
|
+
return configResult;
|
|
562
|
+
options = { ...options, severityOverrides: configResult.severityOverrides, detectorOptions: configResult.detectorOptions };
|
|
563
|
+
// `scanOptions` was built from `options` before the project config
|
|
564
|
+
// was loaded, so per-detector options from .solast.yml have to be
|
|
565
|
+
// folded in here — without this the detectorOptions never reach the
|
|
566
|
+
// registry and a configured detector silently runs with its defaults.
|
|
567
|
+
// Guard on non-empty: loadProjectConfig always returns a `{}`, which
|
|
568
|
+
// would otherwise leak into ScanOptions equality checks.
|
|
569
|
+
if (configResult.detectorOptions && Object.keys(configResult.detectorOptions).length > 0) {
|
|
570
|
+
scanOptions.detectorOptions = configResult.detectorOptions;
|
|
571
|
+
}
|
|
572
|
+
let results;
|
|
573
|
+
try {
|
|
574
|
+
if (deps.scan) {
|
|
575
|
+
if (deps.discoverFiles) {
|
|
576
|
+
const files = discoverImpl(paths);
|
|
577
|
+
if (!suppressDiscoveryMessage)
|
|
578
|
+
stderr(`Discovered ${files.length} Solidity file(s).`);
|
|
579
|
+
}
|
|
580
|
+
results = deps.scan(paths, scanOptions);
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
let files;
|
|
584
|
+
try {
|
|
585
|
+
files = deps.discoverFiles ? discoverImpl(paths) : resolveScanFiles(paths);
|
|
586
|
+
}
|
|
587
|
+
catch (e) {
|
|
588
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
589
|
+
stderr(`error: ${message}`);
|
|
590
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
591
|
+
}
|
|
592
|
+
if (!deps.scanFiles)
|
|
593
|
+
files = (0, files_1.deduplicateFilesByContent)(files);
|
|
594
|
+
if (!suppressDiscoveryMessage)
|
|
595
|
+
stderr(`Discovered ${files.length} Solidity file(s).`);
|
|
596
|
+
results = scanFilesImpl(files, scanOptions);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
catch (e) {
|
|
600
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
601
|
+
stderr(`SolAST internal error: ${message}`);
|
|
602
|
+
return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
|
|
603
|
+
}
|
|
604
|
+
return emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Async sibling of `runScanCommand` that runs the scan across a worker
|
|
608
|
+
* thread pool when `options.workers > 1`. Falls through to the sync
|
|
609
|
+
* `runScanCommand` whenever the worker count is 0/1 or the file count
|
|
610
|
+
* is below the threshold inside `scanFilesParallel`. The CLI binding
|
|
611
|
+
* routes here when the user passes `--workers <n>`; everything else
|
|
612
|
+
* keeps the existing synchronous code path so this PR doesn't perturb
|
|
613
|
+
* behaviour for callers that don't opt in.
|
|
614
|
+
*/
|
|
615
|
+
async function runScanCommandParallel(targetPath, options = {}, deps = {}) {
|
|
616
|
+
const workerCount = (0, parallel_scan_1.resolveWorkerCount)(options.workers);
|
|
617
|
+
const discoverImpl = deps.discoverFiles || index_1.discoverFiles;
|
|
618
|
+
const cwdImpl = deps.cwd || (() => process.cwd());
|
|
619
|
+
const stdout = deps.stdout || ((message) => process.stdout.write(`${message}\n`));
|
|
620
|
+
const stderr = deps.stderr || console.error;
|
|
621
|
+
const writeFileImpl = deps.writeFile || ((p, c) => fs.writeFileSync(p, c));
|
|
622
|
+
const paths = Array.isArray(targetPath) ? targetPath : [targetPath];
|
|
623
|
+
const jsonShorthand = options.json === true;
|
|
624
|
+
const format = jsonShorthand ? 'json' : (options.format || 'text');
|
|
625
|
+
const ci = options.ci === true;
|
|
626
|
+
const quiet = options.quiet === true;
|
|
627
|
+
let scanOptions = buildScanOptions(options);
|
|
628
|
+
const suppressDiscoveryMessage = ci || quiet || format === 'json' || format === 'sarif' || Boolean(options.diffBaseline);
|
|
629
|
+
if (paths.length === 0) {
|
|
630
|
+
stderr('error: missing required path argument');
|
|
631
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
632
|
+
}
|
|
633
|
+
const diffBaselineOptionError = validateDiffBaselineOptions(options, stderr);
|
|
634
|
+
if (diffBaselineOptionError !== undefined)
|
|
635
|
+
return diffBaselineOptionError;
|
|
636
|
+
const ignorePatternOptionError = validateIgnorePatternOptions(options, stderr);
|
|
637
|
+
if (ignorePatternOptionError !== undefined)
|
|
638
|
+
return ignorePatternOptionError;
|
|
639
|
+
const configResult = loadScanConfig(cwdImpl(), paths, stderr);
|
|
640
|
+
if (typeof configResult === 'number')
|
|
641
|
+
return configResult;
|
|
642
|
+
options = { ...options, severityOverrides: configResult.severityOverrides, detectorOptions: configResult.detectorOptions };
|
|
643
|
+
let results;
|
|
644
|
+
try {
|
|
645
|
+
scanOptions = buildScanOptions(options);
|
|
646
|
+
let files;
|
|
647
|
+
try {
|
|
648
|
+
files = deps.discoverFiles ? discoverImpl(paths) : resolveScanFiles(paths);
|
|
649
|
+
}
|
|
650
|
+
catch (e) {
|
|
651
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
652
|
+
stderr(`error: ${message}`);
|
|
653
|
+
return exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
654
|
+
}
|
|
655
|
+
files = (0, files_1.deduplicateFilesByContent)(files);
|
|
656
|
+
if (!suppressDiscoveryMessage)
|
|
657
|
+
stderr(`Discovered ${files.length} Solidity file(s).`);
|
|
658
|
+
// The dispatcher gates on `files.length >= workerCount * minFilesPerWorker`
|
|
659
|
+
// and falls through to the sync `scanFiles` when the file set is
|
|
660
|
+
// too small to amortise worker startup. That keeps the behaviour
|
|
661
|
+
// stable for tiny scans even if the user explicitly asked for
|
|
662
|
+
// workers.
|
|
663
|
+
if (workerCount <= 1) {
|
|
664
|
+
results = (0, index_1.scanFiles)(files, scanOptions);
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
results = await (0, parallel_scan_1.scanFilesParallel)(files, { ...scanOptions, workerCount });
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
catch (e) {
|
|
671
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
672
|
+
stderr(`SolAST internal error: ${message}`);
|
|
673
|
+
return exit_codes_1.EXIT_CODES.INTERNAL_FAILURE;
|
|
674
|
+
}
|
|
675
|
+
return emitScanResults(results, options, deps, cwdImpl, stdout, stderr, writeFileImpl);
|
|
676
|
+
}
|
|
677
|
+
const program = new commander_1.Command();
|
|
678
|
+
program.enablePositionalOptions();
|
|
679
|
+
program
|
|
680
|
+
.name('solast')
|
|
681
|
+
.description('Static analysis CLI for Solidity smart contracts')
|
|
682
|
+
.version(pkgVersion)
|
|
683
|
+
.showHelpAfterError()
|
|
684
|
+
.argument('[paths...]', 'path(s) to .sol files or directories of .sol files')
|
|
685
|
+
.action(async (paths, options) => {
|
|
686
|
+
process.exitCode = await runScanCommandParallel(paths, { ...options, format: 'text' });
|
|
687
|
+
});
|
|
688
|
+
program
|
|
689
|
+
.command('scan')
|
|
690
|
+
.description('Scan Solidity files for known issues')
|
|
691
|
+
.argument('[paths...]', 'path(s) to .sol files or directories of .sol files')
|
|
692
|
+
.addOption(new commander_1.Option('--format <format>', 'output format: text severity report, json NDJSON, or sarif 2.1.0; severities are critical, high, medium, low, informational').choices(['text', 'json', 'sarif']).default('text'))
|
|
693
|
+
.option('--ci', 'run in CI mode: keep the selected output format and gate the exit code by SARIF severity threshold')
|
|
694
|
+
.option('--severity-threshold <level>', 'filter findings below this severity (critical, high, medium, low, informational)')
|
|
695
|
+
.option('--output <file>', 'write findings to a file instead of stdout')
|
|
696
|
+
.option('--no-color', 'suppress ANSI severity colors in text output')
|
|
697
|
+
.option('--quiet', 'silence stdout and discovery messages; on findings, exit 1 with a one-line stderr summary (intended for editor and Foundry pre-test integration)')
|
|
698
|
+
.option('--json', 'shorthand for --format json with discovery messages suppressed; output is one NDJSON object per finding')
|
|
699
|
+
.option('--tier <tier>', 'restrict scan to a rule tier (core, extended, all)', value => {
|
|
700
|
+
if (!['core', 'extended', 'all'].includes(value)) {
|
|
701
|
+
process.stderr.write('error: --tier must be one of core, extended, all\n');
|
|
702
|
+
process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
|
|
703
|
+
}
|
|
704
|
+
return value;
|
|
705
|
+
}, 'all')
|
|
706
|
+
.option('--rule <rule_id>', 'restrict scan to a rule id; repeat for multiple rules (e.g. --rule classic-reentrancy --rule check-effects-interactions)', (value, previous) => (previous || []).concat(value))
|
|
707
|
+
.option('--ignore-pattern <glob>', 'exclude detectors whose rule id matches this glob from execution; repeat for multiple ephemeral ignore patterns', (value, previous) => (previous || []).concat(value))
|
|
708
|
+
.option('--enable <rule_id>', 'enable an opt-in detector by rule id; repeat for multiple opt-in rules (e.g. --enable fhe-state-leakage)', (value, previous) => (previous || []).concat(value))
|
|
709
|
+
.option('--verbose', 'print additional scan diagnostics to stderr')
|
|
710
|
+
.option('--dedup', 'also deduplicate overlapping findings from bridge/cross-chain detectors using the shared rule-deduplication engine; content-identical Solidity files are always scanned once')
|
|
711
|
+
.option('--fp-threshold <pct>', 'dynamic severity downgrade threshold for noisy rules (default: 5). 0 disables downgrading.', value => {
|
|
712
|
+
const n = Number.parseFloat(value);
|
|
713
|
+
if (!Number.isFinite(n) || n < 0 || n > 100) {
|
|
714
|
+
process.stderr.write('error: --fp-threshold must be a number between 0 and 100\n');
|
|
715
|
+
process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
|
|
716
|
+
}
|
|
717
|
+
return n;
|
|
718
|
+
})
|
|
719
|
+
.option('--sarif-severity-tuning <state>', 'enable or disable FP-rate based SARIF severity tuning (default: on)', value => {
|
|
720
|
+
if (value !== 'on' && value !== 'off') {
|
|
721
|
+
process.stderr.write('error: --sarif-severity-tuning must be one of: on, off\n');
|
|
722
|
+
process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
|
|
723
|
+
}
|
|
724
|
+
return value === 'on';
|
|
725
|
+
}, true)
|
|
726
|
+
.option('--workers <n>', 'spread the scan across N worker_threads (clamped to CPU count, capped at 32). Threshold-gated: small file sets fall through to the synchronous path so worker startup never costs more than the parallelism saves.', value => {
|
|
727
|
+
if (!/^\d+$/.test(value.trim())) {
|
|
728
|
+
process.stderr.write('error: --workers must be a non-negative integer\n');
|
|
729
|
+
process.exit(exit_codes_1.EXIT_CODES.USER_ERROR);
|
|
730
|
+
}
|
|
731
|
+
return Number.parseInt(value, 10);
|
|
732
|
+
})
|
|
733
|
+
.option('--diff-baseline <path>', 'CI regression detection: compare the current scan against a checked-in SolAST NDJSON baseline and emit only net-new findings. Exits 1 only if new findings are present; cannot be combined with --rule.')
|
|
734
|
+
.addHelpText('after', `
|
|
735
|
+
|
|
736
|
+
Example:
|
|
737
|
+
$ solast scan --ci --severity-threshold high <path>
|
|
738
|
+
$ solast scan --workers 8 contracts/
|
|
739
|
+
`)
|
|
740
|
+
.action(async (paths, options, command) => {
|
|
741
|
+
if (paths.length === 0) {
|
|
742
|
+
process.stderr.write('error: missing required path argument\n');
|
|
743
|
+
process.exitCode = exit_codes_1.EXIT_CODES.USER_ERROR;
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
// Always go through the parallel adapter so a `--workers <n>` flag
|
|
747
|
+
// takes effect; the adapter is a thin wrapper that delegates to
|
|
748
|
+
// the synchronous `runScanCommand` whenever workers are 0/1 or
|
|
749
|
+
// the file set is too small to amortise worker startup.
|
|
750
|
+
process.exitCode = await runScanCommandParallel(paths, options);
|
|
751
|
+
});
|
|
752
|
+
if (require.main === module) {
|
|
753
|
+
program.parse();
|
|
754
|
+
}
|
|
755
|
+
//# sourceMappingURL=cli.js.map
|