@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integer-overflow detector helpers — pragma classification, arithmetic
|
|
3
|
+
* operator vocabularies, signedness classification, expression
|
|
4
|
+
* canonicalization, and overflow/underflow guard recognizers.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from `src/index.ts` per roadmap item 1.1 (split god-file
|
|
7
|
+
* into focused modules). The public API surface is unchanged —
|
|
8
|
+
* `src/index.ts` re-exports every name below so the 184 detector files
|
|
9
|
+
* importing from `'../index'` continue to see them at the same path.
|
|
10
|
+
*
|
|
11
|
+
* No external imports. Pure functions over Solidity AST node shapes.
|
|
12
|
+
* Accepts both the `@solidity-parser/parser` shape (`type` field) and
|
|
13
|
+
* the solc compact JSON shape (`nodeType` field) where relevant.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Determines whether a `pragma solidity X` value permits any compiler version
|
|
17
|
+
* older than 0.8.0. v0.2 integer-overflow detection only fires for ranges that
|
|
18
|
+
* could compile under <0.8.0, since 0.8+ already inserts overflow checks.
|
|
19
|
+
*
|
|
20
|
+
* The implementation is a deliberately small semver-range parser: we extract
|
|
21
|
+
* the lower bound implied by each comparator and report whether that lower
|
|
22
|
+
* bound is below 0.8.0. Unrecognized inputs fall back to "pre-0.8 allowed"
|
|
23
|
+
* (conservative — flag rather than miss).
|
|
24
|
+
*/
|
|
25
|
+
export declare function pragmaAllowsPre080(pragmaValue: string): boolean;
|
|
26
|
+
export declare const ARITH_OPERATORS: Set<string>;
|
|
27
|
+
export declare const COMPOUND_ARITH_OPERATORS: Set<string>;
|
|
28
|
+
export declare const COMPOUND_TO_BARE_ARITH: Map<string, string>;
|
|
29
|
+
export declare const ARITH_DIRECTION: Map<string, "overflow" | "underflow">;
|
|
30
|
+
export declare function isArithmeticBinaryOp(node: any): boolean;
|
|
31
|
+
export type Signedness = 'unsigned' | 'signed' | 'unknown';
|
|
32
|
+
/**
|
|
33
|
+
* Classify a Solidity AST `typeName` node as `unsigned`, `signed`, or
|
|
34
|
+
* `unknown`. Accepts both the `@solidity-parser/parser` shape (`type` field)
|
|
35
|
+
* and the solc compact JSON shape (`nodeType` field). Anything that is not a
|
|
36
|
+
* direct `uint*` or `int*` elementary type is reported as `unknown`, which
|
|
37
|
+
* the caller treats conservatively as "do not suppress".
|
|
38
|
+
*/
|
|
39
|
+
export declare function classifyTypeName(typeName: any): Signedness;
|
|
40
|
+
/**
|
|
41
|
+
* Predicate used by guard recognizers: an arithmetic operand is treated as
|
|
42
|
+
* unsigned only when we can prove it via a tracked declaration (parameter,
|
|
43
|
+
* local, or state variable resolved as `uint*`). Unknown types are
|
|
44
|
+
* conservatively treated as not-unsigned so the eventual `BinaryOperation`
|
|
45
|
+
* is still reported.
|
|
46
|
+
*/
|
|
47
|
+
export type IsUnsignedFn = (expr: any) => boolean;
|
|
48
|
+
export declare function isConstantExpr(expr: any): boolean;
|
|
49
|
+
export declare function expressionSignature(expr: any): string;
|
|
50
|
+
export declare function unwrapTuple(expr: any): any;
|
|
51
|
+
/**
|
|
52
|
+
* Walk the top-level boolean shape of a `require`/`assert` argument and emit
|
|
53
|
+
* guard signatures for the recognised overflow/underflow predicates. Combines
|
|
54
|
+
* sides of `&&` (each side stands as its own guard); `||` is only honoured for
|
|
55
|
+
* the SafeMath multiplication pattern.
|
|
56
|
+
*/
|
|
57
|
+
export declare function collectGuardSignatures(arg: any, sigs: Set<string>, isUnsigned: IsUnsignedFn): void;
|
|
58
|
+
export declare function isRequireFunctionCall(node: any): boolean;
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Integer-overflow detector helpers — pragma classification, arithmetic
|
|
4
|
+
* operator vocabularies, signedness classification, expression
|
|
5
|
+
* canonicalization, and overflow/underflow guard recognizers.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from `src/index.ts` per roadmap item 1.1 (split god-file
|
|
8
|
+
* into focused modules). The public API surface is unchanged —
|
|
9
|
+
* `src/index.ts` re-exports every name below so the 184 detector files
|
|
10
|
+
* importing from `'../index'` continue to see them at the same path.
|
|
11
|
+
*
|
|
12
|
+
* No external imports. Pure functions over Solidity AST node shapes.
|
|
13
|
+
* Accepts both the `@solidity-parser/parser` shape (`type` field) and
|
|
14
|
+
* the solc compact JSON shape (`nodeType` field) where relevant.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ARITH_DIRECTION = exports.COMPOUND_TO_BARE_ARITH = exports.COMPOUND_ARITH_OPERATORS = exports.ARITH_OPERATORS = void 0;
|
|
18
|
+
exports.pragmaAllowsPre080 = pragmaAllowsPre080;
|
|
19
|
+
exports.isArithmeticBinaryOp = isArithmeticBinaryOp;
|
|
20
|
+
exports.classifyTypeName = classifyTypeName;
|
|
21
|
+
exports.isConstantExpr = isConstantExpr;
|
|
22
|
+
exports.expressionSignature = expressionSignature;
|
|
23
|
+
exports.unwrapTuple = unwrapTuple;
|
|
24
|
+
exports.collectGuardSignatures = collectGuardSignatures;
|
|
25
|
+
exports.isRequireFunctionCall = isRequireFunctionCall;
|
|
26
|
+
/**
|
|
27
|
+
* Determines whether a `pragma solidity X` value permits any compiler version
|
|
28
|
+
* older than 0.8.0. v0.2 integer-overflow detection only fires for ranges that
|
|
29
|
+
* could compile under <0.8.0, since 0.8+ already inserts overflow checks.
|
|
30
|
+
*
|
|
31
|
+
* The implementation is a deliberately small semver-range parser: we extract
|
|
32
|
+
* the lower bound implied by each comparator and report whether that lower
|
|
33
|
+
* bound is below 0.8.0. Unrecognized inputs fall back to "pre-0.8 allowed"
|
|
34
|
+
* (conservative — flag rather than miss).
|
|
35
|
+
*/
|
|
36
|
+
function pragmaAllowsPre080(pragmaValue) {
|
|
37
|
+
if (!pragmaValue)
|
|
38
|
+
return true;
|
|
39
|
+
const branches = pragmaValue.split('||');
|
|
40
|
+
for (const branch of branches) {
|
|
41
|
+
const tokens = branch.trim().split(/\s+/).filter(Boolean);
|
|
42
|
+
if (tokens.length === 0)
|
|
43
|
+
return true;
|
|
44
|
+
let lowerMinor = -1;
|
|
45
|
+
let sawComparator = false;
|
|
46
|
+
for (const token of tokens) {
|
|
47
|
+
const match = token.match(/^([\^~]|>=|>|<=|<|=)?\s*0\.(\d+)(?:\.(\d+))?/);
|
|
48
|
+
if (!match)
|
|
49
|
+
continue;
|
|
50
|
+
const op = match[1] || '=';
|
|
51
|
+
const minor = parseInt(match[2], 10);
|
|
52
|
+
if (op === '<' || op === '<=')
|
|
53
|
+
continue;
|
|
54
|
+
sawComparator = true;
|
|
55
|
+
if (lowerMinor < 0 || minor > lowerMinor)
|
|
56
|
+
lowerMinor = minor;
|
|
57
|
+
}
|
|
58
|
+
if (!sawComparator)
|
|
59
|
+
return true;
|
|
60
|
+
if (lowerMinor < 8)
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
exports.ARITH_OPERATORS = new Set(['+', '-', '*']);
|
|
66
|
+
// Compound-assignment forms of the arithmetic operators above. These are only
|
|
67
|
+
// flagged when seen inside an `unchecked { ... }` block, where they share the
|
|
68
|
+
// same wrap-around runtime behavior as their binary counterparts. Outside
|
|
69
|
+
// `unchecked`, Solidity >=0.8.0 still inserts the overflow check, so the
|
|
70
|
+
// rule stays quiet to match the existing v0.2 contract.
|
|
71
|
+
exports.COMPOUND_ARITH_OPERATORS = new Set(['+=', '-=', '*=']);
|
|
72
|
+
// Maps each compound arithmetic operator to the equivalent bare arithmetic
|
|
73
|
+
// operator. Used to canonicalize the guard-lookup signature for `+=`/`-=`/`*=`
|
|
74
|
+
// so that `require(a + b >= a); unchecked { a += b; }` matches the same
|
|
75
|
+
// suppression entry as the `unchecked { a = a + b; }` form.
|
|
76
|
+
exports.COMPOUND_TO_BARE_ARITH = new Map([
|
|
77
|
+
['+=', '+'],
|
|
78
|
+
['-=', '-'],
|
|
79
|
+
['*=', '*']
|
|
80
|
+
]);
|
|
81
|
+
// Maps every flagged operator (binary or compound) to its overflow direction.
|
|
82
|
+
exports.ARITH_DIRECTION = new Map([
|
|
83
|
+
['+', 'overflow'],
|
|
84
|
+
['-', 'underflow'],
|
|
85
|
+
['*', 'overflow'],
|
|
86
|
+
['+=', 'overflow'],
|
|
87
|
+
['-=', 'underflow'],
|
|
88
|
+
['*=', 'overflow']
|
|
89
|
+
]);
|
|
90
|
+
function isArithmeticBinaryOp(node) {
|
|
91
|
+
return !!node && node.type === 'BinaryOperation' && exports.ARITH_OPERATORS.has(node.operator);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Classify a Solidity AST `typeName` node as `unsigned`, `signed`, or
|
|
95
|
+
* `unknown`. Accepts both the `@solidity-parser/parser` shape (`type` field)
|
|
96
|
+
* and the solc compact JSON shape (`nodeType` field). Anything that is not a
|
|
97
|
+
* direct `uint*` or `int*` elementary type is reported as `unknown`, which
|
|
98
|
+
* the caller treats conservatively as "do not suppress".
|
|
99
|
+
*/
|
|
100
|
+
function classifyTypeName(typeName) {
|
|
101
|
+
if (!typeName || typeof typeName !== 'object')
|
|
102
|
+
return 'unknown';
|
|
103
|
+
const kind = typeName.type || typeName.nodeType;
|
|
104
|
+
if (kind !== 'ElementaryTypeName')
|
|
105
|
+
return 'unknown';
|
|
106
|
+
const name = String(typeName.name || '').toLowerCase();
|
|
107
|
+
if (name.startsWith('uint'))
|
|
108
|
+
return 'unsigned';
|
|
109
|
+
if (name.startsWith('int'))
|
|
110
|
+
return 'signed';
|
|
111
|
+
return 'unknown';
|
|
112
|
+
}
|
|
113
|
+
function isConstantExpr(expr) {
|
|
114
|
+
if (!expr || typeof expr !== 'object')
|
|
115
|
+
return false;
|
|
116
|
+
if (expr.type === 'NumberLiteral' || expr.type === 'HexLiteral' || expr.type === 'BooleanLiteral') {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
if (expr.type === 'BinaryOperation') {
|
|
120
|
+
return isConstantExpr(expr.left) && isConstantExpr(expr.right);
|
|
121
|
+
}
|
|
122
|
+
if (expr.type === 'UnaryOperation') {
|
|
123
|
+
return isConstantExpr(expr.subExpression);
|
|
124
|
+
}
|
|
125
|
+
if (expr.type === 'TupleExpression') {
|
|
126
|
+
const components = expr.components || [];
|
|
127
|
+
return components.length > 0 && components.every((c) => c == null || isConstantExpr(c));
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
function expressionSignature(expr) {
|
|
132
|
+
if (!expr || typeof expr !== 'object')
|
|
133
|
+
return '';
|
|
134
|
+
switch (expr.type) {
|
|
135
|
+
case 'Identifier':
|
|
136
|
+
return `id:${expr.name || ''}`;
|
|
137
|
+
case 'NumberLiteral':
|
|
138
|
+
return `num:${expr.number ?? expr.value ?? ''}`;
|
|
139
|
+
case 'HexLiteral':
|
|
140
|
+
return `hex:${expr.value ?? ''}`;
|
|
141
|
+
case 'BooleanLiteral':
|
|
142
|
+
return `bool:${expr.value ?? ''}`;
|
|
143
|
+
case 'StringLiteral':
|
|
144
|
+
return `str:${expr.value ?? ''}`;
|
|
145
|
+
case 'BinaryOperation':
|
|
146
|
+
return `(${expressionSignature(expr.left)}${expr.operator}${expressionSignature(expr.right)})`;
|
|
147
|
+
case 'UnaryOperation':
|
|
148
|
+
return `${expr.operator}${expressionSignature(expr.subExpression)}`;
|
|
149
|
+
case 'MemberAccess':
|
|
150
|
+
return `${expressionSignature(expr.expression)}.${expr.memberName || ''}`;
|
|
151
|
+
case 'IndexAccess':
|
|
152
|
+
return `${expressionSignature(expr.base)}[${expressionSignature(expr.index)}]`;
|
|
153
|
+
case 'TupleExpression': {
|
|
154
|
+
const parts = (expr.components || []).map((c) => (c ? expressionSignature(c) : ''));
|
|
155
|
+
return `(${parts.join(',')})`;
|
|
156
|
+
}
|
|
157
|
+
case 'FunctionCall': {
|
|
158
|
+
const args = (expr.arguments || []).map(expressionSignature).join(',');
|
|
159
|
+
return `${expressionSignature(expr.expression)}(${args})`;
|
|
160
|
+
}
|
|
161
|
+
default:
|
|
162
|
+
return `?:${expr.type || 'unknown'}`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function unwrapTuple(expr) {
|
|
166
|
+
while (expr &&
|
|
167
|
+
expr.type === 'TupleExpression' &&
|
|
168
|
+
Array.isArray(expr.components) &&
|
|
169
|
+
expr.components.length === 1 &&
|
|
170
|
+
expr.components[0]) {
|
|
171
|
+
expr = expr.components[0];
|
|
172
|
+
}
|
|
173
|
+
return expr;
|
|
174
|
+
}
|
|
175
|
+
function exprEquals(a, b) {
|
|
176
|
+
const sa = expressionSignature(unwrapTuple(a));
|
|
177
|
+
const sb = expressionSignature(unwrapTuple(b));
|
|
178
|
+
return !!sa && sa === sb;
|
|
179
|
+
}
|
|
180
|
+
function isZeroLiteral(expr) {
|
|
181
|
+
if (!expr || expr.type !== 'NumberLiteral')
|
|
182
|
+
return false;
|
|
183
|
+
const raw = expr.number ?? expr.value ?? '';
|
|
184
|
+
return String(raw).trim() === '0';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Add the signature of an arithmetic binary op to `sigs`, plus its commuted
|
|
188
|
+
* form for `+` and `*`. This is what lets `require(a + b >= a)` suppress
|
|
189
|
+
* `b + a` in the body too.
|
|
190
|
+
*
|
|
191
|
+
* The signature is only emitted when both operands are known to be unsigned
|
|
192
|
+
* integers. For signed integers, predicates like `a >= b` or `a + b >= a`
|
|
193
|
+
* do not actually rule out wrap-around (e.g. `int256.max - (-1)` overflows),
|
|
194
|
+
* so we leave the eventual `BinaryOperation` to be reported.
|
|
195
|
+
*/
|
|
196
|
+
function addCommutativeArithmeticSig(arith, sigs, isUnsigned) {
|
|
197
|
+
arith = unwrapTuple(arith);
|
|
198
|
+
if (!isArithmeticBinaryOp(arith))
|
|
199
|
+
return;
|
|
200
|
+
const left = unwrapTuple(arith.left);
|
|
201
|
+
const right = unwrapTuple(arith.right);
|
|
202
|
+
if (!isUnsigned(left) || !isUnsigned(right))
|
|
203
|
+
return;
|
|
204
|
+
const sig = `(${expressionSignature(left)}${arith.operator}${expressionSignature(right)})`;
|
|
205
|
+
if (sig)
|
|
206
|
+
sigs.add(sig);
|
|
207
|
+
if (arith.operator === '+' || arith.operator === '*') {
|
|
208
|
+
const commuted = `(${expressionSignature(right)}${arith.operator}${expressionSignature(left)})`;
|
|
209
|
+
if (commuted)
|
|
210
|
+
sigs.add(commuted);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Recognise an addition overflow guard from a relational predicate.
|
|
215
|
+
* Accepted shapes (commutative on the addition operands):
|
|
216
|
+
* (a + b) >= a, (a + b) >= b, (a + b) > a, (a + b) > b
|
|
217
|
+
* a <= (a + b), b <= (a + b), a < (a + b), b < (a + b)
|
|
218
|
+
* Rejects ineffective predicates like `(a + b) > 0`.
|
|
219
|
+
*/
|
|
220
|
+
function recognizeAdditionOverflowGuard(pred, sigs, isUnsigned) {
|
|
221
|
+
if (!pred || pred.type !== 'BinaryOperation')
|
|
222
|
+
return;
|
|
223
|
+
const op = pred.operator;
|
|
224
|
+
const lhs = unwrapTuple(pred.left);
|
|
225
|
+
const rhs = unwrapTuple(pred.right);
|
|
226
|
+
if (op === '>=' || op === '>') {
|
|
227
|
+
if (isArithmeticBinaryOp(lhs) && lhs.operator === '+') {
|
|
228
|
+
if (exprEquals(lhs.left, rhs) || exprEquals(lhs.right, rhs)) {
|
|
229
|
+
addCommutativeArithmeticSig(lhs, sigs, isUnsigned);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (op === '<=' || op === '<') {
|
|
234
|
+
if (isArithmeticBinaryOp(rhs) && rhs.operator === '+') {
|
|
235
|
+
if (exprEquals(rhs.left, lhs) || exprEquals(rhs.right, lhs)) {
|
|
236
|
+
addCommutativeArithmeticSig(rhs, sigs, isUnsigned);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Recognise a subtraction underflow guard.
|
|
243
|
+
*
|
|
244
|
+
* Pre-checks (no `-` in the predicate, the eventual `a - b` is constructed):
|
|
245
|
+
* a >= b, a > b, b <= a, b < a
|
|
246
|
+
*
|
|
247
|
+
* Post-checks (the subtraction itself appears in the predicate):
|
|
248
|
+
* (a - b) <= a, (a - b) < a, a >= (a - b), a > (a - b)
|
|
249
|
+
*
|
|
250
|
+
* Rejects ineffective predicates like `(a - b) >= 0` (always true on uint).
|
|
251
|
+
*/
|
|
252
|
+
function recognizeSubtractionUnderflowGuard(pred, sigs, isUnsigned) {
|
|
253
|
+
if (!pred || pred.type !== 'BinaryOperation')
|
|
254
|
+
return;
|
|
255
|
+
const op = pred.operator;
|
|
256
|
+
const lhs = unwrapTuple(pred.left);
|
|
257
|
+
const rhs = unwrapTuple(pred.right);
|
|
258
|
+
// Post-check forms first — they take precedence when `-` appears.
|
|
259
|
+
if (op === '<=' || op === '<') {
|
|
260
|
+
if (isArithmeticBinaryOp(lhs) && lhs.operator === '-') {
|
|
261
|
+
if (exprEquals(lhs.left, rhs)) {
|
|
262
|
+
addCommutativeArithmeticSig(lhs, sigs, isUnsigned);
|
|
263
|
+
}
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (op === '>=' || op === '>') {
|
|
268
|
+
if (isArithmeticBinaryOp(rhs) && rhs.operator === '-') {
|
|
269
|
+
if (exprEquals(rhs.left, lhs)) {
|
|
270
|
+
addCommutativeArithmeticSig(rhs, sigs, isUnsigned);
|
|
271
|
+
}
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Pre-check forms: a >= b, a > b → guard for a - b. The eventual `a - b`
|
|
276
|
+
// is unsigned-safe under this predicate ONLY when both operands are
|
|
277
|
+
// declared unsigned; for signed integers, `int256.max >= -1` holds yet
|
|
278
|
+
// `int256.max - (-1)` still overflows.
|
|
279
|
+
if (op === '>=' || op === '>') {
|
|
280
|
+
if (!isArithmeticBinaryOp(lhs) && !isArithmeticBinaryOp(rhs)) {
|
|
281
|
+
if (!isUnsigned(lhs) || !isUnsigned(rhs))
|
|
282
|
+
return;
|
|
283
|
+
const ls = expressionSignature(lhs);
|
|
284
|
+
const rs = expressionSignature(rhs);
|
|
285
|
+
if (ls && rs)
|
|
286
|
+
sigs.add(`(${ls}-${rs})`);
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// b <= a, b < a → guard for a - b (operands swapped).
|
|
291
|
+
if (op === '<=' || op === '<') {
|
|
292
|
+
if (!isArithmeticBinaryOp(lhs) && !isArithmeticBinaryOp(rhs)) {
|
|
293
|
+
if (!isUnsigned(lhs) || !isUnsigned(rhs))
|
|
294
|
+
return;
|
|
295
|
+
const ls = expressionSignature(lhs);
|
|
296
|
+
const rs = expressionSignature(rhs);
|
|
297
|
+
if (ls && rs)
|
|
298
|
+
sigs.add(`(${rs}-${ls})`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Recognise a multiplication overflow guard. Two accepted shapes:
|
|
304
|
+
* (a * b) <= MAX, (a * b) < MAX, MAX >= (a * b), MAX > (a * b)
|
|
305
|
+
* a == 0 || (a * b) / a == b (and commutative variants)
|
|
306
|
+
* Rejects ineffective predicates like `(a * b) != 0`.
|
|
307
|
+
*/
|
|
308
|
+
function recognizeMultiplicationOverflowGuard(pred, sigs, isUnsigned) {
|
|
309
|
+
if (!pred || pred.type !== 'BinaryOperation')
|
|
310
|
+
return;
|
|
311
|
+
const op = pred.operator;
|
|
312
|
+
const lhs = unwrapTuple(pred.left);
|
|
313
|
+
const rhs = unwrapTuple(pred.right);
|
|
314
|
+
if (op === '<=' || op === '<') {
|
|
315
|
+
if (isArithmeticBinaryOp(lhs) && lhs.operator === '*') {
|
|
316
|
+
addCommutativeArithmeticSig(lhs, sigs, isUnsigned);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (op === '>=' || op === '>') {
|
|
321
|
+
if (isArithmeticBinaryOp(rhs) && rhs.operator === '*') {
|
|
322
|
+
addCommutativeArithmeticSig(rhs, sigs, isUnsigned);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Recognise the SafeMath multiplication guard `a == 0 || (a * b) / a == b`,
|
|
328
|
+
* accepting both orderings of the `||` and the equality, plus the commutative
|
|
329
|
+
* `b * a`. Returns true if a guard signature was added.
|
|
330
|
+
*/
|
|
331
|
+
function recognizeMultiplicationOrGuard(orPred, sigs, isUnsigned) {
|
|
332
|
+
if (!orPred || orPred.type !== 'BinaryOperation' || orPred.operator !== '||')
|
|
333
|
+
return false;
|
|
334
|
+
const sides = [unwrapTuple(orPred.left), unwrapTuple(orPred.right)];
|
|
335
|
+
let zeroVar = null;
|
|
336
|
+
let divEq = null;
|
|
337
|
+
for (const side of sides) {
|
|
338
|
+
if (side?.type === 'BinaryOperation' && side.operator === '==') {
|
|
339
|
+
const sl = unwrapTuple(side.left);
|
|
340
|
+
const sr = unwrapTuple(side.right);
|
|
341
|
+
if (isZeroLiteral(sr)) {
|
|
342
|
+
zeroVar = sl;
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (isZeroLiteral(sl)) {
|
|
346
|
+
zeroVar = sr;
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
divEq = side;
|
|
351
|
+
}
|
|
352
|
+
if (!zeroVar || !divEq)
|
|
353
|
+
return false;
|
|
354
|
+
if (divEq.type !== 'BinaryOperation' || divEq.operator !== '==')
|
|
355
|
+
return false;
|
|
356
|
+
// One side of `==` must be a `/` over a `*`; the other side is the partner operand.
|
|
357
|
+
const eqSides = [unwrapTuple(divEq.left), unwrapTuple(divEq.right)];
|
|
358
|
+
let divExpr = null;
|
|
359
|
+
let partner = null;
|
|
360
|
+
for (const s of eqSides) {
|
|
361
|
+
if (s?.type === 'BinaryOperation' && s.operator === '/')
|
|
362
|
+
divExpr = s;
|
|
363
|
+
else
|
|
364
|
+
partner = s;
|
|
365
|
+
}
|
|
366
|
+
if (!divExpr || !partner)
|
|
367
|
+
return false;
|
|
368
|
+
const mul = unwrapTuple(divExpr.left);
|
|
369
|
+
const divisor = unwrapTuple(divExpr.right);
|
|
370
|
+
if (!isArithmeticBinaryOp(mul) || mul.operator !== '*')
|
|
371
|
+
return false;
|
|
372
|
+
if (!exprEquals(divisor, zeroVar))
|
|
373
|
+
return false;
|
|
374
|
+
// Partner must equal the OTHER multiplicand.
|
|
375
|
+
if (exprEquals(divisor, mul.left) && exprEquals(partner, mul.right)) {
|
|
376
|
+
addCommutativeArithmeticSig(mul, sigs, isUnsigned);
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
if (exprEquals(divisor, mul.right) && exprEquals(partner, mul.left)) {
|
|
380
|
+
addCommutativeArithmeticSig(mul, sigs, isUnsigned);
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Walk the top-level boolean shape of a `require`/`assert` argument and emit
|
|
387
|
+
* guard signatures for the recognised overflow/underflow predicates. Combines
|
|
388
|
+
* sides of `&&` (each side stands as its own guard); `||` is only honoured for
|
|
389
|
+
* the SafeMath multiplication pattern.
|
|
390
|
+
*/
|
|
391
|
+
function collectGuardSignatures(arg, sigs, isUnsigned) {
|
|
392
|
+
arg = unwrapTuple(arg);
|
|
393
|
+
if (!arg || typeof arg !== 'object')
|
|
394
|
+
return;
|
|
395
|
+
if (arg.type === 'StringLiteral')
|
|
396
|
+
return;
|
|
397
|
+
if (arg.type === 'BinaryOperation' && arg.operator === '&&') {
|
|
398
|
+
collectGuardSignatures(arg.left, sigs, isUnsigned);
|
|
399
|
+
collectGuardSignatures(arg.right, sigs, isUnsigned);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (arg.type === 'BinaryOperation' && arg.operator === '||') {
|
|
403
|
+
recognizeMultiplicationOrGuard(arg, sigs, isUnsigned);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
recognizeAdditionOverflowGuard(arg, sigs, isUnsigned);
|
|
407
|
+
recognizeSubtractionUnderflowGuard(arg, sigs, isUnsigned);
|
|
408
|
+
recognizeMultiplicationOverflowGuard(arg, sigs, isUnsigned);
|
|
409
|
+
}
|
|
410
|
+
function isRequireFunctionCall(node) {
|
|
411
|
+
if (!node || node.type !== 'FunctionCall')
|
|
412
|
+
return false;
|
|
413
|
+
const callee = node.expression;
|
|
414
|
+
if (!callee)
|
|
415
|
+
return false;
|
|
416
|
+
if (callee.type === 'Identifier') {
|
|
417
|
+
const name = callee.name || '';
|
|
418
|
+
return name === 'require' || name === 'assert';
|
|
419
|
+
}
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=integer-overflow-helpers.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface LoopCallStackEnrichment {
|
|
2
|
+
callPath: string;
|
|
3
|
+
messageSuffix: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function enrichLoopCallStack(finding: {
|
|
6
|
+
message: string;
|
|
7
|
+
callPath?: string;
|
|
8
|
+
}, callPath: string | null): void;
|
|
9
|
+
export declare function loopCallPathForFunction(contractNode: any, targetFunctionNode: any): string | null;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enrichLoopCallStack = enrichLoopCallStack;
|
|
4
|
+
exports.loopCallPathForFunction = loopCallPathForFunction;
|
|
5
|
+
const MAX_CALL_DEPTH = 16;
|
|
6
|
+
function enrichLoopCallStack(finding, callPath) {
|
|
7
|
+
if (!callPath)
|
|
8
|
+
return;
|
|
9
|
+
finding.callPath = callPath;
|
|
10
|
+
finding.message = `${finding.message} Loop call stack: ${callPath}`;
|
|
11
|
+
}
|
|
12
|
+
function loopCallPathForFunction(contractNode, targetFunctionNode) {
|
|
13
|
+
const targetName = functionName(targetFunctionNode);
|
|
14
|
+
if (!targetName)
|
|
15
|
+
return null;
|
|
16
|
+
const functions = collectFunctions(contractNode);
|
|
17
|
+
if (!functions.has(targetName))
|
|
18
|
+
return null;
|
|
19
|
+
const ancestorStarts = Array.from(functions.values()).filter((fn) => fn.name !== targetName && fn.reachableFromOutside && canReach(fn.name, targetName, functions));
|
|
20
|
+
const starts = ancestorStarts.length > 0
|
|
21
|
+
? ancestorStarts
|
|
22
|
+
: Array.from(functions.values()).filter((fn) => fn.name === targetName && fn.reachableFromOutside);
|
|
23
|
+
for (const start of starts) {
|
|
24
|
+
const path = findPath(start.name, targetName, functions);
|
|
25
|
+
if (path)
|
|
26
|
+
return path.join(' -> ');
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
function collectFunctions(contractNode) {
|
|
31
|
+
const functions = new Map();
|
|
32
|
+
for (const node of contractNode?.subNodes || []) {
|
|
33
|
+
if (node?.type !== 'FunctionDefinition' || !node.body)
|
|
34
|
+
continue;
|
|
35
|
+
const name = functionName(node);
|
|
36
|
+
if (!name)
|
|
37
|
+
continue;
|
|
38
|
+
functions.set(name, {
|
|
39
|
+
name,
|
|
40
|
+
node,
|
|
41
|
+
calls: collectSameContractCalls(node.body),
|
|
42
|
+
reachableFromOutside: isExternallyReachable(node),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return functions;
|
|
46
|
+
}
|
|
47
|
+
function findPath(start, target, functions) {
|
|
48
|
+
const queue = [[start]];
|
|
49
|
+
const seen = new Set();
|
|
50
|
+
while (queue.length > 0) {
|
|
51
|
+
const path = queue.shift();
|
|
52
|
+
const current = path[path.length - 1];
|
|
53
|
+
if (current === target)
|
|
54
|
+
return path;
|
|
55
|
+
if (seen.has(current))
|
|
56
|
+
continue;
|
|
57
|
+
seen.add(current);
|
|
58
|
+
if (path.length >= MAX_CALL_DEPTH)
|
|
59
|
+
continue;
|
|
60
|
+
const fn = functions.get(current);
|
|
61
|
+
if (!fn)
|
|
62
|
+
continue;
|
|
63
|
+
for (const callee of fn.calls) {
|
|
64
|
+
if (!functions.has(callee))
|
|
65
|
+
continue;
|
|
66
|
+
if (path.includes(callee) && callee !== target)
|
|
67
|
+
continue;
|
|
68
|
+
queue.push([...path, callee]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function canReach(start, target, functions) {
|
|
74
|
+
return findPath(start, target, functions) !== null;
|
|
75
|
+
}
|
|
76
|
+
function collectSameContractCalls(root) {
|
|
77
|
+
const calls = [];
|
|
78
|
+
const visit = (node) => {
|
|
79
|
+
if (!node || typeof node !== 'object')
|
|
80
|
+
return;
|
|
81
|
+
if (node.type === 'FunctionCall') {
|
|
82
|
+
const name = sameContractCallName(node);
|
|
83
|
+
if (name)
|
|
84
|
+
calls.push(name);
|
|
85
|
+
}
|
|
86
|
+
for (const child of childNodes(node))
|
|
87
|
+
visit(child);
|
|
88
|
+
};
|
|
89
|
+
visit(root);
|
|
90
|
+
return calls;
|
|
91
|
+
}
|
|
92
|
+
function sameContractCallName(call) {
|
|
93
|
+
const expr = call?.expression;
|
|
94
|
+
if (expr?.type === 'Identifier')
|
|
95
|
+
return String(expr.name || '') || null;
|
|
96
|
+
if (expr?.type === 'MemberAccess' && expr.memberName && expr.expression?.type === 'Identifier' && expr.expression.name === 'this') {
|
|
97
|
+
return String(expr.memberName);
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function functionName(node) {
|
|
102
|
+
const name = String(node?.name || '');
|
|
103
|
+
if (name)
|
|
104
|
+
return name;
|
|
105
|
+
if (node?.isConstructor || String(node?.kind || '').toLowerCase() === 'constructor')
|
|
106
|
+
return '<constructor>';
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function isExternallyReachable(node) {
|
|
110
|
+
if (node?.isConstructor || String(node?.kind || '').toLowerCase() === 'constructor')
|
|
111
|
+
return false;
|
|
112
|
+
const visibility = String(node?.visibility || '').toLowerCase();
|
|
113
|
+
return visibility === 'public' || visibility === 'external' || visibility === 'default' || visibility === '';
|
|
114
|
+
}
|
|
115
|
+
function childNodes(node) {
|
|
116
|
+
const children = [];
|
|
117
|
+
for (const [key, value] of Object.entries(node || {})) {
|
|
118
|
+
if (key === 'loc' || key === 'range')
|
|
119
|
+
continue;
|
|
120
|
+
if (Array.isArray(value)) {
|
|
121
|
+
for (const item of value) {
|
|
122
|
+
if (item && typeof item === 'object')
|
|
123
|
+
children.push(item);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (value && typeof value === 'object') {
|
|
127
|
+
children.push(value);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return children;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=loop-call-stack.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const AMM_SPOT_SOURCES: ReadonlySet<string>;
|
|
2
|
+
export declare const TWAP_CALLS: ReadonlySet<string>;
|
|
3
|
+
export declare const SINK_CALL_NAMES: Set<string>;
|
|
4
|
+
export declare const LIQUIDITY_WITHDRAWAL_CALL_NAMES: Set<string>;
|
|
5
|
+
export declare function isLiquidityWithdrawalCall(callNode: any, getCalleeName: (expr: any) => string): boolean;
|