@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,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Erc4337ValidationStorageAccessDetector = void 0;
|
|
4
|
+
const ast_1 = require("./_common/ast");
|
|
5
|
+
const access_control_1 = require("./_common/access-control");
|
|
6
|
+
/**
|
|
7
|
+
* ERC-4337 validation-phase storage-access detector.
|
|
8
|
+
*
|
|
9
|
+
* ERC-4337 account abstraction relies on the bundler being able to
|
|
10
|
+
* simulate `validateUserOp` (account) and `validatePaymasterUserOp`
|
|
11
|
+
* (paymaster) and trust that the validation result is stable in the
|
|
12
|
+
* mempool. ERC-7562 codifies the storage rules that make simulation ==
|
|
13
|
+
* execution: during validation an entity may freely touch its own
|
|
14
|
+
* storage (any slot of the validating contract) and storage *associated
|
|
15
|
+
* with the account* — slots keyed by the account address, i.e. the
|
|
16
|
+
* `keccak256(addr . X) + n` "associated storage" pattern that a
|
|
17
|
+
* `mapping(address => ...)` keyed by the sender produces. Touching
|
|
18
|
+
* storage keyed by a *different* address makes the userOp's validity
|
|
19
|
+
* depend on state another userOp can change between simulation and
|
|
20
|
+
* inclusion, which bundlers reject and which is a classic mempool-
|
|
21
|
+
* griefing surface.
|
|
22
|
+
*
|
|
23
|
+
* This detector flags, inside `validateUserOp` / `validatePaymasterUserOp`,
|
|
24
|
+
* any read or write of an address-keyed state mapping whose index chain
|
|
25
|
+
* contains no account-identity key (`msg.sender`, `_msgSender()`,
|
|
26
|
+
* `userOp.sender`, `address(this)`, `this`). It is deliberately lenient:
|
|
27
|
+
* if any key in a nested-mapping chain is an account identity the access
|
|
28
|
+
* is treated as associated storage and is NOT flagged.
|
|
29
|
+
*
|
|
30
|
+
* Scope / known limitations (documented FNs, see the detector doc):
|
|
31
|
+
* - Only the direct bodies of the two validation entry points are
|
|
32
|
+
* analysed; storage touched through internal helper calls is not
|
|
33
|
+
* followed (no call-graph).
|
|
34
|
+
* - Only same-contract `mapping(address => ...)` declarations are
|
|
35
|
+
* considered; mappings inherited from a base in another file or held
|
|
36
|
+
* inside a diamond-storage struct (`s.balances[x]`) are not tracked.
|
|
37
|
+
* - Non-address-keyed mappings, plain arrays, and scalar state are
|
|
38
|
+
* treated as the validating contract's own (self) storage — allowed.
|
|
39
|
+
* - External-contract storage reads via interface/static calls during
|
|
40
|
+
* validation are out of scope here (staking status, which permits
|
|
41
|
+
* them, is not statically knowable from the AST).
|
|
42
|
+
*/
|
|
43
|
+
const RULE_ID = 'erc4337-validation-storage-access';
|
|
44
|
+
const PATTERN = `${RULE_ID}/non-associated-storage`;
|
|
45
|
+
// ERC-4337 validation entry points subject to the ERC-7562 storage rules.
|
|
46
|
+
const VALIDATION_FUNCTIONS = new Set(['validateUserOp', 'validatePaymasterUserOp']);
|
|
47
|
+
class Erc4337ValidationStorageAccessDetector {
|
|
48
|
+
id = RULE_ID;
|
|
49
|
+
patternKey = RULE_ID;
|
|
50
|
+
supportedAstKinds = ['parser'];
|
|
51
|
+
descriptor = {
|
|
52
|
+
id: RULE_ID,
|
|
53
|
+
shortDescription: 'ERC-4337 validateUserOp/validatePaymasterUserOp reads or writes address-keyed storage not associated with the account being validated.',
|
|
54
|
+
helpUri: 'https://snovon.com/',
|
|
55
|
+
defaultSeverity: 'medium',
|
|
56
|
+
help: 'Detects ERC-4337 account/paymaster validation logic that touches address-keyed storage whose index is not the account identity (msg.sender / userOp.sender / address(this)), violating the ERC-7562 validation-phase storage rules and exposing the userOp to mempool griefing.',
|
|
57
|
+
};
|
|
58
|
+
currentFile = '';
|
|
59
|
+
currentContract = '';
|
|
60
|
+
findings = [];
|
|
61
|
+
// address-keyed state mappings declared on the current contract.
|
|
62
|
+
addressKeyedMappings = new Set();
|
|
63
|
+
// The validation function currently being walked (null when outside one).
|
|
64
|
+
validationFnNode = null;
|
|
65
|
+
validationFnName = '';
|
|
66
|
+
// Inner IndexAccess nodes already folded into an outer chain — skipped
|
|
67
|
+
// when the walker reaches them so a nested `m[a][b]` is judged once.
|
|
68
|
+
foldedIndexNodes = new WeakSet();
|
|
69
|
+
// Dedup key set, so `m[x] = m[x] + 1` (two IndexAccess nodes on the
|
|
70
|
+
// same slot/line) emits a single finding.
|
|
71
|
+
emitted = new Set();
|
|
72
|
+
setFile(file) {
|
|
73
|
+
this.currentFile = file;
|
|
74
|
+
this.currentContract = '';
|
|
75
|
+
this.findings = [];
|
|
76
|
+
this.addressKeyedMappings = new Set();
|
|
77
|
+
this.validationFnNode = null;
|
|
78
|
+
this.validationFnName = '';
|
|
79
|
+
this.foldedIndexNodes = new WeakSet();
|
|
80
|
+
this.emitted = new Set();
|
|
81
|
+
}
|
|
82
|
+
getFindings() {
|
|
83
|
+
return this.findings;
|
|
84
|
+
}
|
|
85
|
+
ContractDefinition(node) {
|
|
86
|
+
this.currentContract = node?.name || '';
|
|
87
|
+
this.addressKeyedMappings = this.collectAddressKeyedMappings(node);
|
|
88
|
+
this.validationFnNode = null;
|
|
89
|
+
this.validationFnName = '';
|
|
90
|
+
}
|
|
91
|
+
ContractDefinition_post() {
|
|
92
|
+
this.currentContract = '';
|
|
93
|
+
this.addressKeyedMappings = new Set();
|
|
94
|
+
this.validationFnNode = null;
|
|
95
|
+
this.validationFnName = '';
|
|
96
|
+
}
|
|
97
|
+
['ContractDefinition:exit']() {
|
|
98
|
+
this.ContractDefinition_post();
|
|
99
|
+
}
|
|
100
|
+
FunctionDefinition(node) {
|
|
101
|
+
const name = typeof node?.name === 'string' ? node.name : '';
|
|
102
|
+
if (node?.body && VALIDATION_FUNCTIONS.has(name)) {
|
|
103
|
+
this.validationFnNode = node;
|
|
104
|
+
this.validationFnName = name;
|
|
105
|
+
this.emitted = new Set();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
FunctionDefinition_post(node) {
|
|
109
|
+
if (node === this.validationFnNode) {
|
|
110
|
+
this.validationFnNode = null;
|
|
111
|
+
this.validationFnName = '';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
['FunctionDefinition:exit'](node) {
|
|
115
|
+
this.FunctionDefinition_post(node);
|
|
116
|
+
}
|
|
117
|
+
IndexAccess(node) {
|
|
118
|
+
if (!this.validationFnNode)
|
|
119
|
+
return;
|
|
120
|
+
if (this.foldedIndexNodes.has(node))
|
|
121
|
+
return;
|
|
122
|
+
const { rootName, keys } = this.resolveChain(node);
|
|
123
|
+
if (!rootName || !this.addressKeyedMappings.has(rootName))
|
|
124
|
+
return;
|
|
125
|
+
// Associated storage: allowed if ANY key in the chain is the account
|
|
126
|
+
// identity. Lenient on purpose to keep false positives low.
|
|
127
|
+
for (const key of keys) {
|
|
128
|
+
if (this.isAccountIdentity(key))
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const { line, column } = (0, ast_1.assertLoc)(node, this.validationFnNode);
|
|
132
|
+
const dedupKey = `${rootName}@${line}:${column}`;
|
|
133
|
+
if (this.emitted.has(dedupKey))
|
|
134
|
+
return;
|
|
135
|
+
this.emitted.add(dedupKey);
|
|
136
|
+
this.findings.push({
|
|
137
|
+
file: this.currentFile,
|
|
138
|
+
contract: this.currentContract,
|
|
139
|
+
function: this.validationFnName,
|
|
140
|
+
line,
|
|
141
|
+
column,
|
|
142
|
+
pattern: PATTERN,
|
|
143
|
+
confidence: 'medium',
|
|
144
|
+
ruleId: RULE_ID,
|
|
145
|
+
severity: 'medium',
|
|
146
|
+
message: `ERC-4337 validation function '${this.validationFnName}' accesses address-keyed storage '${rootName}' ` +
|
|
147
|
+
`that is not associated with the account being validated (no msg.sender / userOp.sender / address(this) key). ` +
|
|
148
|
+
`Validation-phase storage access must stay within self and account-associated slots (ERC-7562), otherwise the ` +
|
|
149
|
+
`userOp can be invalidated by another account's state and griefed out of the mempool.`,
|
|
150
|
+
contractName: this.currentContract,
|
|
151
|
+
functionName: this.validationFnName,
|
|
152
|
+
findingId: '',
|
|
153
|
+
contractHash: '',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Walk an IndexAccess chain (`m[a][b]...`) bottom-up, collecting every
|
|
157
|
+
// key expression and resolving the root mapping identifier name.
|
|
158
|
+
resolveChain(node) {
|
|
159
|
+
const keys = [];
|
|
160
|
+
let cur = node;
|
|
161
|
+
while (cur && (0, ast_1.isNode)(cur, 'IndexAccess')) {
|
|
162
|
+
const idx = cur.index !== undefined ? cur.index : cur.indexExpression;
|
|
163
|
+
keys.push(idx);
|
|
164
|
+
if (cur !== node)
|
|
165
|
+
this.foldedIndexNodes.add(cur);
|
|
166
|
+
cur = cur.base !== undefined ? cur.base : cur.baseExpression;
|
|
167
|
+
}
|
|
168
|
+
const rootName = cur && (0, ast_1.isNode)(cur, 'Identifier') ? String(cur.name || '') : null;
|
|
169
|
+
return { rootName, keys };
|
|
170
|
+
}
|
|
171
|
+
// Does `expr` resolve to the address of the account being validated?
|
|
172
|
+
isAccountIdentity(expr) {
|
|
173
|
+
if (!expr || typeof expr !== 'object')
|
|
174
|
+
return false;
|
|
175
|
+
// msg.sender, _msgSender(), this._msgSender()
|
|
176
|
+
if ((0, access_control_1.isCallerIdentityExpression)(expr))
|
|
177
|
+
return true;
|
|
178
|
+
// address(this)
|
|
179
|
+
if (this.isAddressThis(expr))
|
|
180
|
+
return true;
|
|
181
|
+
// userOp.sender, op.sender, _userOp.getSender()-style `.sender` members
|
|
182
|
+
if ((0, ast_1.isNode)(expr, 'MemberAccess') && String(expr.memberName || '') === 'sender')
|
|
183
|
+
return true;
|
|
184
|
+
// bare `this`
|
|
185
|
+
if ((0, ast_1.isNode)(expr, 'Identifier') && String(expr.name || '') === 'this')
|
|
186
|
+
return true;
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
isAddressThis(expr) {
|
|
190
|
+
if (!expr || !(0, ast_1.isNode)(expr, 'FunctionCall'))
|
|
191
|
+
return false;
|
|
192
|
+
const args = expr.arguments || [];
|
|
193
|
+
if (args.length !== 1)
|
|
194
|
+
return false;
|
|
195
|
+
const arg0 = args[0];
|
|
196
|
+
if (!arg0 || !(0, ast_1.isNode)(arg0, 'Identifier') || String(arg0.name || '') !== 'this')
|
|
197
|
+
return false;
|
|
198
|
+
const callee = expr.expression;
|
|
199
|
+
if (!callee)
|
|
200
|
+
return false;
|
|
201
|
+
if ((0, ast_1.isNode)(callee, 'ElementaryTypeName') && String(callee.name || '') === 'address')
|
|
202
|
+
return true;
|
|
203
|
+
if ((0, ast_1.isNode)(callee, 'Identifier') && String(callee.name || '') === 'address')
|
|
204
|
+
return true;
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
collectAddressKeyedMappings(contract) {
|
|
208
|
+
const set = new Set();
|
|
209
|
+
for (const sub of contract?.subNodes || []) {
|
|
210
|
+
if (!(0, ast_1.isNode)(sub, 'StateVariableDeclaration'))
|
|
211
|
+
continue;
|
|
212
|
+
for (const v of sub.variables || []) {
|
|
213
|
+
if (!v?.name)
|
|
214
|
+
continue;
|
|
215
|
+
if (this.isAddressKeyedMapping(v.typeName))
|
|
216
|
+
set.add(String(v.name));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return set;
|
|
220
|
+
}
|
|
221
|
+
isAddressKeyedMapping(typeName) {
|
|
222
|
+
if (!typeName || !(0, ast_1.isNode)(typeName, 'Mapping'))
|
|
223
|
+
return false;
|
|
224
|
+
const keyType = typeName.keyType;
|
|
225
|
+
if (!keyType)
|
|
226
|
+
return false;
|
|
227
|
+
// address / address payable key types — the associated-storage surface.
|
|
228
|
+
return (0, ast_1.isNode)(keyType, 'ElementaryTypeName') && String(keyType.name || '').startsWith('address');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
exports.Erc4337ValidationStorageAccessDetector = Erc4337ValidationStorageAccessDetector;
|
|
232
|
+
//# sourceMappingURL=erc4337-validation-storage-access.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
export declare class Erc4626TotalassetsStubDetector {
|
|
3
|
+
readonly id = "erc4626-totalassets-stub";
|
|
4
|
+
readonly patternKey = "erc4626-totalassets-stub";
|
|
5
|
+
readonly supportedAstKinds: "parser"[];
|
|
6
|
+
scanAst(ast: any, file: string): ScanResult[];
|
|
7
|
+
private looksLikeErc4626Vault;
|
|
8
|
+
private matchesTotalAssets;
|
|
9
|
+
private elementaryTypeName;
|
|
10
|
+
private normalizeElementaryIntType;
|
|
11
|
+
private bodyCallsBalancePrimitive;
|
|
12
|
+
private bodyContainsBalanceShapedAccess;
|
|
13
|
+
private findDescendant;
|
|
14
|
+
private childNodes;
|
|
15
|
+
private makeFinding;
|
|
16
|
+
private locOf;
|
|
17
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Erc4626TotalassetsStubDetector = void 0;
|
|
4
|
+
const RULE_ID = 'erc4626-totalassets-stub';
|
|
5
|
+
const PATTERN = `${RULE_ID}/totalassets-stub`;
|
|
6
|
+
// Balance-read primitives whose presence anywhere in the function body
|
|
7
|
+
// counts as "totalAssets() actually computes a balance". The function
|
|
8
|
+
// signature gate restricts to contracts that look like ERC-4626 vaults,
|
|
9
|
+
// so this whitelist is intentionally narrow: any MemberAccess call
|
|
10
|
+
// named `balanceOf` is a real balance read, plus a few common helper
|
|
11
|
+
// names that vaults use to wrap the same operation.
|
|
12
|
+
const BALANCE_PRIMITIVE_MEMBERS = new Set([
|
|
13
|
+
'balanceOf', // IERC20.balanceOf — the canonical EIP-4626 totalAssets shape
|
|
14
|
+
'getBalance', // common wrapper name
|
|
15
|
+
'totalAssets', // delegation to another contract's totalAssets
|
|
16
|
+
'totalSupply', // for wrapped-share variants
|
|
17
|
+
'underlyingBalance',
|
|
18
|
+
'getUnderlyingBalance',
|
|
19
|
+
]);
|
|
20
|
+
// Storage-shaped reads that signal the function pulls from a balance-like
|
|
21
|
+
// source rather than a literal. Index access on a mapping/array (e.g.
|
|
22
|
+
// `_balances[address(this)]`) and `address(this).balance` are treated as
|
|
23
|
+
// balance reads.
|
|
24
|
+
const BALANCE_SHAPED_PATTERNS = new Set([
|
|
25
|
+
'balance', // address(this).balance — native ETH balance
|
|
26
|
+
]);
|
|
27
|
+
class Erc4626TotalassetsStubDetector {
|
|
28
|
+
id = RULE_ID;
|
|
29
|
+
patternKey = RULE_ID;
|
|
30
|
+
supportedAstKinds = ['parser'];
|
|
31
|
+
scanAst(ast, file) {
|
|
32
|
+
if (!ast || ast.type !== 'SourceUnit')
|
|
33
|
+
return [];
|
|
34
|
+
const findings = [];
|
|
35
|
+
for (const contract of ast.children || []) {
|
|
36
|
+
if (contract?.type !== 'ContractDefinition')
|
|
37
|
+
continue;
|
|
38
|
+
if (contract.kind === 'interface' || contract.kind === 'library')
|
|
39
|
+
continue;
|
|
40
|
+
// Vault-shape gate: the contract must look like an EIP-4626 vault.
|
|
41
|
+
// We require an `asset()` function definition OR an `IERC4626`
|
|
42
|
+
// inheritance declaration. Without one of these, a function named
|
|
43
|
+
// `totalAssets` is plausibly something else entirely (a yield
|
|
44
|
+
// aggregator pre-4626, a portfolio tracker, etc.) and a finding
|
|
45
|
+
// would be a false positive.
|
|
46
|
+
if (!this.looksLikeErc4626Vault(contract))
|
|
47
|
+
continue;
|
|
48
|
+
for (const subNode of contract.subNodes || []) {
|
|
49
|
+
if (subNode?.type !== 'FunctionDefinition')
|
|
50
|
+
continue;
|
|
51
|
+
if (!this.matchesTotalAssets(subNode))
|
|
52
|
+
continue;
|
|
53
|
+
if (!subNode.body)
|
|
54
|
+
continue;
|
|
55
|
+
const callsBalancePrimitive = this.bodyCallsBalancePrimitive(subNode.body);
|
|
56
|
+
const hasIndexAccess = this.bodyContainsBalanceShapedAccess(subNode.body);
|
|
57
|
+
if (!callsBalancePrimitive && !hasIndexAccess) {
|
|
58
|
+
findings.push(this.makeFinding(file, contract, subNode));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return findings;
|
|
63
|
+
}
|
|
64
|
+
looksLikeErc4626Vault(contract) {
|
|
65
|
+
// Inheritance declaration: `contract Vault is IERC4626, ...` or
|
|
66
|
+
// `contract Vault is ERC4626, ...`. Match identifiers that contain
|
|
67
|
+
// `4626` (case-insensitive) for robustness against versioned bases.
|
|
68
|
+
const baseContracts = Array.isArray(contract.baseContracts) ? contract.baseContracts : [];
|
|
69
|
+
for (const base of baseContracts) {
|
|
70
|
+
const path = base?.baseName?.namePath || base?.baseName?.name;
|
|
71
|
+
if (typeof path === 'string' && path.toLowerCase().includes('4626')) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Function presence: an `asset()` function returning an address-like
|
|
76
|
+
// type signals a vault.
|
|
77
|
+
for (const subNode of contract.subNodes || []) {
|
|
78
|
+
if (subNode?.type === 'FunctionDefinition' && subNode.name === 'asset') {
|
|
79
|
+
const params = Array.isArray(subNode.parameters) ? subNode.parameters : [];
|
|
80
|
+
if (params.length === 0)
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
matchesTotalAssets(fn) {
|
|
87
|
+
if (fn.name !== 'totalAssets')
|
|
88
|
+
return false;
|
|
89
|
+
const params = Array.isArray(fn.parameters) ? fn.parameters : [];
|
|
90
|
+
if (params.length !== 0)
|
|
91
|
+
return false;
|
|
92
|
+
const returnParams = Array.isArray(fn.returnParameters) ? fn.returnParameters : [];
|
|
93
|
+
if (returnParams.length !== 1)
|
|
94
|
+
return false;
|
|
95
|
+
const returnType = this.normalizeElementaryIntType(this.elementaryTypeName(returnParams[0]));
|
|
96
|
+
if (returnType !== 'uint256')
|
|
97
|
+
return false;
|
|
98
|
+
// Visibility must be public/external for the function to satisfy the
|
|
99
|
+
// EIP-4626 interface. Skip private/internal totalAssets helpers.
|
|
100
|
+
const vis = fn.visibility;
|
|
101
|
+
if (vis !== 'public' && vis !== 'external' && vis !== 'default')
|
|
102
|
+
return false;
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
elementaryTypeName(param) {
|
|
106
|
+
if (!param)
|
|
107
|
+
return null;
|
|
108
|
+
const tn = param.typeName;
|
|
109
|
+
if (!tn)
|
|
110
|
+
return null;
|
|
111
|
+
if (tn.type === 'ElementaryTypeName')
|
|
112
|
+
return tn.name || null;
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Solidity treats bare `uint` / `int` as aliases for `uint256` / `int256`;
|
|
116
|
+
// the ABI signature is identical, so a `totalAssets() returns (uint)` body
|
|
117
|
+
// satisfies the ERC-4626 interface and must be subject to the same stub
|
|
118
|
+
// checks as the explicit `uint256` form. Mapping is intentionally narrow:
|
|
119
|
+
// only the two bare aliases — sized variants pass through unchanged.
|
|
120
|
+
normalizeElementaryIntType(name) {
|
|
121
|
+
if (name === 'uint')
|
|
122
|
+
return 'uint256';
|
|
123
|
+
if (name === 'int')
|
|
124
|
+
return 'int256';
|
|
125
|
+
return name;
|
|
126
|
+
}
|
|
127
|
+
bodyCallsBalancePrimitive(body) {
|
|
128
|
+
return this.findDescendant(body, (node) => {
|
|
129
|
+
if (node?.type !== 'FunctionCall')
|
|
130
|
+
return false;
|
|
131
|
+
const expr = node.expression;
|
|
132
|
+
if (!expr)
|
|
133
|
+
return false;
|
|
134
|
+
if (expr.type === 'MemberAccess' && typeof expr.memberName === 'string' && BALANCE_PRIMITIVE_MEMBERS.has(expr.memberName)) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
bodyContainsBalanceShapedAccess(body) {
|
|
141
|
+
return this.findDescendant(body, (node) => {
|
|
142
|
+
if (!node)
|
|
143
|
+
return false;
|
|
144
|
+
// IndexAccess: `_balances[address(this)]` / `tokens[asset]` etc.
|
|
145
|
+
// Any IndexAccess at all is "reading from a storage-shaped data
|
|
146
|
+
// structure" — sufficient signal that the function isn't returning
|
|
147
|
+
// a literal.
|
|
148
|
+
if (node.type === 'IndexAccess')
|
|
149
|
+
return true;
|
|
150
|
+
// MemberAccess to `.balance` — address(this).balance.
|
|
151
|
+
if (node.type === 'MemberAccess' && typeof node.memberName === 'string' && BALANCE_SHAPED_PATTERNS.has(node.memberName)) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
findDescendant(node, predicate) {
|
|
158
|
+
if (!node || typeof node !== 'object')
|
|
159
|
+
return false;
|
|
160
|
+
if (predicate(node))
|
|
161
|
+
return true;
|
|
162
|
+
for (const child of this.childNodes(node)) {
|
|
163
|
+
if (this.findDescendant(child, predicate))
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
childNodes(node) {
|
|
169
|
+
const children = [];
|
|
170
|
+
for (const [key, value] of Object.entries(node)) {
|
|
171
|
+
if (key === 'loc' || key === 'range')
|
|
172
|
+
continue;
|
|
173
|
+
if (Array.isArray(value)) {
|
|
174
|
+
for (const item of value) {
|
|
175
|
+
if (item && typeof item === 'object')
|
|
176
|
+
children.push(item);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (value && typeof value === 'object') {
|
|
180
|
+
children.push(value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return children;
|
|
184
|
+
}
|
|
185
|
+
makeFinding(file, contract, fn) {
|
|
186
|
+
const loc = this.locOf(fn);
|
|
187
|
+
const contractName = contract.name || '<anonymous>';
|
|
188
|
+
const functionName = fn.name || '<anonymous>';
|
|
189
|
+
return {
|
|
190
|
+
file,
|
|
191
|
+
contract: contractName,
|
|
192
|
+
'function': functionName,
|
|
193
|
+
line: loc.line,
|
|
194
|
+
column: loc.column,
|
|
195
|
+
ruleId: RULE_ID,
|
|
196
|
+
pattern: PATTERN,
|
|
197
|
+
severity: 'medium',
|
|
198
|
+
confidence: 'medium',
|
|
199
|
+
category: 'accounting-stub',
|
|
200
|
+
message: `EIP-4626 totalAssets() body contains no balance-read primitive (.balanceOf / .totalSupply / IndexAccess / address.balance). The function appears to return a constant or unbacked state variable — share-price calculations using this value will diverge from on-chain reality, breaking deposit/withdraw accounting and enabling first-depositor inflation attacks.`,
|
|
201
|
+
contractName,
|
|
202
|
+
functionName,
|
|
203
|
+
sourceLocation: loc,
|
|
204
|
+
findingId: '',
|
|
205
|
+
contractHash: '',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
locOf(node) {
|
|
209
|
+
return {
|
|
210
|
+
line: node?.loc?.start?.line || 0,
|
|
211
|
+
column: node?.loc?.start?.column || 0,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.Erc4626TotalassetsStubDetector = Erc4626TotalassetsStubDetector;
|
|
216
|
+
//# sourceMappingURL=erc4626-totalassets-stub.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ScanResult } from '../index';
|
|
2
|
+
export declare class Erc6909BalanceOverflowDetector {
|
|
3
|
+
readonly id = "erc6909-balance-overflow";
|
|
4
|
+
readonly patternKey = "erc6909-balance-overflow";
|
|
5
|
+
readonly supportedAstKinds: "parser"[];
|
|
6
|
+
scanAst(ast: any, file: string): ScanResult[];
|
|
7
|
+
}
|