@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,781 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MissingAccessControlDetector = void 0;
|
|
4
|
+
const ast_1 = require("./_common/ast");
|
|
5
|
+
const RULE_ID = 'missing-access-control';
|
|
6
|
+
const CRITICAL_FUNCTION_NAMES = new Set([
|
|
7
|
+
'mint',
|
|
8
|
+
'withdraw',
|
|
9
|
+
'setowner',
|
|
10
|
+
'setadmin',
|
|
11
|
+
'upgrade',
|
|
12
|
+
'pause',
|
|
13
|
+
]);
|
|
14
|
+
// Recognised guard modifiers come from the canonical
|
|
15
|
+
// `_common/ast.ts:ACCESS_CONTROL_MODIFIERS` set (currently 11 entries:
|
|
16
|
+
// onlyOwner, onlyOwners, onlyRole, onlyAdmin, onlyAuthorized, onlyOperator,
|
|
17
|
+
// onlyOperators, onlyGovernance, onlyGovernor, onlyGuardian, onlyManager).
|
|
18
|
+
// Previously this detector only recognised `onlyOwner` / `onlyRole`,
|
|
19
|
+
// which produced false positives on contracts using equally-canonical
|
|
20
|
+
// modifier names like `onlyAdmin` whose body lives in a base contract
|
|
21
|
+
// not visible to the per-file scan (a true positive there requires
|
|
22
|
+
// roadmap 3.3 cross-file inheritance — see the H.3 regression test).
|
|
23
|
+
// Custom guards (`whenNotPaused`, `requiresAuth`, …) still fall through
|
|
24
|
+
// to the structural body check below.
|
|
25
|
+
const CRITICAL_INTERNAL_MUTATOR_NAMES = new Set([
|
|
26
|
+
'_mint',
|
|
27
|
+
'_burn',
|
|
28
|
+
'_pause',
|
|
29
|
+
'_unpause',
|
|
30
|
+
'_upgradeto',
|
|
31
|
+
'_upgradetoandcall',
|
|
32
|
+
'_setimplementation',
|
|
33
|
+
'_transferownership',
|
|
34
|
+
'_setowner',
|
|
35
|
+
'_setadmin',
|
|
36
|
+
'_changeadmin',
|
|
37
|
+
]);
|
|
38
|
+
const PRIVILEGED_STATE_PATTERN = /owner|admin|role|paused|pause|guardian|timelock|governor|fee|treasury|operator/i;
|
|
39
|
+
class MissingAccessControlDetector {
|
|
40
|
+
id = RULE_ID;
|
|
41
|
+
patternKey = RULE_ID;
|
|
42
|
+
supportedAstKinds = ['parser', 'solc'];
|
|
43
|
+
currentFile = '';
|
|
44
|
+
sourceText;
|
|
45
|
+
semantic = undefined;
|
|
46
|
+
findings = [];
|
|
47
|
+
setFile(file) {
|
|
48
|
+
this.currentFile = file;
|
|
49
|
+
this.findings = [];
|
|
50
|
+
}
|
|
51
|
+
setSourceText(sourceText) {
|
|
52
|
+
this.sourceText = sourceText;
|
|
53
|
+
}
|
|
54
|
+
setSemanticModel(model) {
|
|
55
|
+
this.semantic = model;
|
|
56
|
+
}
|
|
57
|
+
getFindings() {
|
|
58
|
+
return this.findings;
|
|
59
|
+
}
|
|
60
|
+
SourceUnit(ast) {
|
|
61
|
+
if (ast?.nodeType === 'SourceUnit') {
|
|
62
|
+
this.findings.push(...this.runAst(ast, this.currentFile, this.sourceText, this.semantic));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ContractDefinition(node) {
|
|
66
|
+
if (node?.type !== 'ContractDefinition')
|
|
67
|
+
return;
|
|
68
|
+
this.findings.push(...this.runAst(node, this.currentFile, this.sourceText, this.semantic));
|
|
69
|
+
}
|
|
70
|
+
scanAst(ast, file, sourceText, ctxArg) {
|
|
71
|
+
return this.runAst(ast, file, sourceText, ctxArg?.semantic);
|
|
72
|
+
}
|
|
73
|
+
runAst(ast, file, sourceText, semantic) {
|
|
74
|
+
if (!ast || typeof ast !== 'object')
|
|
75
|
+
return [];
|
|
76
|
+
const findings = [];
|
|
77
|
+
const lineOffsets = buildLineOffsets(sourceText);
|
|
78
|
+
// SemanticModel (roadmap 3.3) lets this detector see inherited
|
|
79
|
+
// critical functions across contracts — solves H.3
|
|
80
|
+
// When undefined, the detector behaves exactly as before (per-file
|
|
81
|
+
// local walk only); the cross-MRO block below is purely additive.
|
|
82
|
+
walkContracts(ast, contractNode => {
|
|
83
|
+
const contractName = getName(contractNode) || '<anonymous>';
|
|
84
|
+
const ctx = {
|
|
85
|
+
stateVariables: collectStateVariables(contractNode),
|
|
86
|
+
modifierBodies: collectModifierBodies(contractNode),
|
|
87
|
+
};
|
|
88
|
+
// Track function names already iterated locally so the inherited
|
|
89
|
+
// walk below doesn't double-fire when Derived overrides Base.fn().
|
|
90
|
+
const localFnNamesLower = new Set();
|
|
91
|
+
for (const fn of getContractMembers(contractNode, 'FunctionDefinition')) {
|
|
92
|
+
const functionName = getName(fn);
|
|
93
|
+
if (!functionName)
|
|
94
|
+
continue;
|
|
95
|
+
localFnNamesLower.add(functionName.toLowerCase());
|
|
96
|
+
const lname = functionName.toLowerCase();
|
|
97
|
+
if (!CRITICAL_FUNCTION_NAMES.has(lname))
|
|
98
|
+
continue;
|
|
99
|
+
if (!isExternallyCallable(fn))
|
|
100
|
+
continue;
|
|
101
|
+
const body = getFunctionBody(fn);
|
|
102
|
+
if (!body)
|
|
103
|
+
continue;
|
|
104
|
+
const params = collectParameterNames(fn);
|
|
105
|
+
if (!containsStateMutationOrFundTransfer(body, ctx))
|
|
106
|
+
continue;
|
|
107
|
+
if (hasRecognizedModifierGuard(fn, ctx))
|
|
108
|
+
continue;
|
|
109
|
+
if (hasInlineGuardBeforeMutation(body, ctx, params))
|
|
110
|
+
continue;
|
|
111
|
+
if (lname === 'withdraw' && isUserPullPayment(body, ctx))
|
|
112
|
+
continue;
|
|
113
|
+
const loc = getLoc(fn, lineOffsets) || { line: 0, column: 0 };
|
|
114
|
+
findings.push({
|
|
115
|
+
file,
|
|
116
|
+
contract: contractName,
|
|
117
|
+
'function': functionName,
|
|
118
|
+
line: loc.line,
|
|
119
|
+
endLine: loc.line,
|
|
120
|
+
column: loc.column,
|
|
121
|
+
pattern: RULE_ID,
|
|
122
|
+
confidence: 'high',
|
|
123
|
+
ruleId: RULE_ID,
|
|
124
|
+
severity: 'high',
|
|
125
|
+
message: `Externally callable critical function '${functionName}' has no recognized access-control guard; ` +
|
|
126
|
+
`add onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or an explicit msg.sender owner/admin require check.`,
|
|
127
|
+
rationale: `Critical mutator '${functionName}' is reachable by any account and lacks a recognized modifier or ` +
|
|
128
|
+
`inline owner/admin/role guard, matching the missing-access-control exploit class (issue #500).`,
|
|
129
|
+
suggestedFix: `Restrict '${functionName}' to authorized callers using onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), ` +
|
|
130
|
+
`or an inline require(msg.sender == owner/admin) guard before any state mutation.`,
|
|
131
|
+
contractName,
|
|
132
|
+
functionName,
|
|
133
|
+
sourceLocation: { line: loc.line, column: loc.column },
|
|
134
|
+
findingId: '',
|
|
135
|
+
contractHash: '',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// === SemanticModel adoption (roadmap 3.3 / H.3 fix) ===
|
|
139
|
+
//
|
|
140
|
+
// After the local walk, also check inherited critical functions.
|
|
141
|
+
// `inheritedFunctions(myId)` returns the MRO-deduplicated list of
|
|
142
|
+
// functions visible on `contractNode`, with most-derived-wins
|
|
143
|
+
// semantics. We skip functions already iterated locally (so
|
|
144
|
+
// overrides don't double-fire) and run the SAME guard checks
|
|
145
|
+
// against the inherited function — but using the DECLARING
|
|
146
|
+
// contract's modifier / state-var context, so a modifier defined
|
|
147
|
+
// in Base can still be resolved for Base.setAdmin.
|
|
148
|
+
//
|
|
149
|
+
// Finding loc points at the CURRENT contract's definition line
|
|
150
|
+
// in the current file (the surface the user can call), not at
|
|
151
|
+
// Base.sol (which fires separately via its own local walk when
|
|
152
|
+
// Base.sol is also in the scan). The finding's `function` field
|
|
153
|
+
// carries the inherited name so the operator can locate it.
|
|
154
|
+
if (semantic) {
|
|
155
|
+
const myId = `${file}::${contractName}`;
|
|
156
|
+
const myInfo = semantic.contracts.get(myId);
|
|
157
|
+
if (myInfo && myInfo.bases.length > 0) {
|
|
158
|
+
for (const inheritedFn of semantic.inheritedFunctions(myId)) {
|
|
159
|
+
// Functions declared locally are handled above; skip.
|
|
160
|
+
if (inheritedFn.contractId === myId)
|
|
161
|
+
continue;
|
|
162
|
+
const inheritedName = inheritedFn.name;
|
|
163
|
+
if (!inheritedName)
|
|
164
|
+
continue;
|
|
165
|
+
const inheritedLower = inheritedName.toLowerCase();
|
|
166
|
+
if (!CRITICAL_FUNCTION_NAMES.has(inheritedLower))
|
|
167
|
+
continue;
|
|
168
|
+
// Local override (already iterated) -- skip even if local
|
|
169
|
+
// walk didn't emit (it had its own reason).
|
|
170
|
+
if (localFnNamesLower.has(inheritedLower))
|
|
171
|
+
continue;
|
|
172
|
+
const inheritedNode = inheritedFn.node;
|
|
173
|
+
if (!isExternallyCallable(inheritedNode))
|
|
174
|
+
continue;
|
|
175
|
+
const declarer = semantic.contracts.get(inheritedFn.contractId);
|
|
176
|
+
if (!declarer || !declarer.node)
|
|
177
|
+
continue;
|
|
178
|
+
// Use the declaring contract's state-vars + modifier-bodies
|
|
179
|
+
// so guard checks resolve against the function's actual scope.
|
|
180
|
+
const declarerCtx = {
|
|
181
|
+
stateVariables: collectStateVariables(declarer.node),
|
|
182
|
+
modifierBodies: collectModifierBodies(declarer.node),
|
|
183
|
+
};
|
|
184
|
+
const body = getFunctionBody(inheritedNode);
|
|
185
|
+
if (!body)
|
|
186
|
+
continue;
|
|
187
|
+
const params = collectParameterNames(inheritedNode);
|
|
188
|
+
if (!containsStateMutationOrFundTransfer(body, declarerCtx))
|
|
189
|
+
continue;
|
|
190
|
+
if (hasRecognizedModifierGuard(inheritedNode, declarerCtx))
|
|
191
|
+
continue;
|
|
192
|
+
if (hasInlineGuardBeforeMutation(body, declarerCtx, params))
|
|
193
|
+
continue;
|
|
194
|
+
if (inheritedLower === 'withdraw' && isUserPullPayment(body, declarerCtx))
|
|
195
|
+
continue;
|
|
196
|
+
// Loc: current contract's definition line in the current file.
|
|
197
|
+
// Falls back to line 1 col 0 if the contract AST lacks a loc
|
|
198
|
+
// (defensive — line 0 is banned per docs/findings-taxonomy).
|
|
199
|
+
const contractLoc = getLoc(contractNode, lineOffsets) || { line: 1, column: 0 };
|
|
200
|
+
findings.push({
|
|
201
|
+
file,
|
|
202
|
+
contract: contractName,
|
|
203
|
+
'function': inheritedName,
|
|
204
|
+
line: contractLoc.line,
|
|
205
|
+
endLine: contractLoc.line,
|
|
206
|
+
column: contractLoc.column,
|
|
207
|
+
pattern: RULE_ID,
|
|
208
|
+
confidence: 'high',
|
|
209
|
+
ruleId: RULE_ID,
|
|
210
|
+
severity: 'high',
|
|
211
|
+
message: `Externally callable critical function '${inheritedName}' inherited from ${declarer.name} ` +
|
|
212
|
+
`has no recognized access-control guard; add onlyOwner, onlyRole(DEFAULT_ADMIN_ROLE), or ` +
|
|
213
|
+
`an explicit msg.sender owner/admin require check on the inherited function or override it in ${contractName}.`,
|
|
214
|
+
rationale: `Critical mutator '${inheritedName}' is reachable through ${contractName}'s inheritance ` +
|
|
215
|
+
`from ${declarer.name} and lacks a recognized modifier or inline guard.`,
|
|
216
|
+
suggestedFix: `Override '${inheritedName}' in ${contractName} with a recognized access-control modifier, ` +
|
|
217
|
+
`or restrict access in ${declarer.name}.`,
|
|
218
|
+
contractName,
|
|
219
|
+
functionName: inheritedName,
|
|
220
|
+
sourceLocation: { line: contractLoc.line, column: contractLoc.column },
|
|
221
|
+
// Discriminator for computeFindingId: all inherited findings on
|
|
222
|
+
// a single derived contract share (file, line, ruleId) because
|
|
223
|
+
// they're anchored at the contract definition line. Without
|
|
224
|
+
// this, a derived contract inheriting two unguarded critical
|
|
225
|
+
// functions (e.g. `setOwner` + `pause`) would emit two findings
|
|
226
|
+
// with identical findingId and the downstream dedup engine
|
|
227
|
+
// would silently drop one. See the round-2 panel review
|
|
228
|
+
// (`dup-find-id` / `findingid-col` / `findingid-coll`) on PR
|
|
229
|
+
// #1999 — pinned by the inherited-multi-critical regression
|
|
230
|
+
// test added in the same PR.
|
|
231
|
+
instance_key: `${contractName}::${inheritedName}`,
|
|
232
|
+
findingId: '',
|
|
233
|
+
contractHash: '',
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return findings;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.MissingAccessControlDetector = MissingAccessControlDetector;
|
|
243
|
+
function hasRecognizedModifierGuard(fn, ctx) {
|
|
244
|
+
for (const mod of fn.modifiers || []) {
|
|
245
|
+
const modName = getModifierInvocationName(mod);
|
|
246
|
+
if (!modName)
|
|
247
|
+
continue;
|
|
248
|
+
if ((0, ast_1.isAccessControlModifierName)(modName))
|
|
249
|
+
return true;
|
|
250
|
+
const body = ctx.modifierBodies.get(modName);
|
|
251
|
+
if (!body)
|
|
252
|
+
continue;
|
|
253
|
+
if (containsRecognizedAuthCheck(body, ctx, new Set()))
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
function hasInlineGuardBeforeMutation(body, ctx, params) {
|
|
259
|
+
const statements = getStatementList(body);
|
|
260
|
+
for (const stmt of statements) {
|
|
261
|
+
if (isRecognizedGuardStatement(stmt, ctx, params))
|
|
262
|
+
return true;
|
|
263
|
+
if (isMeaningfulAction(stmt))
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
function isRecognizedGuardStatement(stmt, ctx, params) {
|
|
269
|
+
if (!stmt)
|
|
270
|
+
return false;
|
|
271
|
+
const expression = isNode(stmt, 'ExpressionStatement') ? stmt.expression : null;
|
|
272
|
+
if (!expression)
|
|
273
|
+
return false;
|
|
274
|
+
return isRecognizedAuthCheck(expression, ctx, params);
|
|
275
|
+
}
|
|
276
|
+
function isMeaningfulAction(stmt) {
|
|
277
|
+
if (!stmt)
|
|
278
|
+
return false;
|
|
279
|
+
if (isNode(stmt, 'ExpressionStatement')) {
|
|
280
|
+
const expression = stmt.expression;
|
|
281
|
+
if (!expression)
|
|
282
|
+
return false;
|
|
283
|
+
if (isAssignmentExpression(expression))
|
|
284
|
+
return true;
|
|
285
|
+
if (isUnaryMutation(expression))
|
|
286
|
+
return true;
|
|
287
|
+
if (isNode(expression, 'FunctionCall')) {
|
|
288
|
+
const callee = (getCallExpressionName(expression) || '').toLowerCase();
|
|
289
|
+
if (callee === 'require' || callee === 'assert')
|
|
290
|
+
return false;
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (isNode(stmt, 'IfStatement') ||
|
|
296
|
+
isNode(stmt, 'ForStatement') ||
|
|
297
|
+
isNode(stmt, 'WhileStatement') ||
|
|
298
|
+
isNode(stmt, 'DoWhileStatement') ||
|
|
299
|
+
isNode(stmt, 'Return') ||
|
|
300
|
+
isNode(stmt, 'ReturnStatement') ||
|
|
301
|
+
isNode(stmt, 'EmitStatement')) {
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
if (isNode(stmt, 'VariableDeclarationStatement')) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
function containsRecognizedAuthCheck(node, ctx, params) {
|
|
310
|
+
if (!node || typeof node !== 'object')
|
|
311
|
+
return false;
|
|
312
|
+
if (isRecognizedAuthCheck(node, ctx, params))
|
|
313
|
+
return true;
|
|
314
|
+
for (const child of childrenOf(node)) {
|
|
315
|
+
if (containsRecognizedAuthCheck(child, ctx, params))
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
function isRecognizedAuthCheck(expr, ctx, params) {
|
|
321
|
+
if (!expr || !isNode(expr, 'FunctionCall'))
|
|
322
|
+
return false;
|
|
323
|
+
const callee = (getCallExpressionName(expr) || '').toLowerCase();
|
|
324
|
+
const args = getCallArguments(expr);
|
|
325
|
+
if (callee === 'require' || callee === 'assert') {
|
|
326
|
+
return args.some(arg => isPrivilegedSenderEquality(arg, ctx, params) || isHasRoleSenderCall(arg));
|
|
327
|
+
}
|
|
328
|
+
if (callee === '_checkrole' || callee === 'checkrole' || callee.endsWith('._checkrole')) {
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
function isPrivilegedSenderEquality(expr, ctx, params) {
|
|
334
|
+
if (!expr || !isNode(expr, 'BinaryOperation'))
|
|
335
|
+
return false;
|
|
336
|
+
if (getOperator(expr) !== '==' && getOperator(expr) !== '===')
|
|
337
|
+
return false;
|
|
338
|
+
const left = expr.left ?? expr.leftExpression;
|
|
339
|
+
const right = expr.right ?? expr.rightExpression;
|
|
340
|
+
if (isMsgSender(left) && !isMsgSender(right)) {
|
|
341
|
+
return isPrivilegedAuthorityReference(right, ctx, params);
|
|
342
|
+
}
|
|
343
|
+
if (isMsgSender(right) && !isMsgSender(left)) {
|
|
344
|
+
return isPrivilegedAuthorityReference(left, ctx, params);
|
|
345
|
+
}
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
function isPrivilegedAuthorityReference(expr, ctx, params) {
|
|
349
|
+
const root = getReferenceRoot(expr);
|
|
350
|
+
if (!root)
|
|
351
|
+
return false;
|
|
352
|
+
if (params.has(root))
|
|
353
|
+
return false;
|
|
354
|
+
if (!ctx.stateVariables.has(root))
|
|
355
|
+
return false;
|
|
356
|
+
return PRIVILEGED_STATE_PATTERN.test(root);
|
|
357
|
+
}
|
|
358
|
+
function isHasRoleSenderCall(expr) {
|
|
359
|
+
if (!expr || !isNode(expr, 'FunctionCall'))
|
|
360
|
+
return false;
|
|
361
|
+
const callee = (getCallExpressionName(expr) || '').toLowerCase();
|
|
362
|
+
if (callee !== 'hasrole' && !callee.endsWith('.hasrole'))
|
|
363
|
+
return false;
|
|
364
|
+
return getCallArguments(expr).some(isMsgSender);
|
|
365
|
+
}
|
|
366
|
+
function containsStateMutationOrFundTransfer(body, ctx) {
|
|
367
|
+
let found = false;
|
|
368
|
+
walk(body, node => {
|
|
369
|
+
if (found)
|
|
370
|
+
return;
|
|
371
|
+
if (isStateMutation(node, ctx)) {
|
|
372
|
+
found = true;
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (isNode(node, 'FunctionCall')) {
|
|
376
|
+
if (getPayoutRecipient(node) !== null) {
|
|
377
|
+
found = true;
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (isCriticalInternalMutatorCall(node)) {
|
|
381
|
+
found = true;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
return found;
|
|
386
|
+
}
|
|
387
|
+
function isCriticalInternalMutatorCall(call) {
|
|
388
|
+
const callee = call?.expression;
|
|
389
|
+
if (!callee || !isNode(callee, 'Identifier'))
|
|
390
|
+
return false;
|
|
391
|
+
const name = getName(callee);
|
|
392
|
+
if (!name)
|
|
393
|
+
return false;
|
|
394
|
+
return CRITICAL_INTERNAL_MUTATOR_NAMES.has(name.toLowerCase());
|
|
395
|
+
}
|
|
396
|
+
function isStateMutation(node, ctx) {
|
|
397
|
+
if (isAssignmentExpression(node)) {
|
|
398
|
+
const left = node.left ?? node.leftHandSide;
|
|
399
|
+
const root = getReferenceRoot(left);
|
|
400
|
+
return !!root && ctx.stateVariables.has(root);
|
|
401
|
+
}
|
|
402
|
+
if (isUnaryMutation(node)) {
|
|
403
|
+
const target = node.subExpression ?? node.vSubExpression;
|
|
404
|
+
const root = getReferenceRoot(target);
|
|
405
|
+
return !!root && ctx.stateVariables.has(root);
|
|
406
|
+
}
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
function isUserPullPayment(body, ctx) {
|
|
410
|
+
let sawCallerIndexedStateWrite = false;
|
|
411
|
+
let sawCallerDirectedPayout = false;
|
|
412
|
+
let foundNonCallerIndexedStateMutation = false;
|
|
413
|
+
let foundForeignTransfer = false;
|
|
414
|
+
walk(body, node => {
|
|
415
|
+
if (isStateMutation(node, ctx)) {
|
|
416
|
+
const left = node.left ?? node.leftHandSide;
|
|
417
|
+
const target = left ?? node.subExpression ?? node.vSubExpression;
|
|
418
|
+
const root = getReferenceRoot(target);
|
|
419
|
+
if (root && ctx.stateVariables.has(root) && isCallerIndexedStateReference(target)) {
|
|
420
|
+
sawCallerIndexedStateWrite = true;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
foundNonCallerIndexedStateMutation = true;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (isNode(node, 'FunctionCall')) {
|
|
427
|
+
const recipient = getPayoutRecipient(node);
|
|
428
|
+
if (recipient !== null) {
|
|
429
|
+
if (recipient === 'caller')
|
|
430
|
+
sawCallerDirectedPayout = true;
|
|
431
|
+
else
|
|
432
|
+
foundForeignTransfer = true;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
return (sawCallerIndexedStateWrite &&
|
|
437
|
+
sawCallerDirectedPayout &&
|
|
438
|
+
!foundNonCallerIndexedStateMutation &&
|
|
439
|
+
!foundForeignTransfer);
|
|
440
|
+
}
|
|
441
|
+
function getValueTransferRecipient(call) {
|
|
442
|
+
const recipient = getNativeValueTransferRecipient(call);
|
|
443
|
+
if (recipient === 'caller')
|
|
444
|
+
return 'msg.sender';
|
|
445
|
+
if (recipient === 'other')
|
|
446
|
+
return 'other';
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
function getPayoutRecipient(call) {
|
|
450
|
+
const valueRecipient = getNativeValueTransferRecipient(call);
|
|
451
|
+
if (valueRecipient !== null)
|
|
452
|
+
return valueRecipient;
|
|
453
|
+
const callee = call.expression;
|
|
454
|
+
if (!callee || !isNode(callee, 'MemberAccess'))
|
|
455
|
+
return null;
|
|
456
|
+
if (String(callee.memberName || '').toLowerCase() !== 'transfer')
|
|
457
|
+
return null;
|
|
458
|
+
const args = getCallArguments(call);
|
|
459
|
+
if (args.length < 2)
|
|
460
|
+
return null;
|
|
461
|
+
return isCallerExpression(args[0]) ? 'caller' : 'other';
|
|
462
|
+
}
|
|
463
|
+
function getNativeValueTransferRecipient(call) {
|
|
464
|
+
const callee = call.expression;
|
|
465
|
+
if (!callee)
|
|
466
|
+
return null;
|
|
467
|
+
if (isNode(callee, 'MemberAccess')) {
|
|
468
|
+
const member = String(callee.memberName || '').toLowerCase();
|
|
469
|
+
if ((member === 'transfer' || member === 'send') && getCallArguments(call).length === 1) {
|
|
470
|
+
return resolveRecipient(callee.expression);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (isNode(callee, 'NameValueExpression')) {
|
|
474
|
+
const inner = callee.expression;
|
|
475
|
+
if (isNode(inner, 'MemberAccess') &&
|
|
476
|
+
String(inner.memberName || '').toLowerCase() === 'call' &&
|
|
477
|
+
nameValueExpressionHasValue(callee)) {
|
|
478
|
+
return resolveRecipient(inner.expression);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if (isNode(callee, 'FunctionCallOptions')) {
|
|
482
|
+
const inner = callee.expression;
|
|
483
|
+
if (isNode(inner, 'MemberAccess') &&
|
|
484
|
+
String(inner.memberName || '').toLowerCase() === 'call' &&
|
|
485
|
+
nameValueExpressionHasValue(callee)) {
|
|
486
|
+
return resolveRecipient(inner.expression);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
function resolveRecipient(expr) {
|
|
492
|
+
if (isCallerExpression(expr))
|
|
493
|
+
return 'caller';
|
|
494
|
+
if (isNode(expr, 'FunctionCall')) {
|
|
495
|
+
const callee = expr.expression;
|
|
496
|
+
if (isNode(callee, 'ElementaryTypeName') ||
|
|
497
|
+
isNode(callee, 'ElementaryTypeNameExpression') ||
|
|
498
|
+
(isNode(callee, 'Identifier') && (getName(callee) === 'address' || getName(callee) === 'payable'))) {
|
|
499
|
+
const args = getCallArguments(expr);
|
|
500
|
+
if (args.length === 1 && resolveRecipient(args[0]) === 'caller')
|
|
501
|
+
return 'caller';
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return 'other';
|
|
505
|
+
}
|
|
506
|
+
function isCallerIndexedStateReference(expr) {
|
|
507
|
+
if (!expr)
|
|
508
|
+
return false;
|
|
509
|
+
if (isNode(expr, 'IndexAccess')) {
|
|
510
|
+
const index = expr.index ?? expr.indexExpression;
|
|
511
|
+
if (isCallerExpression(index))
|
|
512
|
+
return true;
|
|
513
|
+
return isCallerIndexedStateReference(expr.base ?? expr.baseExpression);
|
|
514
|
+
}
|
|
515
|
+
if (isNode(expr, 'MemberAccess')) {
|
|
516
|
+
return isCallerIndexedStateReference(expr.expression);
|
|
517
|
+
}
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
function nameValueExpressionHasValue(expr) {
|
|
521
|
+
const names = Array.isArray(expr.names)
|
|
522
|
+
? expr.names
|
|
523
|
+
: Array.isArray(expr.options?.names)
|
|
524
|
+
? expr.options.names
|
|
525
|
+
: Array.isArray(expr.arguments?.names)
|
|
526
|
+
? expr.arguments.names
|
|
527
|
+
: [];
|
|
528
|
+
if (names.some(name => String(name).toLowerCase() === 'value'))
|
|
529
|
+
return true;
|
|
530
|
+
const optionEntries = Array.isArray(expr.options)
|
|
531
|
+
? expr.options
|
|
532
|
+
: Array.isArray(expr.arguments)
|
|
533
|
+
? expr.arguments
|
|
534
|
+
: [];
|
|
535
|
+
if (optionEntries.some((option) => String(option?.name || option?.keyName || '').toLowerCase() === 'value')) {
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
function isAssignmentExpression(expr) {
|
|
541
|
+
if (!expr)
|
|
542
|
+
return false;
|
|
543
|
+
if (isNode(expr, 'Assignment'))
|
|
544
|
+
return true;
|
|
545
|
+
if (isNode(expr, 'BinaryOperation')) {
|
|
546
|
+
const op = getOperator(expr);
|
|
547
|
+
return ['=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=', '>>=', '>>>='].includes(op);
|
|
548
|
+
}
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
function isUnaryMutation(expr) {
|
|
552
|
+
if (!expr || !isNode(expr, 'UnaryOperation'))
|
|
553
|
+
return false;
|
|
554
|
+
const op = getOperator(expr);
|
|
555
|
+
return op === '++' || op === '--' || op === 'delete';
|
|
556
|
+
}
|
|
557
|
+
function isMsgSender(expr) {
|
|
558
|
+
if (!expr || !isNode(expr, 'MemberAccess'))
|
|
559
|
+
return false;
|
|
560
|
+
if ((expr.memberName || '') !== 'sender')
|
|
561
|
+
return false;
|
|
562
|
+
const inner = expr.expression;
|
|
563
|
+
return inner && isNode(inner, 'Identifier') && getName(inner) === 'msg';
|
|
564
|
+
}
|
|
565
|
+
function isCallerExpression(expr) {
|
|
566
|
+
if (isMsgSender(expr))
|
|
567
|
+
return true;
|
|
568
|
+
if (!expr || !isNode(expr, 'FunctionCall'))
|
|
569
|
+
return false;
|
|
570
|
+
const callee = expr.expression;
|
|
571
|
+
if (!callee || !isNode(callee, 'Identifier'))
|
|
572
|
+
return false;
|
|
573
|
+
return getName(callee) === '_msgSender' && getCallArguments(expr).length === 0;
|
|
574
|
+
}
|
|
575
|
+
function getReferenceRoot(expr) {
|
|
576
|
+
if (!expr)
|
|
577
|
+
return '';
|
|
578
|
+
if (isNode(expr, 'Identifier'))
|
|
579
|
+
return getName(expr);
|
|
580
|
+
if (isNode(expr, 'IndexAccess')) {
|
|
581
|
+
return getReferenceRoot(expr.base ?? expr.baseExpression);
|
|
582
|
+
}
|
|
583
|
+
if (isNode(expr, 'MemberAccess')) {
|
|
584
|
+
return getReferenceRoot(expr.expression);
|
|
585
|
+
}
|
|
586
|
+
return '';
|
|
587
|
+
}
|
|
588
|
+
function getCallExpressionName(call) {
|
|
589
|
+
if (!call)
|
|
590
|
+
return '';
|
|
591
|
+
const callee = call.expression;
|
|
592
|
+
if (!callee)
|
|
593
|
+
return '';
|
|
594
|
+
if (isNode(callee, 'Identifier'))
|
|
595
|
+
return getName(callee);
|
|
596
|
+
if (isNode(callee, 'MemberAccess')) {
|
|
597
|
+
const inner = callee.expression;
|
|
598
|
+
const innerName = inner ? getCallExpressionNameFromExpression(inner) : '';
|
|
599
|
+
const memberName = callee.memberName || '';
|
|
600
|
+
return innerName ? `${innerName}.${memberName}` : memberName;
|
|
601
|
+
}
|
|
602
|
+
if (isNode(callee, 'NameValueExpression')) {
|
|
603
|
+
return getCallExpressionName({ expression: callee.expression });
|
|
604
|
+
}
|
|
605
|
+
return '';
|
|
606
|
+
}
|
|
607
|
+
function getCallExpressionNameFromExpression(expr) {
|
|
608
|
+
if (!expr)
|
|
609
|
+
return '';
|
|
610
|
+
if (isNode(expr, 'Identifier'))
|
|
611
|
+
return getName(expr);
|
|
612
|
+
if (isNode(expr, 'MemberAccess')) {
|
|
613
|
+
const inner = expr.expression;
|
|
614
|
+
const innerName = inner ? getCallExpressionNameFromExpression(inner) : '';
|
|
615
|
+
const memberName = expr.memberName || '';
|
|
616
|
+
return innerName ? `${innerName}.${memberName}` : memberName;
|
|
617
|
+
}
|
|
618
|
+
return '';
|
|
619
|
+
}
|
|
620
|
+
function collectStateVariables(contractNode) {
|
|
621
|
+
const stateVars = new Set();
|
|
622
|
+
for (const member of getContractMembers(contractNode, 'StateVariableDeclaration')) {
|
|
623
|
+
for (const variable of member.variables || []) {
|
|
624
|
+
if (variable?.name)
|
|
625
|
+
stateVars.add(variable.name);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
for (const member of getContractMembers(contractNode, 'VariableDeclaration')) {
|
|
629
|
+
if (member?.stateVariable && member.name)
|
|
630
|
+
stateVars.add(member.name);
|
|
631
|
+
}
|
|
632
|
+
return stateVars;
|
|
633
|
+
}
|
|
634
|
+
function collectModifierBodies(contractNode) {
|
|
635
|
+
const map = new Map();
|
|
636
|
+
for (const member of getContractMembers(contractNode, 'ModifierDefinition')) {
|
|
637
|
+
const modName = getName(member);
|
|
638
|
+
if (modName && member.body)
|
|
639
|
+
map.set(modName, member.body);
|
|
640
|
+
}
|
|
641
|
+
return map;
|
|
642
|
+
}
|
|
643
|
+
function collectParameterNames(fn) {
|
|
644
|
+
const params = new Set();
|
|
645
|
+
const list = fn.parameters?.parameters || fn.parameters || [];
|
|
646
|
+
for (const param of list) {
|
|
647
|
+
if (param?.name)
|
|
648
|
+
params.add(param.name);
|
|
649
|
+
}
|
|
650
|
+
return params;
|
|
651
|
+
}
|
|
652
|
+
function getContractMembers(contractNode, kind) {
|
|
653
|
+
const members = [];
|
|
654
|
+
const lists = [contractNode.subNodes, contractNode.nodes];
|
|
655
|
+
for (const list of lists) {
|
|
656
|
+
if (!Array.isArray(list))
|
|
657
|
+
continue;
|
|
658
|
+
for (const child of list) {
|
|
659
|
+
if (child && (child.type === kind || child.nodeType === kind)) {
|
|
660
|
+
members.push(child);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return members;
|
|
665
|
+
}
|
|
666
|
+
function getFunctionBody(fn) {
|
|
667
|
+
return fn?.body || null;
|
|
668
|
+
}
|
|
669
|
+
function getStatementList(body) {
|
|
670
|
+
if (!body)
|
|
671
|
+
return [];
|
|
672
|
+
if (Array.isArray(body.statements))
|
|
673
|
+
return body.statements;
|
|
674
|
+
return [];
|
|
675
|
+
}
|
|
676
|
+
function isExternallyCallable(fn) {
|
|
677
|
+
const kind = String(fn.kind || (fn.isConstructor ? 'constructor' : '') || 'function').toLowerCase();
|
|
678
|
+
if (kind === 'constructor')
|
|
679
|
+
return false;
|
|
680
|
+
const visibility = String(fn.visibility || '').toLowerCase();
|
|
681
|
+
return visibility === 'public' || visibility === 'external';
|
|
682
|
+
}
|
|
683
|
+
function getModifierInvocationName(mod) {
|
|
684
|
+
if (!mod)
|
|
685
|
+
return '';
|
|
686
|
+
if (mod.modifierName) {
|
|
687
|
+
if (typeof mod.modifierName === 'string')
|
|
688
|
+
return mod.modifierName;
|
|
689
|
+
if (mod.modifierName.name)
|
|
690
|
+
return String(mod.modifierName.name);
|
|
691
|
+
}
|
|
692
|
+
if (mod.name) {
|
|
693
|
+
if (typeof mod.name === 'string')
|
|
694
|
+
return mod.name;
|
|
695
|
+
if (mod.name.name)
|
|
696
|
+
return String(mod.name.name);
|
|
697
|
+
if (mod.name.namePath)
|
|
698
|
+
return String(mod.name.namePath);
|
|
699
|
+
}
|
|
700
|
+
return '';
|
|
701
|
+
}
|
|
702
|
+
function walkContracts(node, visit) {
|
|
703
|
+
if (!node || typeof node !== 'object')
|
|
704
|
+
return;
|
|
705
|
+
if (isNode(node, 'ContractDefinition'))
|
|
706
|
+
visit(node);
|
|
707
|
+
for (const child of childrenOf(node))
|
|
708
|
+
walkContracts(child, visit);
|
|
709
|
+
}
|
|
710
|
+
function walk(node, visitor) {
|
|
711
|
+
if (!node || typeof node !== 'object')
|
|
712
|
+
return;
|
|
713
|
+
visitor(node);
|
|
714
|
+
for (const child of childrenOf(node))
|
|
715
|
+
walk(child, visitor);
|
|
716
|
+
}
|
|
717
|
+
function childrenOf(node) {
|
|
718
|
+
if (!node || typeof node !== 'object')
|
|
719
|
+
return [];
|
|
720
|
+
const children = [];
|
|
721
|
+
for (const [key, value] of Object.entries(node)) {
|
|
722
|
+
if (key === 'loc' || key === 'src' || key === 'range' || key === 'typeDescriptions')
|
|
723
|
+
continue;
|
|
724
|
+
if (Array.isArray(value)) {
|
|
725
|
+
for (const item of value) {
|
|
726
|
+
if (item && typeof item === 'object')
|
|
727
|
+
children.push(item);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
else if (value && typeof value === 'object') {
|
|
731
|
+
children.push(value);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
return children;
|
|
735
|
+
}
|
|
736
|
+
function isNode(node, kind) {
|
|
737
|
+
return node?.type === kind || node?.nodeType === kind;
|
|
738
|
+
}
|
|
739
|
+
function getName(node) {
|
|
740
|
+
if (!node)
|
|
741
|
+
return '';
|
|
742
|
+
if (typeof node.name === 'string')
|
|
743
|
+
return node.name;
|
|
744
|
+
return '';
|
|
745
|
+
}
|
|
746
|
+
function getOperator(node) {
|
|
747
|
+
return String(node?.operator || '');
|
|
748
|
+
}
|
|
749
|
+
function getCallArguments(call) {
|
|
750
|
+
return Array.isArray(call?.arguments) ? call.arguments : [];
|
|
751
|
+
}
|
|
752
|
+
function buildLineOffsets(sourceText) {
|
|
753
|
+
if (sourceText === undefined)
|
|
754
|
+
return undefined;
|
|
755
|
+
const lineOffsets = [0];
|
|
756
|
+
let byteOffset = 0;
|
|
757
|
+
for (const char of sourceText) {
|
|
758
|
+
byteOffset += Buffer.byteLength(char, 'utf8');
|
|
759
|
+
if (char === '\n')
|
|
760
|
+
lineOffsets.push(byteOffset);
|
|
761
|
+
}
|
|
762
|
+
return lineOffsets;
|
|
763
|
+
}
|
|
764
|
+
function getLoc(node, lineOffsets) {
|
|
765
|
+
if (node?.loc?.start)
|
|
766
|
+
return { line: node.loc.start.line, column: node.loc.start.column };
|
|
767
|
+
if (!node?.src || !lineOffsets)
|
|
768
|
+
return undefined;
|
|
769
|
+
const offset = Number(String(node.src).split(':')[0]);
|
|
770
|
+
if (!Number.isFinite(offset) || offset < 0)
|
|
771
|
+
return undefined;
|
|
772
|
+
let lineIndex = 0;
|
|
773
|
+
for (let i = 0; i < lineOffsets.length; i++) {
|
|
774
|
+
if (lineOffsets[i] <= offset)
|
|
775
|
+
lineIndex = i;
|
|
776
|
+
else
|
|
777
|
+
break;
|
|
778
|
+
}
|
|
779
|
+
return { line: lineIndex + 1, column: offset - lineOffsets[lineIndex] };
|
|
780
|
+
}
|
|
781
|
+
//# sourceMappingURL=missing-access-control.js.map
|