@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,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared structural predicates for access-control reasoning.
|
|
3
|
+
*
|
|
4
|
+
* Several detectors hand-roll the same AST predicates: "is this
|
|
5
|
+
* expression `msg.sender`?", "does this require argument express an
|
|
6
|
+
* access-control check?", "does this function carry a recognised
|
|
7
|
+
* `onlyOwner`-style modifier?". The implementations have drifted —
|
|
8
|
+
* the audit found 21+ files with their own copy of the modifier set
|
|
9
|
+
* and slightly-different regex name predicates — but the *shape* of
|
|
10
|
+
* each predicate is the same. This module exists so detectors can
|
|
11
|
+
* import one canonical AST walker and supply only the policy bits
|
|
12
|
+
* (which identifier names count as "privileged") that are actually
|
|
13
|
+
* detector-specific.
|
|
14
|
+
*
|
|
15
|
+
* Design notes for callers:
|
|
16
|
+
*
|
|
17
|
+
* - `isPrivilegedName` is intentionally a parameter to the structural
|
|
18
|
+
* walkers below, not a fixed predicate on this module. Different
|
|
19
|
+
* detectors include different keywords (`fee`, `treasury`,
|
|
20
|
+
* `paused`, `auth`, `manager`, ...) and unifying them here would
|
|
21
|
+
* change findings in subtle ways. Keep the policy local.
|
|
22
|
+
* - The structural shape of `requireExpressesAccessControl` mirrors
|
|
23
|
+
* the predicate `arbitrary-call-error` shipped in PR #1813 with
|
|
24
|
+
* one explicit parameterisation: the name predicate. New detectors
|
|
25
|
+
* should prefer this helper over re-implementing the recursion.
|
|
26
|
+
* - `hasRecognisedAccessControlModifier` consults the canonical
|
|
27
|
+
* `ACCESS_CONTROL_MODIFIERS` set from `_common/ast.ts` so we have
|
|
28
|
+
* one source of truth for the modifier vocabulary.
|
|
29
|
+
*/
|
|
30
|
+
import { ACCESS_CONTROL_MODIFIERS, isAccessControlModifierName } from './ast';
|
|
31
|
+
export { ACCESS_CONTROL_MODIFIERS, isAccessControlModifierName };
|
|
32
|
+
/**
|
|
33
|
+
* Predicate used by the structural walkers to decide whether an
|
|
34
|
+
* identifier name (Solidity-level, not file-level) refers to a
|
|
35
|
+
* privileged storage slot or function. Detectors typically supply a
|
|
36
|
+
* regex match; the type is broader so callers can use sets, exact
|
|
37
|
+
* matches, or token-based checks.
|
|
38
|
+
*/
|
|
39
|
+
export type PrivilegedNamePredicate = (name: string) => boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Canonical default keyword set for privileged-identifier matching.
|
|
42
|
+
* Mirrors the legacy `AccessControlDetector` regex
|
|
43
|
+
* (`/owner|admin|role|paused|pause|guardian|timelock|governor|fee|treasury|operator/`)
|
|
44
|
+
* so detectors that want "the typical policy" don't need to spell it
|
|
45
|
+
* out. Detectors with a different vocabulary (e.g. `cartel-custom-approval-logic`
|
|
46
|
+
* adds `manager|authority|authorized`) pass their own list via the
|
|
47
|
+
* `keywords` option.
|
|
48
|
+
*
|
|
49
|
+
* Word-boundary semantics (G.5): the `governorRequiredFee` over-match
|
|
50
|
+
* called out in the architectural review is fixed under
|
|
51
|
+
* `isPrivilegedIdentifier(name, { mode: 'word-boundary' })`. The
|
|
52
|
+
* default mode is still `'substring'` for behaviour preservation; see
|
|
53
|
+
* `isPrivilegedIdentifier` below and ADR 0005 for the rollout plan.
|
|
54
|
+
*/
|
|
55
|
+
export declare const DEFAULT_PRIVILEGED_KEYWORDS: readonly string[];
|
|
56
|
+
/**
|
|
57
|
+
* Available matching algorithms for `isPrivilegedIdentifier`. See
|
|
58
|
+
* `docs/adr/0005-word-boundary-privileged-identifier.md` for the
|
|
59
|
+
* tradeoffs and rollout plan.
|
|
60
|
+
*/
|
|
61
|
+
export type PrivilegedIdentifierMode = 'substring' | 'word-boundary';
|
|
62
|
+
export interface PrivilegedIdentifierOptions {
|
|
63
|
+
/**
|
|
64
|
+
* Custom keyword vocabulary. When omitted the default canonical set
|
|
65
|
+
* (`DEFAULT_PRIVILEGED_KEYWORDS`) is used.
|
|
66
|
+
*/
|
|
67
|
+
keywords?: readonly string[];
|
|
68
|
+
/**
|
|
69
|
+
* Matching algorithm. Defaults to `'substring'` for behaviour
|
|
70
|
+
* preservation across the ~12 existing callers. The `'word-boundary'`
|
|
71
|
+
* mode tokenises the identifier on snake_case / camelCase / PascalCase
|
|
72
|
+
* boundaries and matches if and only if (a) the FIRST token equals a
|
|
73
|
+
* keyword and (b) no OTHER token equals a keyword. See ADR 0005.
|
|
74
|
+
*/
|
|
75
|
+
mode?: PrivilegedIdentifierMode;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Tokenise an identifier on snake_case and camelCase / PascalCase
|
|
79
|
+
* boundaries. Returns lowercased non-empty tokens.
|
|
80
|
+
*
|
|
81
|
+
* `governor` → ['governor']
|
|
82
|
+
* `governorAddress` → ['governor', 'address']
|
|
83
|
+
* `governor_required_fee` → ['governor', 'required', 'fee']
|
|
84
|
+
* `OWNER` → ['owner']
|
|
85
|
+
* `_admin` → ['admin']
|
|
86
|
+
* `XYZOwner` → ['xyz', 'owner']
|
|
87
|
+
*
|
|
88
|
+
* Exported for direct testing and for detectors that need their own
|
|
89
|
+
* token-aware predicate variant.
|
|
90
|
+
*/
|
|
91
|
+
export declare function splitIdentifierTokens(name: string): string[];
|
|
92
|
+
/**
|
|
93
|
+
* Privileged-identifier predicate — does `name` look like the
|
|
94
|
+
* Solidity-level identifier of a privileged storage slot, function,
|
|
95
|
+
* or modifier?
|
|
96
|
+
*
|
|
97
|
+
* Centralises the substring regex that detectors used to inline
|
|
98
|
+
* (G.5 / J.4 / roadmap 1.2).
|
|
99
|
+
*
|
|
100
|
+
* Two modes are supported (see ADR 0005):
|
|
101
|
+
*
|
|
102
|
+
* - `'substring'` (default) — case-insensitive
|
|
103
|
+
* `/keyword1|keyword2|.../i.test(lower(name))`. Faithfully preserves
|
|
104
|
+
* the legacy inline-regex behaviour. Over-matches identifiers like
|
|
105
|
+
* `governorRequiredFee` that happen to embed multiple keywords.
|
|
106
|
+
*
|
|
107
|
+
* - `'word-boundary'` — tokenise on snake/camelCase boundaries
|
|
108
|
+
* (`splitIdentifierTokens`) and match if the FIRST token is a keyword
|
|
109
|
+
* AND no other token is a keyword. So `governor`, `governorAddress`,
|
|
110
|
+
* `owner_address` all match; `governorRequiredFee`, `paramOwner`,
|
|
111
|
+
* `controllerFee`, `configRole` do not. This is the eventual
|
|
112
|
+
* semantics for G.5; today it is opt-in per call site so each
|
|
113
|
+
* detector can validate the recall impact independently.
|
|
114
|
+
*/
|
|
115
|
+
export declare function isPrivilegedIdentifier(name: string, options?: PrivilegedIdentifierOptions): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* `msg.sender` exactly: a `MemberAccess` whose `memberName` is
|
|
118
|
+
* `'sender'` and whose `expression` is the `Identifier` `msg`.
|
|
119
|
+
* Accepts both parser and solc AST shapes.
|
|
120
|
+
*/
|
|
121
|
+
export declare function isMsgSenderExpr(expr: any): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Caller-identity expression: any AST shape that resolves to the
|
|
124
|
+
* current transaction sender. Three shapes are recognised:
|
|
125
|
+
*
|
|
126
|
+
* `msg.sender` — the canonical built-in
|
|
127
|
+
* `_msgSender()` — the OpenZeppelin `Context` helper
|
|
128
|
+
* (zero arguments only)
|
|
129
|
+
* `this._msgSender()` — the same helper invoked as a member
|
|
130
|
+
* call on the contract itself
|
|
131
|
+
*
|
|
132
|
+
* Recognition is limited to zero-argument calls so that lookalike
|
|
133
|
+
* helpers that take arguments (`_msgSender(metaTxBytes)`, etc.) are
|
|
134
|
+
* not silently treated as caller-identity.
|
|
135
|
+
*/
|
|
136
|
+
export declare function isCallerIdentityExpression(expr: any): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Recognise `hasRole(...)`, `checkRole(...)`, or `_checkRole(...)`
|
|
139
|
+
* style calls — the standard OpenZeppelin AccessControl entry points
|
|
140
|
+
* that callers use to delegate the access check to a role registry.
|
|
141
|
+
*
|
|
142
|
+
* `getCalleeName` is supplied by the caller so detectors that
|
|
143
|
+
* already have a richer name resolver (chained MemberAccess, etc.)
|
|
144
|
+
* can pass it in. If you don't have one, `getCalleeNameDefault`
|
|
145
|
+
* below is a reasonable starting point.
|
|
146
|
+
*/
|
|
147
|
+
export declare function isHasRoleStyleCall(expr: any, getCalleeName: (call: any) => string): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Default callee-name resolver suitable for most detectors. Walks
|
|
150
|
+
* `expr.expression` through `Identifier` and `MemberAccess` nodes
|
|
151
|
+
* and returns the dotted form (`base.member.tail`).
|
|
152
|
+
*/
|
|
153
|
+
export declare function getCalleeNameDefault(call: any): string;
|
|
154
|
+
/**
|
|
155
|
+
* Walk an expression looking for ANY identifier, member name, or
|
|
156
|
+
* mapping base whose name matches `isPrivilegedName`. Returns true
|
|
157
|
+
* on first hit. Recurses through `Identifier`, `MemberAccess`,
|
|
158
|
+
* `IndexAccess`, and `FunctionCall` chains — the same shape every
|
|
159
|
+
* existing detector reimplements.
|
|
160
|
+
*
|
|
161
|
+
* Example: with `isPrivilegedName = name => /owner|admin/i.test(name)`
|
|
162
|
+
*
|
|
163
|
+
* `owner` → true (Identifier match)
|
|
164
|
+
* `state.owner` → true (MemberAccess memberName match)
|
|
165
|
+
* `_admins[user]` → true (IndexAccess base match)
|
|
166
|
+
* `getOwner()` → true (FunctionCall callee match)
|
|
167
|
+
* `unrelatedField` → false
|
|
168
|
+
*/
|
|
169
|
+
export declare function isPrivilegedReference(expr: any, isPrivilegedName: PrivilegedNamePredicate): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Recognise the structural shape of an access-control predicate
|
|
172
|
+
* inside a `require(...)` argument (or any boolean condition).
|
|
173
|
+
* Accepted shapes:
|
|
174
|
+
*
|
|
175
|
+
* `msg.sender == owner` `BinaryOperation '=='`
|
|
176
|
+
* `admin == msg.sender` with msg.sender on either
|
|
177
|
+
* operand and the other side
|
|
178
|
+
* a privileged reference.
|
|
179
|
+
* `_authorized[msg.sender]` `IndexAccess` whose base is
|
|
180
|
+
* privileged-named and whose
|
|
181
|
+
* index is `msg.sender`.
|
|
182
|
+
* `hasRole(role, msg.sender)` `FunctionCall` whose callee
|
|
183
|
+
* `_checkRole(role, ...)` tail matches a known role-
|
|
184
|
+
* check helper.
|
|
185
|
+
*
|
|
186
|
+
* Recurses through `&&`, `||`, `!`, and `TupleExpression` so
|
|
187
|
+
* multi-clause predicates are handled. Returns false for shapes
|
|
188
|
+
* that don't match — callers can wrap with their own fallback if
|
|
189
|
+
* they need broader recall (e.g. `arbitrary-call-error` uses a
|
|
190
|
+
* flattened-name match as a final fallback to catch wrapper-style
|
|
191
|
+
* helpers like `require(_isAuthorized(msg.sender))`).
|
|
192
|
+
*/
|
|
193
|
+
export declare function requireExpressesAccessControl(expr: any, isPrivilegedName: PrivilegedNamePredicate, getCalleeName?: (call: any) => string): boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Does the function definition carry at least one of the canonical
|
|
196
|
+
* access-control modifiers (`onlyOwner`, `onlyRole`, `onlyAdmin`,
|
|
197
|
+
* etc., as defined in `_common/ast.ts:ACCESS_CONTROL_MODIFIERS`)?
|
|
198
|
+
*
|
|
199
|
+
* Note: this set is intentionally narrower than some detectors'
|
|
200
|
+
* inline regex matchers. If a detector treats `whenNotPaused` or
|
|
201
|
+
* `initializer` as a guard, it should keep its own list rather than
|
|
202
|
+
* widening the canonical set silently.
|
|
203
|
+
*/
|
|
204
|
+
export declare function hasRecognisedAccessControlModifier(fn: any): boolean;
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared structural predicates for access-control reasoning.
|
|
4
|
+
*
|
|
5
|
+
* Several detectors hand-roll the same AST predicates: "is this
|
|
6
|
+
* expression `msg.sender`?", "does this require argument express an
|
|
7
|
+
* access-control check?", "does this function carry a recognised
|
|
8
|
+
* `onlyOwner`-style modifier?". The implementations have drifted —
|
|
9
|
+
* the audit found 21+ files with their own copy of the modifier set
|
|
10
|
+
* and slightly-different regex name predicates — but the *shape* of
|
|
11
|
+
* each predicate is the same. This module exists so detectors can
|
|
12
|
+
* import one canonical AST walker and supply only the policy bits
|
|
13
|
+
* (which identifier names count as "privileged") that are actually
|
|
14
|
+
* detector-specific.
|
|
15
|
+
*
|
|
16
|
+
* Design notes for callers:
|
|
17
|
+
*
|
|
18
|
+
* - `isPrivilegedName` is intentionally a parameter to the structural
|
|
19
|
+
* walkers below, not a fixed predicate on this module. Different
|
|
20
|
+
* detectors include different keywords (`fee`, `treasury`,
|
|
21
|
+
* `paused`, `auth`, `manager`, ...) and unifying them here would
|
|
22
|
+
* change findings in subtle ways. Keep the policy local.
|
|
23
|
+
* - The structural shape of `requireExpressesAccessControl` mirrors
|
|
24
|
+
* the predicate `arbitrary-call-error` shipped in PR #1813 with
|
|
25
|
+
* one explicit parameterisation: the name predicate. New detectors
|
|
26
|
+
* should prefer this helper over re-implementing the recursion.
|
|
27
|
+
* - `hasRecognisedAccessControlModifier` consults the canonical
|
|
28
|
+
* `ACCESS_CONTROL_MODIFIERS` set from `_common/ast.ts` so we have
|
|
29
|
+
* one source of truth for the modifier vocabulary.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.DEFAULT_PRIVILEGED_KEYWORDS = exports.isAccessControlModifierName = exports.ACCESS_CONTROL_MODIFIERS = void 0;
|
|
33
|
+
exports.splitIdentifierTokens = splitIdentifierTokens;
|
|
34
|
+
exports.isPrivilegedIdentifier = isPrivilegedIdentifier;
|
|
35
|
+
exports.isMsgSenderExpr = isMsgSenderExpr;
|
|
36
|
+
exports.isCallerIdentityExpression = isCallerIdentityExpression;
|
|
37
|
+
exports.isHasRoleStyleCall = isHasRoleStyleCall;
|
|
38
|
+
exports.getCalleeNameDefault = getCalleeNameDefault;
|
|
39
|
+
exports.isPrivilegedReference = isPrivilegedReference;
|
|
40
|
+
exports.requireExpressesAccessControl = requireExpressesAccessControl;
|
|
41
|
+
exports.hasRecognisedAccessControlModifier = hasRecognisedAccessControlModifier;
|
|
42
|
+
const ast_1 = require("./ast");
|
|
43
|
+
Object.defineProperty(exports, "ACCESS_CONTROL_MODIFIERS", { enumerable: true, get: function () { return ast_1.ACCESS_CONTROL_MODIFIERS; } });
|
|
44
|
+
Object.defineProperty(exports, "isAccessControlModifierName", { enumerable: true, get: function () { return ast_1.isAccessControlModifierName; } });
|
|
45
|
+
/**
|
|
46
|
+
* Canonical default keyword set for privileged-identifier matching.
|
|
47
|
+
* Mirrors the legacy `AccessControlDetector` regex
|
|
48
|
+
* (`/owner|admin|role|paused|pause|guardian|timelock|governor|fee|treasury|operator/`)
|
|
49
|
+
* so detectors that want "the typical policy" don't need to spell it
|
|
50
|
+
* out. Detectors with a different vocabulary (e.g. `cartel-custom-approval-logic`
|
|
51
|
+
* adds `manager|authority|authorized`) pass their own list via the
|
|
52
|
+
* `keywords` option.
|
|
53
|
+
*
|
|
54
|
+
* Word-boundary semantics (G.5): the `governorRequiredFee` over-match
|
|
55
|
+
* called out in the architectural review is fixed under
|
|
56
|
+
* `isPrivilegedIdentifier(name, { mode: 'word-boundary' })`. The
|
|
57
|
+
* default mode is still `'substring'` for behaviour preservation; see
|
|
58
|
+
* `isPrivilegedIdentifier` below and ADR 0005 for the rollout plan.
|
|
59
|
+
*/
|
|
60
|
+
exports.DEFAULT_PRIVILEGED_KEYWORDS = Object.freeze([
|
|
61
|
+
'owner', 'admin', 'role', 'paused', 'pause',
|
|
62
|
+
'guardian', 'timelock', 'governor', 'fee', 'treasury', 'operator',
|
|
63
|
+
]);
|
|
64
|
+
const KEYWORD_REGEX_CACHE = new Map();
|
|
65
|
+
const KEYWORD_SET_CACHE = new Map();
|
|
66
|
+
function keywordRegex(keywords) {
|
|
67
|
+
const cacheKey = keywords.join('|');
|
|
68
|
+
let regex = KEYWORD_REGEX_CACHE.get(cacheKey);
|
|
69
|
+
if (!regex) {
|
|
70
|
+
regex = new RegExp(cacheKey, 'i');
|
|
71
|
+
KEYWORD_REGEX_CACHE.set(cacheKey, regex);
|
|
72
|
+
}
|
|
73
|
+
return regex;
|
|
74
|
+
}
|
|
75
|
+
function keywordSet(keywords) {
|
|
76
|
+
const cacheKey = keywords.join('|');
|
|
77
|
+
let set = KEYWORD_SET_CACHE.get(cacheKey);
|
|
78
|
+
if (!set) {
|
|
79
|
+
set = new Set(keywords.map((k) => k.toLowerCase()));
|
|
80
|
+
KEYWORD_SET_CACHE.set(cacheKey, set);
|
|
81
|
+
}
|
|
82
|
+
return set;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Tokenise an identifier on snake_case and camelCase / PascalCase
|
|
86
|
+
* boundaries. Returns lowercased non-empty tokens.
|
|
87
|
+
*
|
|
88
|
+
* `governor` → ['governor']
|
|
89
|
+
* `governorAddress` → ['governor', 'address']
|
|
90
|
+
* `governor_required_fee` → ['governor', 'required', 'fee']
|
|
91
|
+
* `OWNER` → ['owner']
|
|
92
|
+
* `_admin` → ['admin']
|
|
93
|
+
* `XYZOwner` → ['xyz', 'owner']
|
|
94
|
+
*
|
|
95
|
+
* Exported for direct testing and for detectors that need their own
|
|
96
|
+
* token-aware predicate variant.
|
|
97
|
+
*/
|
|
98
|
+
function splitIdentifierTokens(name) {
|
|
99
|
+
if (!name)
|
|
100
|
+
return [];
|
|
101
|
+
const spaced = name
|
|
102
|
+
.replace(/_+/g, ' ')
|
|
103
|
+
.replace(/([a-z\d])([A-Z])/g, '$1 $2')
|
|
104
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');
|
|
105
|
+
return spaced
|
|
106
|
+
.toLowerCase()
|
|
107
|
+
.split(/\s+/)
|
|
108
|
+
.filter((tok) => tok.length > 0);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Privileged-identifier predicate — does `name` look like the
|
|
112
|
+
* Solidity-level identifier of a privileged storage slot, function,
|
|
113
|
+
* or modifier?
|
|
114
|
+
*
|
|
115
|
+
* Centralises the substring regex that detectors used to inline
|
|
116
|
+
* (G.5 / J.4 / roadmap 1.2).
|
|
117
|
+
*
|
|
118
|
+
* Two modes are supported (see ADR 0005):
|
|
119
|
+
*
|
|
120
|
+
* - `'substring'` (default) — case-insensitive
|
|
121
|
+
* `/keyword1|keyword2|.../i.test(lower(name))`. Faithfully preserves
|
|
122
|
+
* the legacy inline-regex behaviour. Over-matches identifiers like
|
|
123
|
+
* `governorRequiredFee` that happen to embed multiple keywords.
|
|
124
|
+
*
|
|
125
|
+
* - `'word-boundary'` — tokenise on snake/camelCase boundaries
|
|
126
|
+
* (`splitIdentifierTokens`) and match if the FIRST token is a keyword
|
|
127
|
+
* AND no other token is a keyword. So `governor`, `governorAddress`,
|
|
128
|
+
* `owner_address` all match; `governorRequiredFee`, `paramOwner`,
|
|
129
|
+
* `controllerFee`, `configRole` do not. This is the eventual
|
|
130
|
+
* semantics for G.5; today it is opt-in per call site so each
|
|
131
|
+
* detector can validate the recall impact independently.
|
|
132
|
+
*/
|
|
133
|
+
function isPrivilegedIdentifier(name, options = {}) {
|
|
134
|
+
if (!name)
|
|
135
|
+
return false;
|
|
136
|
+
const keywords = options.keywords ?? exports.DEFAULT_PRIVILEGED_KEYWORDS;
|
|
137
|
+
if (keywords.length === 0)
|
|
138
|
+
return false;
|
|
139
|
+
const mode = options.mode ?? 'substring';
|
|
140
|
+
if (mode === 'substring') {
|
|
141
|
+
return keywordRegex(keywords).test(name.toLowerCase());
|
|
142
|
+
}
|
|
143
|
+
const tokens = splitIdentifierTokens(name);
|
|
144
|
+
if (tokens.length === 0)
|
|
145
|
+
return false;
|
|
146
|
+
const set = keywordSet(keywords);
|
|
147
|
+
if (!set.has(tokens[0]))
|
|
148
|
+
return false;
|
|
149
|
+
for (let i = 1; i < tokens.length; i += 1) {
|
|
150
|
+
if (set.has(tokens[i]))
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* `msg.sender` exactly: a `MemberAccess` whose `memberName` is
|
|
157
|
+
* `'sender'` and whose `expression` is the `Identifier` `msg`.
|
|
158
|
+
* Accepts both parser and solc AST shapes.
|
|
159
|
+
*/
|
|
160
|
+
function isMsgSenderExpr(expr) {
|
|
161
|
+
if (!expr || typeof expr !== 'object')
|
|
162
|
+
return false;
|
|
163
|
+
if (!(0, ast_1.isNode)(expr, 'MemberAccess'))
|
|
164
|
+
return false;
|
|
165
|
+
if (String(expr.memberName || '') !== 'sender')
|
|
166
|
+
return false;
|
|
167
|
+
const inner = expr.expression;
|
|
168
|
+
return !!inner && (0, ast_1.isNode)(inner, 'Identifier') && (inner.name || '') === 'msg';
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Caller-identity expression: any AST shape that resolves to the
|
|
172
|
+
* current transaction sender. Three shapes are recognised:
|
|
173
|
+
*
|
|
174
|
+
* `msg.sender` — the canonical built-in
|
|
175
|
+
* `_msgSender()` — the OpenZeppelin `Context` helper
|
|
176
|
+
* (zero arguments only)
|
|
177
|
+
* `this._msgSender()` — the same helper invoked as a member
|
|
178
|
+
* call on the contract itself
|
|
179
|
+
*
|
|
180
|
+
* Recognition is limited to zero-argument calls so that lookalike
|
|
181
|
+
* helpers that take arguments (`_msgSender(metaTxBytes)`, etc.) are
|
|
182
|
+
* not silently treated as caller-identity.
|
|
183
|
+
*/
|
|
184
|
+
function isCallerIdentityExpression(expr) {
|
|
185
|
+
if (!expr || typeof expr !== 'object')
|
|
186
|
+
return false;
|
|
187
|
+
if (isMsgSenderExpr(expr))
|
|
188
|
+
return true;
|
|
189
|
+
if (!(0, ast_1.isNode)(expr, 'FunctionCall'))
|
|
190
|
+
return false;
|
|
191
|
+
const args = expr.arguments || [];
|
|
192
|
+
if (Array.isArray(args) && args.length !== 0)
|
|
193
|
+
return false;
|
|
194
|
+
const callee = expr.expression;
|
|
195
|
+
if (!callee)
|
|
196
|
+
return false;
|
|
197
|
+
if ((0, ast_1.isNode)(callee, 'Identifier') && String(callee.name || '') === '_msgSender')
|
|
198
|
+
return true;
|
|
199
|
+
if ((0, ast_1.isNode)(callee, 'MemberAccess')) {
|
|
200
|
+
if (String(callee.memberName || '') !== '_msgSender')
|
|
201
|
+
return false;
|
|
202
|
+
const base = callee.expression;
|
|
203
|
+
return !!base && (0, ast_1.isNode)(base, 'Identifier') && String(base.name || '') === 'this';
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Recognise `hasRole(...)`, `checkRole(...)`, or `_checkRole(...)`
|
|
209
|
+
* style calls — the standard OpenZeppelin AccessControl entry points
|
|
210
|
+
* that callers use to delegate the access check to a role registry.
|
|
211
|
+
*
|
|
212
|
+
* `getCalleeName` is supplied by the caller so detectors that
|
|
213
|
+
* already have a richer name resolver (chained MemberAccess, etc.)
|
|
214
|
+
* can pass it in. If you don't have one, `getCalleeNameDefault`
|
|
215
|
+
* below is a reasonable starting point.
|
|
216
|
+
*/
|
|
217
|
+
function isHasRoleStyleCall(expr, getCalleeName) {
|
|
218
|
+
if (!expr || !(0, ast_1.isNode)(expr, 'FunctionCall'))
|
|
219
|
+
return false;
|
|
220
|
+
const callee = getCalleeName(expr).toLowerCase();
|
|
221
|
+
const tail = callee.includes('.') ? callee.split('.').pop() || callee : callee;
|
|
222
|
+
return tail === 'hasrole' || tail === 'checkrole' || tail === '_checkrole';
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Default callee-name resolver suitable for most detectors. Walks
|
|
226
|
+
* `expr.expression` through `Identifier` and `MemberAccess` nodes
|
|
227
|
+
* and returns the dotted form (`base.member.tail`).
|
|
228
|
+
*/
|
|
229
|
+
function getCalleeNameDefault(call) {
|
|
230
|
+
if (!call)
|
|
231
|
+
return '';
|
|
232
|
+
const expr = call.expression;
|
|
233
|
+
if (!expr)
|
|
234
|
+
return '';
|
|
235
|
+
return resolveCalleeName(expr);
|
|
236
|
+
}
|
|
237
|
+
function resolveCalleeName(expr) {
|
|
238
|
+
if (!expr)
|
|
239
|
+
return '';
|
|
240
|
+
if ((0, ast_1.isNode)(expr, 'Identifier'))
|
|
241
|
+
return String(expr.name || '');
|
|
242
|
+
if ((0, ast_1.isNode)(expr, 'MemberAccess')) {
|
|
243
|
+
const prefix = resolveCalleeName(expr.expression);
|
|
244
|
+
const member = String(expr.memberName || '');
|
|
245
|
+
return prefix ? `${prefix}.${member}` : member;
|
|
246
|
+
}
|
|
247
|
+
return '';
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Walk an expression looking for ANY identifier, member name, or
|
|
251
|
+
* mapping base whose name matches `isPrivilegedName`. Returns true
|
|
252
|
+
* on first hit. Recurses through `Identifier`, `MemberAccess`,
|
|
253
|
+
* `IndexAccess`, and `FunctionCall` chains — the same shape every
|
|
254
|
+
* existing detector reimplements.
|
|
255
|
+
*
|
|
256
|
+
* Example: with `isPrivilegedName = name => /owner|admin/i.test(name)`
|
|
257
|
+
*
|
|
258
|
+
* `owner` → true (Identifier match)
|
|
259
|
+
* `state.owner` → true (MemberAccess memberName match)
|
|
260
|
+
* `_admins[user]` → true (IndexAccess base match)
|
|
261
|
+
* `getOwner()` → true (FunctionCall callee match)
|
|
262
|
+
* `unrelatedField` → false
|
|
263
|
+
*/
|
|
264
|
+
function isPrivilegedReference(expr, isPrivilegedName) {
|
|
265
|
+
if (!expr || typeof expr !== 'object')
|
|
266
|
+
return false;
|
|
267
|
+
if ((0, ast_1.isNode)(expr, 'Identifier')) {
|
|
268
|
+
return isPrivilegedName(String(expr.name || ''));
|
|
269
|
+
}
|
|
270
|
+
if ((0, ast_1.isNode)(expr, 'MemberAccess')) {
|
|
271
|
+
if (isPrivilegedName(String(expr.memberName || '')))
|
|
272
|
+
return true;
|
|
273
|
+
return isPrivilegedReference(expr.expression, isPrivilegedName);
|
|
274
|
+
}
|
|
275
|
+
if ((0, ast_1.isNode)(expr, 'IndexAccess')) {
|
|
276
|
+
return isPrivilegedReference(expr.base || expr.baseExpression, isPrivilegedName);
|
|
277
|
+
}
|
|
278
|
+
if ((0, ast_1.isNode)(expr, 'FunctionCall')) {
|
|
279
|
+
return isPrivilegedReference(expr.expression, isPrivilegedName);
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Recognise the structural shape of an access-control predicate
|
|
285
|
+
* inside a `require(...)` argument (or any boolean condition).
|
|
286
|
+
* Accepted shapes:
|
|
287
|
+
*
|
|
288
|
+
* `msg.sender == owner` `BinaryOperation '=='`
|
|
289
|
+
* `admin == msg.sender` with msg.sender on either
|
|
290
|
+
* operand and the other side
|
|
291
|
+
* a privileged reference.
|
|
292
|
+
* `_authorized[msg.sender]` `IndexAccess` whose base is
|
|
293
|
+
* privileged-named and whose
|
|
294
|
+
* index is `msg.sender`.
|
|
295
|
+
* `hasRole(role, msg.sender)` `FunctionCall` whose callee
|
|
296
|
+
* `_checkRole(role, ...)` tail matches a known role-
|
|
297
|
+
* check helper.
|
|
298
|
+
*
|
|
299
|
+
* Recurses through `&&`, `||`, `!`, and `TupleExpression` so
|
|
300
|
+
* multi-clause predicates are handled. Returns false for shapes
|
|
301
|
+
* that don't match — callers can wrap with their own fallback if
|
|
302
|
+
* they need broader recall (e.g. `arbitrary-call-error` uses a
|
|
303
|
+
* flattened-name match as a final fallback to catch wrapper-style
|
|
304
|
+
* helpers like `require(_isAuthorized(msg.sender))`).
|
|
305
|
+
*/
|
|
306
|
+
function requireExpressesAccessControl(expr, isPrivilegedName, getCalleeName = getCalleeNameDefault) {
|
|
307
|
+
if (!expr || typeof expr !== 'object')
|
|
308
|
+
return false;
|
|
309
|
+
if (isHasRoleStyleCall(expr, getCalleeName))
|
|
310
|
+
return true;
|
|
311
|
+
if ((0, ast_1.isNode)(expr, 'BinaryOperation') && (expr.operator === '==' || expr.operator === '!=' || expr.operator === '===')) {
|
|
312
|
+
const left = expr.left || expr.leftExpression;
|
|
313
|
+
const right = expr.right || expr.rightExpression;
|
|
314
|
+
if ((isMsgSenderExpr(left) && isPrivilegedReference(right, isPrivilegedName))
|
|
315
|
+
|| (isMsgSenderExpr(right) && isPrivilegedReference(left, isPrivilegedName))) {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if ((0, ast_1.isNode)(expr, 'IndexAccess')) {
|
|
320
|
+
const base = expr.base || expr.baseExpression;
|
|
321
|
+
const index = expr.index || expr.indexExpression;
|
|
322
|
+
if (isMsgSenderExpr(index) && isPrivilegedReference(base, isPrivilegedName))
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
if ((0, ast_1.isNode)(expr, 'BinaryOperation') && (expr.operator === '&&' || expr.operator === '||')) {
|
|
326
|
+
const left = expr.left || expr.leftExpression;
|
|
327
|
+
const right = expr.right || expr.rightExpression;
|
|
328
|
+
if (requireExpressesAccessControl(left, isPrivilegedName, getCalleeName))
|
|
329
|
+
return true;
|
|
330
|
+
if (requireExpressesAccessControl(right, isPrivilegedName, getCalleeName))
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
if ((0, ast_1.isNode)(expr, 'UnaryOperation') && expr.operator === '!') {
|
|
334
|
+
const inner = expr.subExpression;
|
|
335
|
+
if (requireExpressesAccessControl(inner, isPrivilegedName, getCalleeName))
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
if ((0, ast_1.isNode)(expr, 'TupleExpression')) {
|
|
339
|
+
for (const child of expr.components || []) {
|
|
340
|
+
if (requireExpressesAccessControl(child, isPrivilegedName, getCalleeName))
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Does the function definition carry at least one of the canonical
|
|
348
|
+
* access-control modifiers (`onlyOwner`, `onlyRole`, `onlyAdmin`,
|
|
349
|
+
* etc., as defined in `_common/ast.ts:ACCESS_CONTROL_MODIFIERS`)?
|
|
350
|
+
*
|
|
351
|
+
* Note: this set is intentionally narrower than some detectors'
|
|
352
|
+
* inline regex matchers. If a detector treats `whenNotPaused` or
|
|
353
|
+
* `initializer` as a guard, it should keep its own list rather than
|
|
354
|
+
* widening the canonical set silently.
|
|
355
|
+
*/
|
|
356
|
+
function hasRecognisedAccessControlModifier(fn) {
|
|
357
|
+
for (const modifier of fn?.modifiers || []) {
|
|
358
|
+
const name = extractModifierName(modifier);
|
|
359
|
+
if (name && (0, ast_1.isAccessControlModifierName)(name))
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
function extractModifierName(modifier) {
|
|
365
|
+
if (!modifier)
|
|
366
|
+
return '';
|
|
367
|
+
if (typeof modifier === 'string')
|
|
368
|
+
return modifier;
|
|
369
|
+
if (typeof modifier.name === 'string')
|
|
370
|
+
return modifier.name;
|
|
371
|
+
if (modifier.name && typeof modifier.name.name === 'string')
|
|
372
|
+
return modifier.name.name;
|
|
373
|
+
if (modifier.modifierName && typeof modifier.modifierName.name === 'string')
|
|
374
|
+
return modifier.modifierName.name;
|
|
375
|
+
return '';
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=access-control.js.map
|