@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,85 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
import type { SemanticModel } from '../semantic/model';
|
|
3
|
+
import type { TaintTracker } from '../semantic/taint-tracker';
|
|
4
|
+
export type DetectorAstKind = 'parser' | 'solc';
|
|
5
|
+
/**
|
|
6
|
+
* Optional context passed to detectors that need cross-file information.
|
|
7
|
+
* Slice 1 of roadmap 3.3 shipped the SemanticModel; Slice 2 (this and
|
|
8
|
+
* follow-ups) wires detectors to consume it. Detectors that don't read
|
|
9
|
+
* `semantic` are unaffected — the context is purely additive.
|
|
10
|
+
*
|
|
11
|
+
* Detectors that adopt `semantic` MUST keep a per-file fallback so they
|
|
12
|
+
* still work when the model is absent (single-file tests
|
|
13
|
+
* that drive a detector directly, etc.). Treat `ctx.semantic === undefined`
|
|
14
|
+
* as "no cross-file info available", not as an error.
|
|
15
|
+
*/
|
|
16
|
+
export interface DetectorContext {
|
|
17
|
+
/** The file being scanned. Mirrors what `setFile(file)` would receive. */
|
|
18
|
+
file: string;
|
|
19
|
+
/** Optional compiler version supplied by the caller/CLI when a source pragma is unavailable. */
|
|
20
|
+
solcVersion?: string;
|
|
21
|
+
/** The SemanticModel built from all parsed source units in this scan. Undefined when unavailable. */
|
|
22
|
+
semantic?: SemanticModel;
|
|
23
|
+
/** Shared detector-facing taint tracker built from the analyzed source set. */
|
|
24
|
+
taint?: TaintTracker;
|
|
25
|
+
}
|
|
26
|
+
export interface Detector {
|
|
27
|
+
id: string;
|
|
28
|
+
patternKey?: string;
|
|
29
|
+
descriptor?: {
|
|
30
|
+
id: string;
|
|
31
|
+
shortDescription: string;
|
|
32
|
+
helpUri: string;
|
|
33
|
+
defaultSeverity: 'critical' | 'high' | 'medium' | 'low' | 'informational';
|
|
34
|
+
help?: string;
|
|
35
|
+
};
|
|
36
|
+
supportedAstKinds?: DetectorAstKind[];
|
|
37
|
+
enabledByDefault?: boolean;
|
|
38
|
+
setFile?(file: string): void;
|
|
39
|
+
setContext?(ctx: DetectorContext): void;
|
|
40
|
+
setSourceText?(sourceText?: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Receive the SemanticModel for the current scan (if one is available).
|
|
43
|
+
* Called by the registry once per file alongside `setFile`. Visitor-style
|
|
44
|
+
* detectors implement this to gain cross-file context. The model is the
|
|
45
|
+
* SAME instance for every file in a single scan invocation.
|
|
46
|
+
*/
|
|
47
|
+
setSemanticModel?(model: SemanticModel | undefined): void;
|
|
48
|
+
getFindings?(): ScanResult[];
|
|
49
|
+
/**
|
|
50
|
+
* Legacy self-traversal entry point. Accepts an optional `ctx` argument
|
|
51
|
+
* carrying the SemanticModel; older detectors that don't read it are
|
|
52
|
+
* unaffected (TypeScript optional params are backward-compatible).
|
|
53
|
+
*/
|
|
54
|
+
scanAst?(ast: any, file: string, sourceText?: string, ctx?: DetectorContext): ScanResult[];
|
|
55
|
+
[visitorMethod: string]: any;
|
|
56
|
+
}
|
|
57
|
+
export declare const LIFECYCLE_METHOD_NAMES: ReadonlySet<string>;
|
|
58
|
+
export declare const SPECIAL_HOOK_NAMES: ReadonlySet<string>;
|
|
59
|
+
export interface FanoutCacheEntry {
|
|
60
|
+
visitorDetectors: Detector[];
|
|
61
|
+
fanout: Record<string, (node: any) => void>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Per-detector traversal cost telemetry (roadmap P.2). Active when the
|
|
65
|
+
* env var `SOLAST_PROFILE=1` is set at registry construction. The
|
|
66
|
+
* registry tracks two counters per detector:
|
|
67
|
+
*
|
|
68
|
+
* - `visits`: number of fan-out dispatches into a visitor handler
|
|
69
|
+
* (or 1 per `scanAst` call for legacy self-traversers).
|
|
70
|
+
* - `timeNs`: cumulative wall-clock nanoseconds spent in the
|
|
71
|
+
* detector's handlers/scanAst calls.
|
|
72
|
+
*
|
|
73
|
+
* Used to confirm Phase 2.A wins are real: a converted visitor-style
|
|
74
|
+
* detector should have lower `timeNs` per file than its scanAst-style
|
|
75
|
+
* predecessor on the same fixture corpus, since the shared visitor
|
|
76
|
+
* pump amortises tree-walking across all subscribed detectors.
|
|
77
|
+
*/
|
|
78
|
+
export interface ProfileStats {
|
|
79
|
+
visits: number;
|
|
80
|
+
timeNs: bigint;
|
|
81
|
+
}
|
|
82
|
+
export interface DetectorProfileEntry extends ProfileStats {
|
|
83
|
+
id: string;
|
|
84
|
+
}
|
|
85
|
+
export declare const PROFILE_ENABLED: boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROFILE_ENABLED = exports.SPECIAL_HOOK_NAMES = exports.LIFECYCLE_METHOD_NAMES = void 0;
|
|
4
|
+
// Methods on a detector that are part of the registry lifecycle, not
|
|
5
|
+
// visitor handlers. These are excluded from the fan-out visitor.
|
|
6
|
+
exports.LIFECYCLE_METHOD_NAMES = new Set([
|
|
7
|
+
'constructor', 'setFile', 'setContext', 'setSourceText', 'setSemanticModel', 'getFindings', 'scanAst',
|
|
8
|
+
]);
|
|
9
|
+
// Special hooks the solc walker fires that are NOT named after AST node
|
|
10
|
+
// types. The access-control detector uses these to track when the walker
|
|
11
|
+
// enters or leaves a nested statement body (if/for/while/etc.). They are
|
|
12
|
+
// preserved by the fan-out so multi-detector runs still see them.
|
|
13
|
+
exports.SPECIAL_HOOK_NAMES = new Set([
|
|
14
|
+
'enterNestedStatementBody', 'exitNestedStatementBody',
|
|
15
|
+
]);
|
|
16
|
+
// Captured at module load — not constructor time — so test harnesses that
|
|
17
|
+
// load this module under a temporary `withEnv` block see the value they
|
|
18
|
+
// set, even if they construct the registry after restoring the env.
|
|
19
|
+
exports.PROFILE_ENABLED = process.env.SOLAST_PROFILE === '1';
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
/**
|
|
3
|
+
* Flags externally-callable functions that move a *caller-supplied* party's
|
|
4
|
+
* ERC-20 allowance — `transferFrom(payer, ...)` / `safeTransferFrom(token,
|
|
5
|
+
* payer, ...)` where `payer` is (or derives from) a function parameter —
|
|
6
|
+
* without any guard tying `msg.sender` to that payer.
|
|
7
|
+
*
|
|
8
|
+
* This is the Ekubo EVM swap-router shape (#2768): a payment callback that
|
|
9
|
+
* accepts `payer` / `token` / `amount` from attacker-controlled payload and
|
|
10
|
+
* drains the payer's outstanding approval. Heuristic and FP-prone — see
|
|
11
|
+
* `docs/detectors/unauthorized-payer-transferfrom.md` — so emitted at low
|
|
12
|
+
* confidence.
|
|
13
|
+
*/
|
|
14
|
+
export declare class UnauthorizedPayerTransferfromDetector {
|
|
15
|
+
readonly id = "unauthorized-payer-transferfrom";
|
|
16
|
+
readonly patternKey = "unauthorized-payer-transferfrom";
|
|
17
|
+
readonly supportedAstKinds: "parser"[];
|
|
18
|
+
readonly descriptor: {
|
|
19
|
+
id: string;
|
|
20
|
+
shortDescription: string;
|
|
21
|
+
helpUri: string;
|
|
22
|
+
defaultSeverity: "high";
|
|
23
|
+
help: string;
|
|
24
|
+
};
|
|
25
|
+
private findings;
|
|
26
|
+
private currentFile;
|
|
27
|
+
private currentContract;
|
|
28
|
+
private hasSafeErc20ForErc20;
|
|
29
|
+
private contractErc20Names;
|
|
30
|
+
private contractNonErc20Names;
|
|
31
|
+
setFile(file: string): void;
|
|
32
|
+
getFindings(): ScanResult[];
|
|
33
|
+
ContractDefinition(node: any): void;
|
|
34
|
+
ContractDefinition_post(): void;
|
|
35
|
+
FunctionDefinition(node: any): void;
|
|
36
|
+
/** Walk the body; emit at most one finding per function. */
|
|
37
|
+
private reportFirstVulnerableCall;
|
|
38
|
+
private emit;
|
|
39
|
+
private isExternallyCallable;
|
|
40
|
+
private isFunctionGuarded;
|
|
41
|
+
/** Map locals to the parameter name they are a straight copy of. */
|
|
42
|
+
private collectAliases;
|
|
43
|
+
private collectTokenTypes;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve an expression back to the parameter name it derives from.
|
|
46
|
+
* Handles a bare identifier, a struct-field access of a parameter
|
|
47
|
+
* (`payment.payer`), and a local alias of either. Returns null for
|
|
48
|
+
* anything else (a deeper `abi.decode(bytes)` flow is a documented miss).
|
|
49
|
+
*/
|
|
50
|
+
private getBaseParamName;
|
|
51
|
+
/**
|
|
52
|
+
* The `from` argument of a `transferFrom` / `safeTransferFrom` call, or
|
|
53
|
+
* null if the call is neither. ERC-20 `transferFrom(from, to, amount)`
|
|
54
|
+
* and SafeERC20 shapes: static `SafeERC20.safeTransferFrom(token, from,
|
|
55
|
+
* to, amount)` plus extension-style `IERC20(token).safeTransferFrom(from,
|
|
56
|
+
* to, amount)` / `token.safeTransferFrom(from, to, amount)` when there is
|
|
57
|
+
* SafeERC20-for-IERC20 evidence. ERC-721's 3-arg
|
|
58
|
+
* `safeTransferFrom(from, to, tokenId)` is intentionally out of scope.
|
|
59
|
+
*/
|
|
60
|
+
private getFromArgument;
|
|
61
|
+
private recordUsingFor;
|
|
62
|
+
private recordTypedVariable;
|
|
63
|
+
private hasErc20SafeTransferFromEvidence;
|
|
64
|
+
private getDirectCallName;
|
|
65
|
+
private childNodes;
|
|
66
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnauthorizedPayerTransferfromDetector = void 0;
|
|
4
|
+
const access_control_1 = require("./_common/access-control");
|
|
5
|
+
const ast_1 = require("./_common/ast");
|
|
6
|
+
const RULE_ID = 'unauthorized-payer-transferfrom';
|
|
7
|
+
/**
|
|
8
|
+
* Keyword vocabulary for recognising a caller-authorisation predicate. The
|
|
9
|
+
* canonical privileged set plus the auth/allowlist-style names that gate a
|
|
10
|
+
* router (`authorized[msg.sender]`, `whitelist`, `manager`, ...). Kept local
|
|
11
|
+
* per `_common/access-control.ts`'s policy-as-parameter guidance rather than
|
|
12
|
+
* widening the shared default set.
|
|
13
|
+
*/
|
|
14
|
+
const GUARD_KEYWORDS = Object.freeze([
|
|
15
|
+
...access_control_1.DEFAULT_PRIVILEGED_KEYWORDS,
|
|
16
|
+
'auth', 'authority', 'manager', 'whitelist', 'allowlist', 'allowed', 'caller',
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Flags externally-callable functions that move a *caller-supplied* party's
|
|
20
|
+
* ERC-20 allowance — `transferFrom(payer, ...)` / `safeTransferFrom(token,
|
|
21
|
+
* payer, ...)` where `payer` is (or derives from) a function parameter —
|
|
22
|
+
* without any guard tying `msg.sender` to that payer.
|
|
23
|
+
*
|
|
24
|
+
* This is the Ekubo EVM swap-router shape (#2768): a payment callback that
|
|
25
|
+
* accepts `payer` / `token` / `amount` from attacker-controlled payload and
|
|
26
|
+
* drains the payer's outstanding approval. Heuristic and FP-prone — see
|
|
27
|
+
* `docs/detectors/unauthorized-payer-transferfrom.md` — so emitted at low
|
|
28
|
+
* confidence.
|
|
29
|
+
*/
|
|
30
|
+
class UnauthorizedPayerTransferfromDetector {
|
|
31
|
+
id = RULE_ID;
|
|
32
|
+
patternKey = RULE_ID;
|
|
33
|
+
supportedAstKinds = ['parser'];
|
|
34
|
+
descriptor = {
|
|
35
|
+
id: RULE_ID,
|
|
36
|
+
shortDescription: 'External transferFrom consumes a caller-supplied payer without an access-control guard.',
|
|
37
|
+
helpUri: 'https://snovon.com/',
|
|
38
|
+
defaultSeverity: 'high',
|
|
39
|
+
help: 'Bind the payer to msg.sender (require(msg.sender == payer)), or gate the function with recognized access control.',
|
|
40
|
+
};
|
|
41
|
+
findings = [];
|
|
42
|
+
currentFile = '';
|
|
43
|
+
currentContract = '';
|
|
44
|
+
hasSafeErc20ForErc20 = false;
|
|
45
|
+
contractErc20Names = new Set();
|
|
46
|
+
contractNonErc20Names = new Set();
|
|
47
|
+
setFile(file) {
|
|
48
|
+
this.currentFile = file;
|
|
49
|
+
this.findings = [];
|
|
50
|
+
this.currentContract = '';
|
|
51
|
+
this.hasSafeErc20ForErc20 = false;
|
|
52
|
+
this.contractErc20Names.clear();
|
|
53
|
+
this.contractNonErc20Names.clear();
|
|
54
|
+
}
|
|
55
|
+
getFindings() {
|
|
56
|
+
return this.findings;
|
|
57
|
+
}
|
|
58
|
+
ContractDefinition(node) {
|
|
59
|
+
this.currentContract = String(node?.name || '<anonymous>');
|
|
60
|
+
this.hasSafeErc20ForErc20 = false;
|
|
61
|
+
this.contractErc20Names.clear();
|
|
62
|
+
this.contractNonErc20Names.clear();
|
|
63
|
+
for (const child of node?.subNodes || node?.nodes || []) {
|
|
64
|
+
if ((0, ast_1.isNode)(child, 'UsingForDeclaration'))
|
|
65
|
+
this.recordUsingFor(child);
|
|
66
|
+
if ((0, ast_1.isNode)(child, 'StateVariableDeclaration')) {
|
|
67
|
+
for (const variable of child.variables || [])
|
|
68
|
+
this.recordTypedVariable(variable, this.contractErc20Names, this.contractNonErc20Names);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
ContractDefinition_post() {
|
|
73
|
+
this.currentContract = '';
|
|
74
|
+
this.hasSafeErc20ForErc20 = false;
|
|
75
|
+
this.contractErc20Names.clear();
|
|
76
|
+
this.contractNonErc20Names.clear();
|
|
77
|
+
}
|
|
78
|
+
FunctionDefinition(node) {
|
|
79
|
+
if (!node || !node.body)
|
|
80
|
+
return;
|
|
81
|
+
if (node.isConstructor)
|
|
82
|
+
return;
|
|
83
|
+
if (!this.isExternallyCallable(node))
|
|
84
|
+
return;
|
|
85
|
+
const params = new Set();
|
|
86
|
+
for (const p of node.parameters || []) {
|
|
87
|
+
if (p?.name)
|
|
88
|
+
params.add(String(p.name));
|
|
89
|
+
}
|
|
90
|
+
if (params.size === 0)
|
|
91
|
+
return;
|
|
92
|
+
// A guard relating msg.sender to the payer (or any recognised access
|
|
93
|
+
// control) means the caller is authorised to spend the payer's tokens.
|
|
94
|
+
if (this.isFunctionGuarded(node, params))
|
|
95
|
+
return;
|
|
96
|
+
const aliases = this.collectAliases(node.body);
|
|
97
|
+
const tokenTypes = this.collectTokenTypes(node, node.body);
|
|
98
|
+
this.reportFirstVulnerableCall(node, node.body, params, aliases, tokenTypes);
|
|
99
|
+
}
|
|
100
|
+
/** Walk the body; emit at most one finding per function. */
|
|
101
|
+
reportFirstVulnerableCall(fnNode, node, params, aliases, tokenTypes) {
|
|
102
|
+
if (!node || typeof node !== 'object')
|
|
103
|
+
return false;
|
|
104
|
+
if ((0, ast_1.isNode)(node, 'FunctionCall')) {
|
|
105
|
+
const fromArg = this.getFromArgument(node, tokenTypes);
|
|
106
|
+
if (fromArg) {
|
|
107
|
+
const baseName = this.getBaseParamName(fromArg, aliases);
|
|
108
|
+
if (baseName && params.has(baseName)) {
|
|
109
|
+
this.emit(fnNode, node);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (const child of this.childNodes(node)) {
|
|
115
|
+
if (this.reportFirstVulnerableCall(fnNode, child, params, aliases, tokenTypes))
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
emit(fnNode, callNode) {
|
|
121
|
+
const { line, endLine, column, endColumn } = (0, ast_1.assertLoc)(callNode, fnNode);
|
|
122
|
+
const functionName = String(fnNode?.name || '<anonymous>');
|
|
123
|
+
this.findings.push({
|
|
124
|
+
file: this.currentFile,
|
|
125
|
+
contract: this.currentContract,
|
|
126
|
+
'function': functionName,
|
|
127
|
+
line,
|
|
128
|
+
endLine,
|
|
129
|
+
column,
|
|
130
|
+
endColumn,
|
|
131
|
+
pattern: RULE_ID,
|
|
132
|
+
confidence: 'low',
|
|
133
|
+
category: 'access-control',
|
|
134
|
+
ruleId: RULE_ID,
|
|
135
|
+
severity: 'high',
|
|
136
|
+
message: `External function '${functionName}' calls transferFrom with a caller-supplied payer and no access-control guard — an outstanding ERC-20 approval can be drained by an arbitrary caller.`,
|
|
137
|
+
rationale: "transferFrom moves the `from` party's tokens on the strength of an existing allowance; when `from` is a function parameter the caller, not the payer, decides whose approval is spent.",
|
|
138
|
+
suggestedFix: 'Require the caller to equal the payer (require(msg.sender == payer)), derive the payer from msg.sender, or gate the function with recognized access control.',
|
|
139
|
+
contractName: this.currentContract,
|
|
140
|
+
functionName,
|
|
141
|
+
sourceLocation: { line, column },
|
|
142
|
+
findingId: '',
|
|
143
|
+
contractHash: '',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
isExternallyCallable(node) {
|
|
147
|
+
const visibility = String(node.visibility || '').toLowerCase();
|
|
148
|
+
return visibility === 'public' || visibility === 'external' || visibility === 'default';
|
|
149
|
+
}
|
|
150
|
+
isFunctionGuarded(fn, payerParams) {
|
|
151
|
+
if ((0, access_control_1.hasRecognisedAccessControlModifier)(fn))
|
|
152
|
+
return true;
|
|
153
|
+
// A caller-authorisation predicate counts the payer parameter itself as
|
|
154
|
+
// "privileged": `require(msg.sender == payer)` proves the caller is the
|
|
155
|
+
// payer. Auth/allowlist-style names cover mapping-gated routers.
|
|
156
|
+
const isPrivileged = (name) => {
|
|
157
|
+
if (payerParams.has(name))
|
|
158
|
+
return true;
|
|
159
|
+
return (0, access_control_1.isPrivilegedIdentifier)(name, { keywords: GUARD_KEYWORDS });
|
|
160
|
+
};
|
|
161
|
+
let guarded = false;
|
|
162
|
+
const walk = (node) => {
|
|
163
|
+
if (guarded || !node || typeof node !== 'object')
|
|
164
|
+
return;
|
|
165
|
+
if ((0, ast_1.isNode)(node, 'FunctionCall')) {
|
|
166
|
+
const calleeName = this.getDirectCallName(node.expression);
|
|
167
|
+
if (calleeName === 'require' || calleeName === 'assert') {
|
|
168
|
+
const condition = (node.arguments || [])[0];
|
|
169
|
+
if ((0, access_control_1.requireExpressesAccessControl)(condition, isPrivileged))
|
|
170
|
+
guarded = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const child of this.childNodes(node))
|
|
174
|
+
walk(child);
|
|
175
|
+
};
|
|
176
|
+
walk(fn.body);
|
|
177
|
+
return guarded;
|
|
178
|
+
}
|
|
179
|
+
/** Map locals to the parameter name they are a straight copy of. */
|
|
180
|
+
collectAliases(body) {
|
|
181
|
+
const aliases = new Map();
|
|
182
|
+
const walk = (node) => {
|
|
183
|
+
if (!node || typeof node !== 'object')
|
|
184
|
+
return;
|
|
185
|
+
if ((0, ast_1.isNode)(node, 'VariableDeclarationStatement') && node.initialValue) {
|
|
186
|
+
const baseName = this.getBaseParamName(node.initialValue, aliases);
|
|
187
|
+
if (baseName) {
|
|
188
|
+
for (const v of node.variables || []) {
|
|
189
|
+
if (v?.name)
|
|
190
|
+
aliases.set(String(v.name), baseName);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const child of this.childNodes(node))
|
|
195
|
+
walk(child);
|
|
196
|
+
};
|
|
197
|
+
walk(body);
|
|
198
|
+
return aliases;
|
|
199
|
+
}
|
|
200
|
+
collectTokenTypes(fn, body) {
|
|
201
|
+
const names = {
|
|
202
|
+
erc20: new Set(this.contractErc20Names),
|
|
203
|
+
nonErc20: new Set(this.contractNonErc20Names),
|
|
204
|
+
};
|
|
205
|
+
for (const param of fn.parameters || [])
|
|
206
|
+
this.recordTypedVariable(param, names.erc20, names.nonErc20);
|
|
207
|
+
const walk = (node) => {
|
|
208
|
+
if (!node || typeof node !== 'object')
|
|
209
|
+
return;
|
|
210
|
+
if ((0, ast_1.isNode)(node, 'VariableDeclarationStatement')) {
|
|
211
|
+
for (const variable of node.variables || node.declarations || []) {
|
|
212
|
+
this.recordTypedVariable(variable, names.erc20, names.nonErc20);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
for (const child of this.childNodes(node))
|
|
216
|
+
walk(child);
|
|
217
|
+
};
|
|
218
|
+
walk(body);
|
|
219
|
+
return names;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Resolve an expression back to the parameter name it derives from.
|
|
223
|
+
* Handles a bare identifier, a struct-field access of a parameter
|
|
224
|
+
* (`payment.payer`), and a local alias of either. Returns null for
|
|
225
|
+
* anything else (a deeper `abi.decode(bytes)` flow is a documented miss).
|
|
226
|
+
*/
|
|
227
|
+
getBaseParamName(expr, aliases) {
|
|
228
|
+
if (!expr || typeof expr !== 'object')
|
|
229
|
+
return null;
|
|
230
|
+
if ((0, ast_1.isNode)(expr, 'Identifier')) {
|
|
231
|
+
const name = String(expr.name || '');
|
|
232
|
+
return aliases.has(name) ? aliases.get(name) || null : name;
|
|
233
|
+
}
|
|
234
|
+
if ((0, ast_1.isNode)(expr, 'MemberAccess')) {
|
|
235
|
+
return this.getBaseParamName(expr.expression, aliases);
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The `from` argument of a `transferFrom` / `safeTransferFrom` call, or
|
|
241
|
+
* null if the call is neither. ERC-20 `transferFrom(from, to, amount)`
|
|
242
|
+
* and SafeERC20 shapes: static `SafeERC20.safeTransferFrom(token, from,
|
|
243
|
+
* to, amount)` plus extension-style `IERC20(token).safeTransferFrom(from,
|
|
244
|
+
* to, amount)` / `token.safeTransferFrom(from, to, amount)` when there is
|
|
245
|
+
* SafeERC20-for-IERC20 evidence. ERC-721's 3-arg
|
|
246
|
+
* `safeTransferFrom(from, to, tokenId)` is intentionally out of scope.
|
|
247
|
+
*/
|
|
248
|
+
getFromArgument(node, tokenTypes) {
|
|
249
|
+
const expr = node.expression;
|
|
250
|
+
if (!(0, ast_1.isNode)(expr, 'MemberAccess'))
|
|
251
|
+
return null;
|
|
252
|
+
const memberName = String(expr.memberName || '');
|
|
253
|
+
const args = node.arguments || [];
|
|
254
|
+
if (memberName === 'transferFrom' && args.length === 3)
|
|
255
|
+
return args[0];
|
|
256
|
+
if (memberName === 'safeTransferFrom' && args.length === 4)
|
|
257
|
+
return args[1];
|
|
258
|
+
if (memberName === 'safeTransferFrom' && args.length === 3 && this.hasErc20SafeTransferFromEvidence(expr, tokenTypes)) {
|
|
259
|
+
return args[0];
|
|
260
|
+
}
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
recordUsingFor(node) {
|
|
264
|
+
const libraryName = String(node?.libraryName || node?.library?.name || '');
|
|
265
|
+
if (libraryName !== 'SafeERC20')
|
|
266
|
+
return;
|
|
267
|
+
const typeName = typeNameText(node.typeName || node.type);
|
|
268
|
+
if (isErc20TypeName(typeName))
|
|
269
|
+
this.hasSafeErc20ForErc20 = true;
|
|
270
|
+
}
|
|
271
|
+
recordTypedVariable(node, erc20Target, nonErc20Target) {
|
|
272
|
+
const name = String(node?.name || node?.identifier?.name || '');
|
|
273
|
+
if (!name)
|
|
274
|
+
return;
|
|
275
|
+
const typeName = typeNameText(node.typeName);
|
|
276
|
+
if (!typeName)
|
|
277
|
+
return;
|
|
278
|
+
if (isErc20TypeName(typeName))
|
|
279
|
+
erc20Target.add(name);
|
|
280
|
+
else
|
|
281
|
+
nonErc20Target.add(name);
|
|
282
|
+
}
|
|
283
|
+
hasErc20SafeTransferFromEvidence(expr, tokenTypes) {
|
|
284
|
+
const receiver = expr.expression;
|
|
285
|
+
if (isErc20Cast(receiver))
|
|
286
|
+
return true;
|
|
287
|
+
if ((0, ast_1.isNode)(receiver, 'Identifier')) {
|
|
288
|
+
const name = String(receiver.name || '');
|
|
289
|
+
if (tokenTypes.nonErc20.has(name))
|
|
290
|
+
return false;
|
|
291
|
+
if (tokenTypes.erc20.has(name))
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
return this.hasSafeErc20ForErc20;
|
|
295
|
+
}
|
|
296
|
+
getDirectCallName(expr) {
|
|
297
|
+
return (0, ast_1.isNode)(expr, 'Identifier') ? String(expr.name || '') : '';
|
|
298
|
+
}
|
|
299
|
+
childNodes(node) {
|
|
300
|
+
const out = [];
|
|
301
|
+
for (const [key, value] of Object.entries(node)) {
|
|
302
|
+
if (key === 'loc' || key === 'range' || key === 'typeName')
|
|
303
|
+
continue;
|
|
304
|
+
if (Array.isArray(value)) {
|
|
305
|
+
for (const item of value) {
|
|
306
|
+
if (item && typeof item === 'object')
|
|
307
|
+
out.push(item);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else if (value && typeof value === 'object') {
|
|
311
|
+
out.push(value);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.UnauthorizedPayerTransferfromDetector = UnauthorizedPayerTransferfromDetector;
|
|
318
|
+
function typeNameText(typeName) {
|
|
319
|
+
if (!typeName || typeof typeName !== 'object')
|
|
320
|
+
return '';
|
|
321
|
+
if (typeof typeName.namePath === 'string')
|
|
322
|
+
return typeName.namePath;
|
|
323
|
+
if (typeof typeName.name === 'string')
|
|
324
|
+
return typeName.name;
|
|
325
|
+
if (typeName.typeName)
|
|
326
|
+
return typeNameText(typeName.typeName);
|
|
327
|
+
return '';
|
|
328
|
+
}
|
|
329
|
+
function isErc20TypeName(typeName) {
|
|
330
|
+
const tail = typeName.split('.').pop() || typeName;
|
|
331
|
+
return tail === 'IERC20' || tail === 'ERC20';
|
|
332
|
+
}
|
|
333
|
+
function isErc20Cast(expr) {
|
|
334
|
+
if (!expr || !(0, ast_1.isNode)(expr, 'FunctionCall'))
|
|
335
|
+
return false;
|
|
336
|
+
const callee = expr.expression;
|
|
337
|
+
return (0, ast_1.isNode)(callee, 'Identifier') && isErc20TypeName(String(callee.name || ''));
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=unauthorized-payer-transferfrom.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
export declare class UnauthorizedTransferfromShellDetector {
|
|
3
|
+
readonly id = "unauthorized-transferfrom";
|
|
4
|
+
readonly patternKey = "unauthorized-transferfrom";
|
|
5
|
+
readonly supportedAstKinds: ("parser" | "solc")[];
|
|
6
|
+
scanAst(ast: any, file: string, sourceText?: string): ScanResult[];
|
|
7
|
+
}
|